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回去的信号就是一个实数信号, 否则是一个复数信号.

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