※ ChatGPTを利用し、要約された質問です(原文:FFTがうまくできない)
FFTがうまくできない
このQ&Aのポイント
FFT(高速フーリエ変換)がうまく機能しない問題について
ローパスフィルタをプログラムで実現する際、FFT(高速フーリエ変換)を使用していますが、うまく機能しません。
具体的には、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]までに値を入れればよいのですよね。
よろしくお願いします。
お礼
有り難うございます。 お礼遅くなってしまって申し訳ありません。 それで確かに誤差がなくなりました。