C# VS2019 調用FFTW FFT計算

 申請空間時,請使用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;
        }

    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章