こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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]までに値を入れればよいのですよね。

よろしくお願いします。

投稿日時 - 2011-03-02 06:57:23

QNo.6561300

困ってます

質問者が選んだベストアンサー

よく見てないけど,スケーリングするのを忘れてるような...
if(abs(FFTBuffer[i]-data[i])>0.01)
じゃなくて
if(abs(FFTBuffer[i]*(2.0/bufferSize)-data[i])>0.01)
で判定したらどうなる?

投稿日時 - 2011-03-02 10:25:26

お礼

有り難うございます。
お礼遅くなってしまって申し訳ありません。
それで確かに誤差がなくなりました。

投稿日時 - 2011-03-09 21:04:43

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#1 で正解のようですね... って, ちゃんとコードに書いてあるし orz

投稿日時 - 2011-03-03 11:56:16

ANo.2

せめて何がどう「うまくいかない」のかくらいは書いてくれないかなぁ?

「テーブル初期化」のところで何をやっているのかさっぱりわからん. あと, 「memset で初期化」はあんまりよくない.

投稿日時 - 2011-03-02 11:53:32

お礼

memsetの部分はfor初期化にしました。
有り難うございます。
#3と併せてお礼させてください。

投稿日時 - 2011-03-09 21:05:58