Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
- Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long
- Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
- Private Declare Function DispCallFunc Lib "oleaut32.dll" (ByVal pvInstance As Long, ByVal oVft As Long, ByVal cc As Long, ByVal vtReturn As Integer, ByVal cActuals As Long, ByRef prgvt As Integer, ByRef prgpvarg As Long, ByRef pvargResult As Variant) As Long
- Dim ProcAddresses As Collection
- Dim hDLL As Long
- Public Enum R2RTransformKinds
- HalfComplexDFT = 0
- HalfComplexIDFT = 1
- DHT = 2
- DCT1 = 3
- DCT2 = 5
- DCT3 = 4
- DCT4 = 6
- DST1 = 7
- DST2 = 9
- DST3 = 8
- DST4 = 10
- End Enum
- Public Sub InitFFTW()
- hDLL = LoadLibrary("libfftw3-3.dll")
- Set ProcAddresses = New Collection
- With ProcAddresses
- .Add GetProcAddress(hDLL, "fftw_plan_dft"), "fftw_plan_dft"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_1d"), "fftw_plan_dft_1d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_2d"), "fftw_plan_dft_2d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_3d"), "fftw_plan_dft_3d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_r2c"), "fftw_plan_dft_r2c"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_r2c_1d"), "fftw_plan_dft_r2c_1d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_r2c_2d"), "fftw_plan_dft_r2c_2d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_r2c_3d"), "fftw_plan_dft_r2c_3d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_c2r"), "fftw_plan_dft_c2r"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_c2r_1d"), "fftw_plan_dft_c2r_1d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_c2r_2d"), "fftw_plan_dft_c2r_2d"
- .Add GetProcAddress(hDLL, "fftw_plan_dft_c2r_3d"), "fftw_plan_dft_c2r_3d"
- .Add GetProcAddress(hDLL, "fftw_plan_r2r"), "fftw_plan_r2r"
- .Add GetProcAddress(hDLL, "fftw_plan_r2r_1d"), "fftw_plan_r2r_1d"
- .Add GetProcAddress(hDLL, "fftw_plan_r2r_2d"), "fftw_plan_r2r_2d"
- .Add GetProcAddress(hDLL, "fftw_plan_r2r_3d"), "fftw_plan_r2r_3d"
- .Add GetProcAddress(hDLL, "fftw_execute"), "fftw_execute"
- .Add GetProcAddress(hDLL, "fftw_execute_dft"), "fftw_execute_dft"
- .Add GetProcAddress(hDLL, "fftw_execute_dft_r2c"), "fftw_execute_dft_r2c"
- .Add GetProcAddress(hDLL, "fftw_execute_dft_c2r"), "fftw_execute_dft_c2r"
- .Add GetProcAddress(hDLL, "fftw_execute_r2r"), "fftw_execute_r2r"
- .Add GetProcAddress(hDLL, "fftw_destroy_plan"), "fftw_destroy_plan"
- .Add GetProcAddress(hDLL, "fftw_cleanup"), "fftw_cleanup"
- End With
- End Sub
- Public Sub CloseFFTW()
- FreeLibrary hDLL
- hDLL = 0
- Set ProcAddresses = Nothing
- End Sub
- Private Function CallCDECL(ByVal FuncAddr As Long, ByRef Params() As Variant, ByVal ReturnType As VbVarType) As Variant
- Dim ParamCount As Long
- Dim ParamTypes() As Integer
- Dim ParamPtrs() As Long
- Dim n As Long
- ParamCount = UBound(Params) + 1
- If ParamCount > 0 Then
- ReDim ParamTypes(ParamCount - 1)
- ReDim ParamPtrs(ParamCount - 1)
- For n = 0 To ParamCount - 1
- ParamTypes(n) = VarType(Params(n))
- ParamPtrs(n) = VarPtr(Params(n))
- Next n
- DispCallFunc 0, FuncAddr, 1, ReturnType, ParamCount, ParamTypes(0), ParamPtrs(0), CallCDECL
- Else
- DispCallFunc 0, FuncAddr, 1, ReturnType, ParamCount, ByVal 0, ByVal 0&, CallCDECL
- End If
- End Function
- Public Function PlanDFT(ByVal DimCount As Long, ByRef DimSizes As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Sign As Long, ByVal Flags As Long) As Long
- Dim Params(6 - 1) As Variant
- Params(0) = DimCount
- Params(1) = VarPtr(DimSizes)
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = Sign
- Params(5) = Flags
- PlanDFT = CallCDECL(ProcAddresses("fftw_plan_dft"), Params, vbLong)
- End Function
- Public Function PlanDFT1D(ByVal Length As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Sign As Long, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = Length
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- Params(3) = Sign
- Params(4) = Flags
- PlanDFT1D = CallCDECL(ProcAddresses("fftw_plan_dft_1d"), Params, vbLong)
- End Function
- Public Function PlanDFT2D(ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Sign As Long, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = Height
- Params(1) = Width
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = Sign
- Params(5) = Flags
- PlanDFT2D = CallCDECL(ProcAddresses("fftw_plan_dft_2d"), Params, vbLong)
- End Function
- Public Function PlanDFT3D(ByVal Depth As Long, ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Sign As Long, ByVal Flags As Long) As Long
- Dim Params(7 - 1) As Variant
- Params(0) = Depth
- Params(1) = Height
- Params(2) = Width
- Params(3) = VarPtr(Src)
- Params(4) = VarPtr(Dest)
- Params(5) = Sign
- Params(6) = Flags
- PlanDFT3D = CallCDECL(ProcAddresses("fftw_plan_dft_3d"), Params, vbLong)
- End Function
- Public Function PlanDFTR2C(ByVal DimCount As Long, ByRef DimSizes As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = DimCount
- Params(1) = VarPtr(DimSizes)
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = Flags
- PlanDFTR2C = CallCDECL(ProcAddresses("fftw_plan_dft_r2c"), Params, vbLong)
- End Function
- Public Function PlanDFTR2C1D(ByVal Length As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(4 - 1) As Variant
- Params(0) = Length
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- Params(3) = Flags
- PlanDFTR2C1D = CallCDECL(ProcAddresses("fftw_plan_dft_r2c_1d"), Params, vbLong)
- End Function
- Public Function PlanDFTR2C2D(ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = Height
- Params(1) = Width
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = Flags
- PlanDFTR2C2D = CallCDECL(ProcAddresses("fftw_plan_dft_r2c_2d"), Params, vbLong)
- End Function
- Public Function PlanDFTR2C3D(ByVal Depth As Long, ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(6 - 1) As Variant
- Params(0) = Depth
- Params(1) = Height
- Params(2) = Width
- Params(3) = VarPtr(Src)
- Params(4) = VarPtr(Dest)
- Params(5) = Flags
- PlanDFTR2C3D = CallCDECL(ProcAddresses("fftw_plan_dft_r2c_3d"), Params, vbLong)
- End Function
- Public Function PlanDFTC2R(ByVal DimCount As Long, ByRef DimSizes As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = DimCount
- Params(1) = VarPtr(DimSizes)
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = Flags
- PlanDFTC2R = CallCDECL(ProcAddresses("fftw_plan_dft_c2r"), Params, vbLong)
- End Function
- Public Function PlanDFTC2R1D(ByVal Length As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(4 - 1) As Variant
- Params(0) = Length
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- Params(3) = Flags
- PlanDFTC2R1D = CallCDECL(ProcAddresses("fftw_plan_dft_c2r_1d"), Params, vbLong)
- End Function
- Public Function PlanDFTC2R2D(ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = Height
- Params(1) = Width
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = Flags
- PlanDFTC2R2D = CallCDECL(ProcAddresses("fftw_plan_dft_c2r_2d"), Params, vbLong)
- End Function
- Public Function PlanDFTC2R3D(ByVal Depth As Long, ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal Flags As Long) As Long
- Dim Params(6 - 1) As Variant
- Params(0) = Depth
- Params(1) = Height
- Params(2) = Width
- Params(3) = VarPtr(Src)
- Params(4) = VarPtr(Dest)
- Params(5) = Flags
- PlanDFTC2R3D = CallCDECL(ProcAddresses("fftw_plan_dft_c2r_3d"), Params, vbLong)
- End Function
- Public Function PlanR2R(ByVal DimCount As Long, ByRef DimSizes As Long, ByRef Src As Double, ByRef Dest As Double, ByRef TransformKinds As R2RTransformKinds, ByVal Flags As Long) As Long
- Dim Params(6 - 1) As Variant
- Params(0) = DimCount
- Params(1) = VarPtr(DimSizes)
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = VarPtr(TransformKinds)
- Params(5) = Flags
- PlanR2R = CallCDECL(ProcAddresses("fftw_plan_r2r"), Params, vbLong)
- End Function
- Public Function PlanR2R1D(ByVal Length As Long, ByRef Src As Double, ByRef Dest As Double, ByVal TransformKind As R2RTransformKinds, ByVal Flags As Long) As Long
- Dim Params(5 - 1) As Variant
- Params(0) = Length
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- Params(3) = TransformKind
- Params(4) = Flags
- PlanR2R1D = CallCDECL(ProcAddresses("fftw_plan_r2r_1d"), Params, vbLong)
- End Function
- Public Function PlanR2R2D(ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal TransformKindH As R2RTransformKinds, ByVal TransformKindW As R2RTransformKinds, ByVal Flags As Long) As Long
- Dim Params(7 - 1) As Variant
- Params(0) = Height
- Params(1) = Width
- Params(2) = VarPtr(Src)
- Params(3) = VarPtr(Dest)
- Params(4) = TransformKindH
- Params(5) = TransformKindW
- Params(6) = Flags
- PlanR2R2D = CallCDECL(ProcAddresses("fftw_plan_r2r_2d"), Params, vbLong)
- End Function
- Public Function PlanR2R3D(ByVal Depth As Long, ByVal Height As Long, Width As Long, ByRef Src As Double, ByRef Dest As Double, ByVal TransformKindD As R2RTransformKinds, ByVal TransformKindH As R2RTransformKinds, ByVal TransformKindW As R2RTransformKinds, ByVal Flags As Long) As Long
- Dim Params(9 - 1) As Variant
- Params(0) = Depth
- Params(1) = Height
- Params(2) = Width
- Params(3) = VarPtr(Src)
- Params(4) = VarPtr(Dest)
- Params(5) = TransformKindD
- Params(6) = TransformKindH
- Params(7) = TransformKindW
- Params(8) = Flags
- PlanR2R3D = CallCDECL(ProcAddresses("fftw_plan_r2r_3d"), Params, vbLong)
- End Function
- Public Sub FFTWExecute(ByVal Plan As Long)
- Dim Params(0) As Variant
- Params(0) = Plan
- CallCDECL ProcAddresses("fftw_execute"), Params(), vbEmpty
- End Sub
- Public Sub FFTWExecuteDFT(ByVal Plan As Long, ByRef Src As Double, ByRef Dest As Double)
- Dim Params(3 - 1) As Variant
- Params(0) = Plan
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- CallCDECL ProcAddresses("fftw_execute_dft"), Params(), vbEmpty
- End Sub
- Public Sub FFTWExecuteDFTR2C(ByVal Plan As Long, ByRef Src As Double, ByRef Dest As Double)
- Dim Params(3 - 1) As Variant
- Params(0) = Plan
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- CallCDECL ProcAddresses("fftw_execute_dft_r2c"), Params(), vbEmpty
- End Sub
- Public Sub FFTWExecuteDFTC2R(ByVal Plan As Long, ByRef Src As Double, ByRef Dest As Double)
- Dim Params(3 - 1) As Variant
- Params(0) = Plan
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- CallCDECL ProcAddresses("fftw_execute_dft_c2r"), Params(), vbEmpty
- End Sub
- Public Sub FFTWExecuteR2R(ByVal Plan As Long, ByRef Src As Double, ByRef Dest As Double)
- Dim Params(3 - 1) As Variant
- Params(0) = Plan
- Params(1) = VarPtr(Src)
- Params(2) = VarPtr(Dest)
- CallCDECL ProcAddresses("fftw_execute_r2r"), Params(), vbEmpty
- End Sub
- Public Sub FFTWDestroyPlan(ByVal Plan As Long)
- Dim Params(0) As Variant
- Params(0) = Plan
- CallCDECL ProcAddresses("fftw_destroy_plan"), Params(), vbEmpty
- End Sub
- Public Sub FFTWCleanup()
- Dim Params(-1 To -1) As Variant
- CallCDECL ProcAddresses("fftw_cleanup"), Params(), vbEmpty
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement