matlab FFT之後的問題

FFT之後得到的是各個頻率的分量, 是一個complex Value.
一般地, fft默認是輸入向量的長度:

Y=fft(x);

但是FFT的點數爲2的冪時, FFT的速度會加快:

fs=100;
L=numel(x)
n = 2^nextpow2(L); %
Y=fft(signal,n);

n就是fft的點數, 代表做fft時把頻率分成了多少份. 每份所代表的頻率爲:

fs/n

先看一下畫出的頻譜圖

P2 = abs(Y)/L; %求幅值(). 也就是實數部分平方加序數部分平方再開根號
f = (fs/L)*(0:L); %設置頻率分量
plot(f,P2)

在這裏插入圖片描述
要注意的一點是, fft之後得到的頻率分量分爲正頻率和負頻率部分, 所以是對稱的. 所以圖中f=50右邊其實都是負頻率, 爲了更清楚一點, 我們可以用fftshift來把0點轉移到中間, 畫出真正的樣子:

Y0 = fftshift(Y);         % shift y values
f0 = (-n/2:n/2-1)*(fs/n); % 0-centered frequency range
P0 = abs(Y0)/n;    % 0-centered power
plot(f0,P0)

在這裏插入圖片描述

所以在實際應用中畫頻譜的時候, 頻率畫一半就可以了, 頻率分量要正負加在一起纔是真是的幅值.

P1 = P2(1:L/2+1); %取一半
P1(2:end-1) = 2*P1(2:end-1); %正負頻率相加, 2倍. 0和fs/2已經是疊加之後的, 不再乘以2
f1 = (0:n/2)*(fs/n); %取一半
plot(f,P1)
xlabel('Frequency')
ylabel('Amplitude')

在這裏插入圖片描述

這個叫信號的Autopower Linear spectrum. 但實際生活中我們更關心信號的能量大小, 會對幅值加一個平方:

P3 = abs(Y).^2/n;
f = (0:n/2)*(fs/n);     % frequency range
plot(f,P3(1:n/2+1))
xlabel('Frequency')
ylabel('Amplitude')

在這裏插入圖片描述

這樣, 高的更高, 低的就更低了.

還有一點要說明的是, 如果正負頻率的幅值對稱, 那麼ifft回去的信號就是一個實數信號, 否則是一個複數信號.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章