我能否获得有关如何使频率轴从负频率变为正频率(以赫兹为单位)的帮助,这将是 FFT 结果中的 x 轴,但给出偶数长度 FFT 或奇数长度 FFT。我在 MATLAB 中制作它时遇到了一些麻烦。(假设您知道采样频率 f_s)。
如何为偶数和奇数 FFT 长度制作频率轴?
信息处理
频谱
频率
2022-01-10 06:44:24
2个回答
您可以非常简单地制作正频谱(其中fs
是采样率,NFFT
是 fft bin 的数量)。在 FFT 算法的 Matlab 实现中,第一个元素始终是直流分量,因此数组从零开始。这适用于 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-and-fftshift/ 9699983#9699983
一种方法是简单地计算未移位的 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 大小不需要任何特殊的外壳。