如何使频率轴具有偶数和奇数FFT长度?


12

我能否获得有关如何使频率轴从负频率变为正频率(以赫兹为单位)的帮助,这将成为FFT结果中的x轴,但是给定了偶数长度FFT或奇数长度FFT。我在使用MATLAB时遇到了一些麻烦。(假设您知道采样频率f_s)。


1
它可以帮助您考虑频率在单位圆上等距分布。例如,四点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这个类比极大地帮助了我,非常感谢!
Mark LeMoine '19

Answers:


5

一种方法是简单地计算未移位DFT输出的频率向量(即,您fft()不做即可直接从MATLAB 函数获得的结果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);

learningvst提供的答案也应该起作用。这只是考虑的另一种方式,对于偶数/奇数DFT大小不需要任何特殊的大小写。


您好JasonR,确定该代码是否有效,因为如果我尝试使用fs = 1000和Nfft = 256进行操作,则我得到的f_normal_order将从正数开始,然后变为负数,然后再变为正数。长度也不匹配。
TheGrapeBeyond'July

抱歉,修复了代码中的一些错字。现在应该可以工作了。
詹森·R

9

您可以非常简单地制作一个正频谱(fs采样率NFFT是fft箱的数量)。在FFT算法的Matlab实现中,第一个元素始终是DC分量,因此为什么数组从零开始。对于NFFT的奇数和偶数,这是正确的。

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

如果需要环绕频谱,则需要考虑是否有奇数NFFT。因此,始终需要直流分量。。

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-messinging-up-and-fftshift/ 9699983#9699983


好的,那我也可以将其用于奇数NFFT吗?
TheGrapeBeyond'July

啊对不起 从-ve到+ ve频率时,我会看到一些复杂的情况。我已经稍微改变了答案。
Learnvst 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.