Suche Hilfe um FFTW3 unter Windows/Mac zum Laufen zu kriegen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Suche Hilfe um FFTW3 unter Windows/Mac zum Laufen zu kriegen

Beitrag von NicTheQuick »

Hi Leute,

ich habe eben einen kleinen Wrapper für FFTW3 geschrieben, der aber noch nicht vollständig ist.
Kann mal jemand für mich ausprobieren, was man unter Windows tun muss, damit der Import funktioniert? Ich will das in naher Zukunft in Codes, Tipps und Tricks setzen. Und da wäre es natürlich vorteilhaft, wenn es nicht nur unter Linux funktioniert.
Hier ist die Installationsanleitung für Windows: Windows Installation Notes

Code: Alles auswählen

; Die Funktionen für verschiedene Datentypen haben die folgenden Präfixe
; Double		: fftw_
; Float			: fftwf_
; Long Double	: fftwl_
; Quad			: fftwq_

Macro size_t
	i
EndMacro

Macro DQ
	"
EndMacro

#FFTW_FORWARD = -1
#FFTW_BACKWARD = 1

#FFTW_NO_TIMELIMIT = -1.0

; documented flags
#FFTW_MEASURE = (0)
#FFTW_DESTROY_INPUT   = (1 << 0)
#FFTW_UNALIGNED       = (1 << 1)
#FFTW_CONSERVE_MEMORY = (1 << 2)
#FFTW_EXHAUSTIVE      = (1 << 3) ; NO_EXHAUSTIVE is Default
#FFTW_PRESERVE_INPUT  = (1 << 4) ; cancels FFTW_DESTROY_INPUT
#FFTW_PATIENT         = (1 << 5) ; IMPATIENT is Default
#FFTW_ESTIMATE        = (1 << 6)
#FFTW_WISDOM_ONLY     = (1 << 21)

; undocumented beyond-guru flags
#FFTW_ESTIMATE_PATIENT       = (1 << 7)
#FFTW_BELIEVE_PCOST          = (1 << 8)
#FFTW_NO_DFT_R2HC            = (1 << 9)
#FFTW_NO_NONTHREADED         = (1 << 10)
#FFTW_NO_BUFFERING           = (1 << 11)
#FFTW_NO_INDIRECT_OP         = (1 << 12)
#FFTW_ALLOW_LARGE_GENERIC    = (1 << 13) ; NO_LARGE_GENERIC is Default
#FFTW_NO_RANK_SPLITS         = (1 << 14)
#FFTW_NO_VRANK_SPLITS        = (1 << 15)
#FFTW_NO_VRECURSE            = (1 << 16)
#FFTW_NO_SIMD                = (1 << 17)
#FFTW_NO_SLOW                = (1 << 18)
#FFTW_NO_FIXED_RADIX_LARGE_N = (1 << 19)
#FFTW_ALLOW_PRUNING          = (1 << 20)

Macro fftwDefineApi(X, R, library)

	Structure X#_complexArray
		R.R[2]
	EndStructure
	Structure X#_complex
		StructureUnion
			R.R[2]
			c.X#_complexArray[0]
		EndStructureUnion
	EndStructure
	Structure X#_plan
	EndStructure
	Structure X#_iodim
		n.l
		is.l
		os.l
	EndStructure
	Structure X#_iodim64
		n.i
		is.i
		os.i
	EndStructure
	Structure X#_R
		R.R[0]
	EndStructure
	ImportC DQ#-l#library#DQ
		X#_execute(*p.X#_plan) ;return void
		X#_plan_dft.i(rank.l, *n.Long,
		              *in.X#_complex, *out.X#_complex, sign.l, flags.l) ;return *X#_plan
		X#_plan_dft_1d.i(n.l, *in.X#_complex, *out.X#_complex, sign.l,
		                 flags.l) ;return *X#_plan
		X#_plan_dft_2d.i(n0.l, n1.l,
		                 *in.X#_complex, *out.X#_complex, sign.l, flags.l) ;return *X#_plan
		X#_plan_dft_3d.i(n0.l, n1.l, n2.l,
		                 *in.X#_complex, *out.X#_complex, sign.l, flags.l) ;return *X#_plan
		X#_plan_many_dft.i(rank.l, *n.Long,
		                 howmany.l,
		                 *in.X#_complex, *inembed.Long,
		                 istride.l, idist.l,
		                 *out.X#_complex, *onembed.Long,
		                 ostride.l, odist.l,
		                 sign.l, flags.l) ;return *X#_plan
		X#_plan_guru_dft.i(rank.l, *dims.X#_iodim,
		                   howmany_rank.l,
		                   *howmany_dims.X#_iodim,
		                   *ri.x#_R, *ii.x#_R, *ro.x#_R, *io.x#_R,
		                   flags.l) ;return *X#_plan
		X#_plan_guru_split_sft.i(rank.l, *dims.X#_iodim,
		                         howmany_rank.l,
		                         *howmany_dims.X#_iodim,
		                         *ri.x#_R, *ii.x#_R, *ro.x#_R, *io.x#_R,
		                         flags.l) ;return *X#_plan
		X#_plan_guru64_dft.i(rank.l,
		                     *dims.X#_iodim64,
		                     howmany_rank.l,
		                     *howmany_dims.X#_iodim64,
		                     *in.X#_complex, *out.X#_complex,
		                     sign.l, flags.l) ;return *X#_plan
		X#_plan_guru64_split_dft.i(rank.l,
		                           *dims.X#_iodim64,
		                           howmany_rank.l,
		                           *howmany_dims.X#_iodim64,
		                           *ri.x#_R, *ii.x#_R, *ro.x#_R, *io.x#_R,
		                           flags.l) ;return void
		X#_execute_dft(*p.X#_plan, *in.X#_complex, *out.X#_complex)
		X#_execute_split_dft(*p.X#_plan, *ri.x#_R, *ii.x#_R,
		                     *ro.x#_R, *io.x#_R) ;return void
		
		X#_destroy_plan(*p.X#_plan) ;return void
		X#_forget_wisdom() ;return void
		X#_cleanup() ;return void
		
		X#_set_timelimit(t.d) ;return void
		
		X#_malloc.i(n.size_t) ;return pointer
		X#_alloc_real.i(n.size_t) ;return X#_R
		X#_alloc_complex.i(n.size_t) ;return X#_complex
		
		X#_free(*p)
	EndImport

EndMacro

fftwDefineApi(fftw, d, fftw3)
fftwDefineApi(fftwf, f, fftw3f)

EnableExplicit

CompilerIf #PB_Compiler_IsMainFile

	OpenConsole()
	
	#n = 32
	
	Define.fftw_complex *in, *out
	Define.fftw_plan *plan
	
	*in = fftw_malloc(SizeOf(fftw_complex) * #n)
	*out = fftw_malloc(SizeOf(fftw_complex) * #n)
	
	Define time.i = ElapsedMilliseconds()
	*plan = fftw_plan_dft_1d(#n, *in, *out, #FFTW_FORWARD, #FFTW_MEASURE)
	time = ElapsedMilliseconds() - time
	PrintN("Plan: " + time + " ms")
	
	Define i.i
	For i = 0 To #n - 1
		*in\c[i]\d[0] = Cos(2 * #PI * i / #n)
		*in\c[i]\d[1] = Sin(2 * #PI * i / #n)
		PrintN(RSet(Str(i), 5, " ") + " = " + StrD(*in\c[i]\d[0]))
	Next
	
	time = ElapsedMilliseconds()
	fftw_execute(*plan)
	time = ElapsedMilliseconds() - time
	PrintN("Execute: " + time + " ms")

	
	For i = 0 To #n - 1
		PrintN(RSet(Str(i), 5, " ") + " = " + RSet(StrD(*out\c[i]\d[0], 5), 10, " ") + " + " + RSet(StrD(*out\c[i]\d[1], 5), 10, " ") + "i")
	Next
	
	fftw_destroy_plan(*plan)
	fftw_free(*in)
	fftw_free(*out)
	
	PrintN("Press any key...")
	Input()
	
	CloseConsole()

CompilerEndIf
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Suche Hilfe um FFTW3 unter Windows zum Laufen zu kriegen

Beitrag von edel »

ändere den Code so ab :

Code: Alles auswählen

   CompilerIf #PB_Compiler_OS = #PB_OS_Linux
      ImportC DQ#-l#library#DQ
   CompilerElse
        Debug DQ#library#.lib#DQ
      Import DQ#library#.lib#DQ
   CompilerEndIf  
Unter Windows muessen noch die Importbibliotheken erstellt werden:

Code: Alles auswählen

C:\Program Files (x86)\PureBasic\Compilers\polib.exe /DEF:libfftw3l-3.def /MACHINE:X86 /OUT:fftw3l.lib
C:\Program Files (x86)\PureBasic\Compilers\polib.exe /DEF:libfftw3f-3.def /MACHINE:X86 /OUT:fftw3f.lib
C:\Program Files (x86)\PureBasic\Compilers\polib.exe /DEF:libfftw3-3.def /MACHINE:X86 /OUT:fftw3.lib

Ausgabe:

Code: Alles auswählen

Plan: 4 ms
    0 = 1
    1 = 0.9807852804
    2 = 0.9238795325
    3 = 0.8314696123
    4 = 0.7071067812
    5 = 0.555570233
    6 = 0.3826834324
    7 = 0.195090322
    8 = 0
    9 = -0.195090322
   10 = -0.3826834324
   11 = -0.555570233
   12 = -0.7071067812
   13 = -0.8314696123
   14 = -0.9238795325
   15 = -0.9807852804
   16 = -1
   17 = -0.9807852804
   18 = -0.9238795325
   19 = -0.8314696123
   20 = -0.7071067812
   21 = -0.555570233
   22 = -0.3826834324
   23 = -0.195090322
   24 = -0
   25 = 0.195090322
   26 = 0.3826834324
   27 = 0.555570233
   28 = 0.7071067812
   29 = 0.8314696123
   30 = 0.9238795325
   31 = 0.9807852804
Execute: 0 ms
    0 =   -0.00000 +    0.00000i
    1 =   16.00000 +   -0.00000i
    2 =    0.00000 +    0.00000i
    3 =   -0.00000 +    0.00000i
    4 =    0.00000 +   -0.00000i
    5 =   -0.00000 +    0.00000i
    6 =    0.00000 +    0.00000i
    7 =   -0.00000 +    0.00000i
    8 =    0.00000 +   -0.00000i
    9 =    0.00000 +   -0.00000i
   10 =   -0.00000 +   -0.00000i
   11 =    0.00000 +    0.00000i
   12 =    0.00000 +    0.00000i
   13 =   -0.00000 +    0.00000i
   14 =    0.00000 +   -0.00000i
   15 =    0.00000 +    0.00000i
   16 =   -0.00000 +    0.00000i
   17 =    0.00000 +   -0.00000i
   18 =    0.00000 +    0.00000i
   19 =   -0.00000 +   -0.00000i
   20 =    0.00000 +   -0.00000i
   21 =    0.00000 +   -0.00000i
   22 =   -0.00000 +    0.00000i
   23 =    0.00000 +    0.00000i
   24 =    0.00000 +    0.00000i
   25 =   -0.00000 +   -0.00000i
   26 =    0.00000 +   -0.00000i
   27 =   -0.00000 +   -0.00000i
   28 =    0.00000 +    0.00000i
   29 =   -0.00000 +   -0.00000i
   30 =    0.00000 +   -0.00000i
   31 =   16.00000 +    0.00000i
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Suche Hilfe um FFTW3 unter Windows zum Laufen zu kriegen

Beitrag von NicTheQuick »

Cool, Danke! :allright:

Edit: Achja, die libfftwl und libfftwq braucht man gar nicht erst hinzuzufügen. Long Doubles und 128-Bit Floats hat Purebasic nämlich nicht. :wink:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Suche Hilfe um FFTW3 unter Windows/Mac zum Laufen zu kri

Beitrag von NicTheQuick »

Da wir schon dabei sind. Was muss ich für Macs beachten?
Antworten