FFTがうまくできない
今ローパスフィルタをプログラムで実現したいなと考えとりあえず
フーリエ→逆フーリエでちゃんと元に戻るかをやっているのですがうまくいきません
コードは以下の通りです
FFTBuffer,FFTSinTableはdouble*
FFTWorkBufferはint*
bufferSizeはintです。
void Initialize(int size)
{
for( bufferSize=2;bufferSize<size;bufferSize<<=1);//バッファサイズを2^nに
bufferSize *=2;//二倍いる
if(FFTBuffer!=NULL)
{
delete[] FFTBuffer;
delete[] FFTWorkBuffer;
delete[] FFTSinTable;
}
FFTBuffer = new double[bufferSize];
FFTWorkBuffer =new int[2+sqrt(bufferSize/2.0)+10];
FFTSinTable = new double[bufferSize/2-1+10];
DestBuffer = new double[bufferSize];
//テーブル初期化
FFTWorkBuffer[0] = 0;
rdft(bufferSize,1,FFTBuffer,FFTWorkBuffer,FFTSinTable);
}
//ここからが別関数の実行部ですdataはcli::array<double,1>^型です。
if(bufferSize < data->Length*2)Initialize(data->Length);//今のバッファの半分までで収まらないため拡張
memset(FFTBuffer,0,bufferSize*sizeof(double));//初期化
//型が違うからforで回そう
for(int i=0;i<data->Length;i++)FFTBuffer[i]=(data[i]);
rdft(bufferSize,1,FFTBuffer,FFTWorkBuffer,FFTSinTable);
rdft(bufferSize,-1,FFTBuffer,FFTWorkBuffer,FFTSinTable);
cli::array<double,1>^ tdata=gcnew cli::array<double,1>(data->Length);
for(int i=0;i<tdata->Length;i++)
tdata[i]=FFTBuffer[i];
for(int i=0;i<data->Length;i++)
if(abs(FFTBuffer[i]-data[i])>0.01)
{
printf("error");
}
rdftはhttp://www.kurims.kyoto-u.ac.jp/~ooura/fft-j.htmlのを使用しています
data->Lengthが二の冪乗でない物も想定しています。
実際テストデータは500個の一周期sin波です。
cli::arrayはデバッグしやすいので移しています。
rdftは入力関数はa[0...n/2]までに値を入れればよいのですよね。
よろしくお願いします。
お礼
丁寧な回答ありがとうございました。