#1 楼
一种方法是简单地计算未移位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);
Learnvst提供的答案也应该起作用;这只是考虑的另一种方式,对于偶数/奇数DFT大小不需要任何特殊的大小写。
评论
$ \ begingroup $
你好JasonR,确定该代码是否有效,因为如果我尝试使用fs = 1000和Nfft = 256进行尝试,则我得到的f_normal_order将从正数开始,变为负数,然后再变为正数。长度也不匹配。
$ \ endgroup $
– TheGrapeBeyond
2012年7月26日在21:23
$ \ begingroup $
抱歉,修复了代码中的一些错字。现在应该可以工作了。
$ \ endgroup $
–Jason R
2012年7月27日在2:17
#2 楼
您可以非常简单地制作一个正频谱(其中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-messing-up-fffshift / 9699983#9699983
评论
$ \ begingroup $
好吧,那我也可以将它用于奇数NFFT吗?
$ \ endgroup $
– TheGrapeBeyond
2012年7月25日在18:43
$ \ begingroup $
抱歉从-ve到+ ve频率时,我会看到一些复杂的情况。我已经稍微改变了答案。
$ \ endgroup $
–learnvst
2012年7月25日在20:09
评论
它可以帮助您考虑在单位圆周围均匀分布的频率。例如,四点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这个类比极大地帮助了我,非常感谢您!