FFTWを使う

 投稿者:しばっち  投稿日:2016年 7月 9日(土)10時06分1秒
  FFTWを使う

高速なFFTライブラリーFFTWを補助ルーチン(fftw.dll)を用いて呼び出します。
下記よりコンパイル済みFFTWライブラリーFFTW 3.3.4(32bit版)をダウンロードしてください


実行には、libfftw3-3.dllを使用します。
libfftw3-3.dllをbasic.exeと同じフォルダに入れてください。
(libfftw3f-3.dll 及び libfftw3l-3.dll は使用していません)

OPTION ARITHMETIC NATIVE
OPTION CHARACTER BYTE
OPTION BASE 0
!'LET N=2^20
LET N=1000000 !'2のペキ乗(2^n)でなくてもいい。
!'DIM RR(N),II(N)
LET T=TIME
LET RE$=REPEAT$(CHR$(0),N*8)
LET IM$=REPEAT$(CHR$(0),N*8)
FOR I=0 TO N-1
!' LET RR(I)=I
!' LET II(I)=0
!' LET RE$(8*I+1:8*I+8)=PACKDBL$(RR(I)) !'実部
!' LET IM$(8*I+1:8*I+8)=PACKDBL$(II(I)) !'虚部
   LET RE$(8*I+1:8*I+8)=PACKDBL$(I)
NEXT I
PRINT TIME-T;"秒"
LET T=TIME
CALL FFTW(N,RE$,IM$,0) !'変換
PRINT TIME-T;"秒"
LET T=TIME
CALL FFTW(N,RE$,IM$,-1) !'逆変換
PRINT TIME-T;"秒"
!'FOR I=0 TO N-1
!'   LET RR(I)=INT(UNPACKDBL(RE$(8*I+1:8*I+8))/N+.5)
!'   LET II(I)=INT(UNPACKDBL(IM$(8*I+1:8*I+8))/N+.5)
!'   PRINT RR(I);II(I)
!'NEXT I
END

EXTERNAL SUB FFTW(N,RE$,IM$,SW)
OPTION ARITHMETIC NATIVE
ASSIGN "fftw.dll","fftwsub"
END SUB
--------------------------------------------------------------------------------------
                                    fftw.cpp

#include <cstdlib>
#include <fftw3.h>
using namespace std;

#pragma comment(lib, "libfftw3-3.lib")
// #pragma comment(lib, "libfftw3f-3.lib")
// #pragma comment(lib, "libfftw3l-3.lib")

extern "C" __declspec(dllexport) void fftwsub(int n,double *re,double *im,int sw)
{
  int i;
  fftw_complex *a, *b;
  fftw_plan plan;
  a= (fftw_complex *) fftw_malloc(sizeof(fftw_complex) * n);
  b= (fftw_complex *) fftw_malloc(sizeof(fftw_complex) * n);
  if (a==NULL || b==NULL) exit(1);

if (sw==0)
  plan = fftw_plan_dft_1d(n, a, b, FFTW_FORWARD , FFTW_ESTIMATE);
else
  plan = fftw_plan_dft_1d(n, a, b, FFTW_BACKWARD, FFTW_ESTIMATE);

   for(i = 0;i<n;i++){
      a[i][0] = re[i];
      a[i][1] = im[i];
            }
fftw_execute(plan);
   for(i = 0;i<n;i++){
      re[i]=b[i][0];
      im[i]=b[i][1];
            }
fftw_destroy_plan(plan);
fftw_free(a);
fftw_free(b);
}
 

戻る