偶数および奇数のFFT長の周波数軸を作成する方法は?


12

周波数軸を負の周波数から正の周波数(ヘルツ単位)に変換する方法についてヘルプを得ることができますか?MATLABで作成するのに問題があります。(サンプリング周波数f_sを知っていると仮定します)。


1
単位円の周りに等間隔で配置されている周波数について考えるのに役立ちます。4ポイントFFTの周波数ビンは[0 / 4fs、1 / 4fs、2 / 4fs、3 / 4fs]で、たとえば[0、fs / 4、fs / 2、-fs / 4]。3ポイントFFTの周波数ビンは[0 / 3fs、1 / 3fs、2 / 3fs]であるか、[0、fs / 3、-fs / 3]として記述できます。ナイキスト周波数に対するこの等間隔スキップは、奇数サイズのために、しかし常に0含ま
endolith

@endolithこのアナロジーは私を非常に助けてくれました、ありがとうございました!
マークルモワン

回答:


5

1つの方法は、シフトされていないDFT出力の周波数ベクトル(つまり、MATLABのfft()関数から直接取得するもの)を計算してからfftshift()、軸の負側の位置に対応する周波数を再マッピングすることです。例:

% assume input signal "x", sampling frequency "fs"
% calculate FFT
X = fft(x,Nfft);
% calculate frequency spacing
df = fs / Nfft;
% calculate unshifted frequency vector
f = (0:(Nfft-1))*df;
% move all frequencies that are greater than fs/2 to the negative side of the axis
f(f >= fs/2) = f(f >= fs/2) - fs;
% now, X and f are aligned with one another; if you want frequencies in strictly
% increasing order, fftshift() them
X_normal_order = fftshift(X);
f_normal_order = fftshift(f);

learnvstが提供する答えも機能するはずです。これは、偶数/奇数のDFTサイズに特別なケーシングを必要としない、別の考え方です。


JasonRこんにちは。fs= 1000およびNfft = 256で試してみると、f_normal_orderが正の数で始まり、負になり、その後再び正になるため、このコードが機能していることは確かです。また、長さが一致していません。
-TheGrapeBeyond

申し訳ありませんが、コード内のいくつかのタイプミスを修正しました。これで動作するはずです。
ジェイソンR

9

正の周波数スペクトルを簡単に作成できます(ここfsで、サンプリングレートとNFFTfftビンの数)。FFTアルゴリズムのMatlab実装では、最初の要素は常にDC成分であるため、配列がゼロから始まる理由です。これは、NFFTの奇数値と偶数値に当てはまります。

%//Calculate frequency axis
df = fs/NFFT;
fAxis = 0:df:(fs-df);

周波数スペクトルをラップする必要がある場合は、奇数のNFFTがあるかどうかを考慮する必要があります。常にDCコンポーネントが必要です。。

df = fs/NFFT;
fAxis = (0:df:(fs-df)) - (fs-mod(NFFT,2)*df)/2;

正の周波数軸の計算が上記と同じですが、FFTシフトされた項が偶数または奇数のFFT長に対応するように変化することに注意してください。

これらのコードスニペットは、SOに投稿された(おもしろいと思うかもしれない)長い回答から取られました:https : //stackoverflow.com/questions/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983#9699983


さて、それで奇数NFFTにもこれを使用できますか?
TheGrapeBeyond

あ、ごめんなさい。-veから+ veの周波数に変更すると、わずかな問題が発生します。答えを少し変更しました。
-learnvst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.