正弦波をサンプリングしてその周波数成分をプロットしようとしていますが、実装に問題があります。 。最大振幅1、周波数100の正弦波の1サイクルの65536サンプルを取得した結果を以下に示します。ここで、Y軸は複素フーリエ和の大きさであり、x軸はサンプル番号です。 。このプロットから正弦波の周波数を確認するにはどうすればよいですか?サンプル数と振幅ではなく、周波数と振幅のプロットが必要です。

振幅1の大きなスパイクが1つあると予想していました。または、それぞれ振幅0.5の2つのスパイクがありますが、振幅が大きくなっているようです。何が間違っているのかわかりません。

sin(2のFFT * pi * f * t)

Matlabコード:

Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform); 

コメント

  • FFT実装には、多くの場合、$ N $または$ \ sqrt {N} $に比例するゲインがあります。結果は'不合理ではありません。
  • 大きさを$ N $で割ると、それぞれ約0.425の大きさの2つのスパイクが得られます(これは予想される0.5よりもまだ低いです)。 )。x軸をサンプル番号から周波数に変更するにはどうすればよいですか?

回答

見た目両方のサンプリング期間で $ 2 \ pi $ の係数があるため、「ヘルツでの周波数がラジアン/秒で混同されています dt とあなたの信号。あなたが本当に欲しいと思うものを明確にするためにあなたのコードを少し書き直しました。

Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)") 

サンプリング頻度が65536サンプル/秒の場合、たとえば12 KHzのトーンが必要な場合は、次のように作成できます。したがって、ここでのサンプル周期は1/65536秒です。

それぞれが0.5の振幅を持つ2つのスパイクを取得するという期待は次のとおりです。正解-生成されたトーンだけではありませんでした。

x軸をヘルツ単位にスケーリングする場合は、ベクトルを作成するだけです。 FFTの結果と同じポイント数で、 $ -fs / 2 $ から $ + fsへの線形増分/ 2 $ 。プロットで使用したfftshiftにも注意してください。これは、MatlabのFFT関数の出力が0からfsまで直線的になるためです。 DCが中央に配置されていることを視覚化する方が簡単ですが、どちらの方法でも問題ありません。 fftshiftがないと、 faxis ベクトルは0から fs になります。

12KHzトーンのFFT

回答

一部のFFTでは、大きさを「自然に」表すために1 / Nで除算する必要があります(これはエネルギーを保存しません)。 )。 X軸にラベルを付けるには、サンプルレート(Fs)を知っている必要があります。わかっている場合は、f_x = bin_index * Fs / N、最大N / 2で、負の周波数に対してミラーリングされます。スペクトルピーク(入力正弦波)の周波数がFFTの長さ(整数など)で正確に正確に周期的でない場合サイクル数)の場合、最も近いFFT結果ビンの大きさが小さくなり、ビン間を補間して、ピークの大きさに近い推定値を見つける必要があります(放物線またはウィンドウ化されたSincカーネル補間が一般的です)。

回答

hotpaw2の回答にsom式を追加するには:

FFTを使用して、信号の表現を計算しますas

$$ x(t)= \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \、f_k \、t} $$

ここで、$ f_k = \ frac {k} {N} f_s $ for $ k = 0,1、…、N / 2-1 $および$ f_k = \ frac {kN} {N} f_s $ $ k = N / 2、…、N-1 $の場合、$ N $が偶数であると仮定します。

これで、FFTでは、サンプリングステップ$ \ tau = 1 / f_s $でサンプルを取得する必要があります。 、$ x_n = x(n \ tau)$、およびサンプル配列$(x_n)_n $のFFTは、$ \ sum_ {k = 0} ^であるため、スケーリングされた振幅配列$(N \ hat x_k)_k $を与えます。 {N-1} 1 = N $。再スケーリングi ■通常、FFTライブラリのユーザーが処理するFFT実装から除外されます。

回答

FFTはメソッドを提供しますあなたがすでに知っているDFTの計算について。ここで、信号x(n)とそのDFT X(k)について考えます。信号がN(この場合は65536)サンプルで構成されている場合、X(k)は2*pi*k/Nの離散周波数で値を提供します。実際、上記のDFT X(k)は

。したがって、X(1)を見つけている場合は、2 * pi * 1 / Nの離散周波数でDFT係数を見つけていることを意味し、同様に、X(2)は2 * pi * 2 / Nの係数を意味します。各係数は、その周波数が大きい場合、その周波数が信号の主要部分を構成していることを意味します。したがって、周波数に関してfftをプロットするには、サンプル軸を点2*pi*k/Nを持つ周波数軸に置き換えます。ここでk = 0〜65535.FTは時間に関する情報を提供しません。FTは時間に関する情報を提供するだけです。信号。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です