2015-08-16 214 views
1

我以分贝和赫兹绘制正确的FFT幅度谱信号时遇到了麻烦。在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)'); 

它看起来不错,但情节是部分画成负分贝。有人能告诉我如何正确绘制以分贝为单位的频谱?

回答

2

对于你的第一个情节,我注意到你只绘制了信号的前半部分。另外,也许更简单的方式来做到这一点是fftshift

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

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

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

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

另外,减去dB被定义和预期。 log(-1)未针对实数定义,但log(.1)或小于1的任何其他数字返回否定答案。

希望这会有所帮助!