申請空間時,請使用GCHandle.Alloc,這裏只是調用DLL,並沒有將其靜態連接的 .lib 文件
將libfftw3-3.dll 文件放到項目中
//申請空間
//IntPtr In_intPtr= FFT.malloc(N_FFT*8);
//IntPtr Out_intPtr= FFT.malloc(N_FFT * 8*2);
GCHandle In_intPtr = GCHandle.Alloc(DataIn_y1, GCHandleType.Pinned);
GCHandle Out_intPtr = GCHandle.Alloc(fftw_Complex, GCHandleType.Pinned);
//正變換
IntPtr plan = FFT.plan_r2c_ld(N_FFT, In_intPtr.AddrOfPinnedObject(), Out_intPtr.AddrOfPinnedObject(), 0);
//執行變換
FFT.execute(plan);//可能重複執行,
FFT.execute(plan);
//釋放輸入輸出數組
FFT.destroy_plan(plan);
//釋放空間
In_intPtr.Free();
Out_intPtr.Free();
TTF
public class FFT
{
#region FFTW 庫調用申明
/// <summary>
/// Allocates FFTW-optimized unmanaged memory
/// </summary>
/// <param name="length">Amount to allocate, in bytes</param>
/// <returns>Pointer to allocated memory</returns>
[DllImport("libfftw3-3.dll", EntryPoint = "fftw_malloc", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr malloc(int length);
/// <summary>
/// 釋放內存空間
/// </summary>
/// <param name="length">指針</param>
[DllImport("libfftw3-3.dll", EntryPoint = "fftw_free", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void free(IntPtr length);
/// <summary>
/// 一維實數據的DFT,正變換
/// </summary>
/// <param name="n">數據個數</param>
/// <param name="In">double 實數輸入</param>
/// <param name="Out">fftw_complex 複數輸出</param>
/// <param name="flags">FFTW_MEASURE 0</param>
/// <returns></returns>
[DllImport("libfftw3-3.dll", EntryPoint = "fftw_plan_dft_r2c_1d", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr plan_r2c_ld(int n, IntPtr In, IntPtr Out, int flags);
/// <summary>
/// 一維實數據的DFT,逆變換
/// </summary>
/// <param name="n">數據個數</param>
/// <param name="In">fftw_complex 複數輸入</param>
/// <param name="Out">double 實數輸出</param>
/// <param name="flags">FFTW_MEASURE 0</param>
/// <returns></returns>
[DllImport("libfftw3-3.dll", EntryPoint = "fftw_plan_dft_c2r_1d", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr plan_c2r_ld(int n, IntPtr In, IntPtr Out, int flags);
/// <summary>
/// 執行變換
/// </summary>
/// <param name="length"></param>
[DllImport("libfftw3-3.dll", EntryPoint = "fftw_execute", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void execute(IntPtr plan);
/// <summary>
/// 不使用Plan,將其和輸入輸出數組銷燬
/// </summary>
/// <param name="length"></param>
[DllImport("libfftw3-3.dll", EntryPoint = "fftw_destroy_plan", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void destroy_plan(IntPtr plan);
//這裏還涉及到一個代理 GCHandle (using System.Runtime.InteropServices)他可以幫我們在地址和對象之間進行轉換
// IntPtr plan;
// double[] fin = new double[nx * ny * 2];
// GCHandle hin = GCHandle.Alloc(fin, GCHandleType.Pinned);
//// plan = FFT.dft_2d(nx, ny, hin.AddrOfPinnedObject(), hin.AddrOfPinnedObject(), fftw_direction.Forward, fftw_flags.Estimate);
#endregion
//-----定義複數結構體-----------------------//
public struct Compx
{
/// <summary>
/// 實部
/// </summary>
public float real;
/// <summary>
/// 虛部
/// </summary>
public float imag;
}
}