在 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 是否定的答案。
希望对您有所帮助!
我无法以分贝和赫兹为单位绘制正确的 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 是否定的答案。
希望对您有所帮助!