0

私の問題は、逆fftに基づいて振幅スペクトル(fft)から元の信号を取得することですが、たとえば、一部の周波数範囲に対してのみです。8〜12Hz。誰か助けてもらえますか?私は使用しようとします:

xdft=fft(x); 
ixdft=ifft(xdft(a:b)), %where xdft(a:b) is |Y(f)| for freq 8-12 Hz.

しかし、それは機能したくありません。

4

1 に答える 1

3

必要な値を除いて、のすべての値xdftをゼロに設定できます。

xdft = fft(x);
xdft = xdft(1:ceil(length(xdft) / 2));
xdft(1:a) = 0;
xdft(b+1:end) = 0;
ixdft = ifft(xdft, 'symmetric');

元のFFTデータの半分だけを取得した理由は、結果がFs / 2(Fsはサンプルレート)に関して対称になるためです。同じことを行わない場合は、センターでは、複雑な信号が出力されます。両側で同じことを手動で行う代わりに、片側を修正して、ifft渡したものの鏡像を追加して、全周波数範囲のデータを再構築する必要があることを伝えました。これは、オプションを指定して呼び出すことによって行われ'symmetric'ます。

aある周波数に対して何をすべきかを理解する必要がある場合bは、最初にFFTを実行した周波数のベクトルを作成し、次に次のように範囲内にある周波数を見つけることができます。

xdft = fft(x);
xdft = xdft(1:ceil(length(xdft) / 2));
f = linspace(0, Fs / 2, length(xdft));
keepInd = f >= 8 & f <= 12; % Keep frequencies between 8 and 12 Hz
xdft(~keepInd) = 0;

この例では、実際には2つの変数の使用を完全に省略し、論理インデックスを選択したことに注意してくださいabこれFsがサンプルレートです。

于 2013-03-26T17:16:47.843 に答える