【问题标题】:Plotting FFT Amplitude Spectrum signal in Matlab在 Matlab 中绘制 FFT 幅度谱信号
【发布时间】:2015-11-09 04:13:18
【问题描述】:

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

首先,我只是以 Hz 和幅度为单位绘制 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。有人可以告诉我如何正确绘制以分贝为单位的频谱吗?

【问题讨论】:

    标签: matlab fft


    【解决方案1】:

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

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

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

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

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

    此外,负分贝是定义和预期的。 log(-1) 不是为实数定义的,但log(.1) 或任何其他小于 1 的数字会返回否定答案。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2021-02-01
      • 2013-03-12
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多