2015-08-16 167 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的任何其他數字返回否定答案。

希望這會有所幫助!