在 Matlab 中绘制 FFT 幅度谱信号

Plotting FFT Amplitude Spectrum signal in Matlab

我无法以分贝和赫兹为单位绘制正确的 FFT 幅度频谱信号。

首先,我只是绘制了以赫兹和幅度为单位的 FFT 频谱信号,如下所示:

figure;
X_mags = abs(fft(signal));
bin_vals = [0 : N-1];
freq_ax_bins = bin_vals*fs/N;
N_2 = ceil(N/2);
plot(freq_ax_bins(1:N_2), X_mags(1:N_2));
title('FFT Spectrum signal 1');
xlabel('Frequency (Hz)')
ylabel('Magnitude');

这会导致幅度始终 > 0 的预期绘图。最后,我只想做同样的事情,但以分贝为单位:

bin_vals = [0 : N-1];
freq_ax_Hz = bin_vals*fs/N;
N_2 = ceil(N/2);
figure;
plot(freq_ax_Hz(1:N_2), 10*log10(X_mags(1:N_2)));
xlabel('Frequency (Hz)')
ylabel('Amplitude (dB)');

看起来不错,但绘图部分绘制为负 dB。谁能告诉我如何以分贝为单位正确绘制频谱?

对于您的第一个绘图,我注意到您只绘制了信号的前半部分。另一种可能更简单的方法是 fftshift:

>> Xmag = fftshift(abs(fft(x)));

现在DC值在中间而不是开头。频率向量是(-N/2:N/2 - 1)*fs/N

如果您的信号不对称,那么您需要查看负值。

对于第二个,请注意 dB 需要 20*log10,除非您采用 Xmag 平方 。没什么大不了的,只是一个标量,但我想你想知道。

此外,负 dB 是定义和预期的。 log(-1) 没有为实数定义,但 log(.1) 或任何其他小于 1 的数字 returns 是否定的答案。

希望对您有所帮助!