FFTは、時間領域の関数を周波数領域で示される関数に変更することを知っています。
ただし、周波数領域でグラフをプロットしようとすると、時間ではなくX軸を使用して適切に動作するようになります。
また、Y軸を特定の整数で除算することによって、元の信号の振幅と一致する振幅のみを取得できます。何故ですか?
これが私のコードです
t=0:0.001:2
x=2*sin(20*pi*t) + sin(100*pi*t)
subplot(2,1,1)
plot(1000*t,x)
grid
xlabel("Time in milliseconds")
ylabel("Signal amplitude")
subplot(2,1,2)
y=fft(x)
plot(1000*t,abs(y))
xlabel("Frequency")
ylabel("Signal amplitude")
およびグラフ。
助けてください=(
FFTによって生成される各値の頻度は、出力値のインデックスに線形的に関連しています。
_f(i) = (i-1)*sampling_frequency/N
_
NはFFTポイントの数です(つまり、N=length(y)
)。あなたの場合、_N=2001
_。
t
の定義からサンプリング周波数を1/Tとして差し引くことができます。ここで、Tはサンプリング時間間隔です(この例ではT = 0.001)。したがって、サンプリング周波数は1000Hzです。
t(i)
の値もインデックスi
に線形に関連しているため、
_t(i) = (i-1)*0.001
_
_f = 1000*t*sampling_frequency/N
_を定義することは可能ですが(コードがわかりにくくなるため、必ずしも必要ではありません)。 _sampling_frequency/N
_項が欠落していることに注意してください。これにより、間違った周波数でトーンが表示されます(x
の定義から、10Hzと50Hzにピークがあり、990Hzと950Hz)。
観測された関係は近似値にすぎないため、以下は数学的な証明ではなく、時間領域のトーン振幅と周波数領域のピーク値の間の関係を視覚化するための直感的な方法にすぎないことに注意してください。
問題を単一のトーンに単純化する:
_x = A*sin(2*pi*f*t)
_
対応するピークのおおよその振幅は、 Parsevalの定理 を使用して導き出すことができます。
時間領域(方程式の左側)では、式は0.5*N*(A^2)
にほぼ等しくなります。
周波数領域(方程式の右側)で、次の仮定を行います。
f
および対応するエイリアス周波数_sampling_frequency-f
_)のみに含まれます(他のすべてのビンは〜0)。これは通常、トーン周波数が_sampling_frequency/N
_の正確な(またはほぼ正確な)倍数である場合にのみ保持されることに注意してください。右側の式は、周波数k
のピークに対応するf
の値について、2*(1/N)*abs(X(k))^2
とほぼ等しくなります。
2つをまとめるとabs(X(k)) ~ 0.5*A*N
が生成されます。言い換えれば、出力振幅は、あなたが観察したように、時間領域の振幅に関して_0.5*N
_(または、あなたの場合は約1000)のスケーリング係数を示します。
この考え方は、依然として複数のトーンに適用されます(ただし、無視できるスペクトルリークの仮定は最終的に崩壊します)。
他の回答から、この例には950Hzと990Hzの周波数応答があることが示唆されています。これは、FFTコードがインデックスを使用する方法についての誤解です。これらの「高周波」スパイクは、実際には-50Hzおよび-10Hzです。
周波数領域は、-N/2 * sampling_frequency/Nから+ N/2 * sampling_frequency/Nに拡張されます。しかし、歴史的な理由から、慣例では、最初のN/2個の情報は正の周波数であり、中間点はゼロ周波数であり、最後のN/2個の情報は逆の順序で負の周波数です。パワースペクトルの場合、最初の1 + N/2個以上の情報を表示する必要はありません。
この規則は、私がPress et al。何年も前にFFTを初めて使用したときに、数値レシピとFast Hartley変換を手作業でコーディングし、Cleve Molerが一部のlucky博士課程学生:-)