私の問題は、逆fftに基づいて振幅スペクトル(fft)から元の信号を取得することですが、たとえば、一部の周波数範囲に対してのみです。8〜12Hz。誰か助けてもらえますか?私は使用しようとします:
xdft=fft(x);
ixdft=ifft(xdft(a:b)), %where xdft(a:b) is |Y(f)| for freq 8-12 Hz.
しかし、それは機能したくありません。
必要な値を除いて、のすべての値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つの変数の使用を完全に省略し、論理インデックスを選択したことに注意してくださいa
。b
これFs
がサンプルレートです。