作为一个资深的健忘症患者,需要把每次用都忘记的FFT问题进行整理。
FFT可将信号从时域转换到频域。
首先是一些简单常识:
采样周期:两次采样之间的时间间隔。
采样频率:1/采样周期。每秒采样的点数。(注意:采样频率的选择应为信号频率的两倍以上)
时域采样将会造成频域的周期化,即频域的周期为时域的采样频率fs。
因此在画fft后的频域图时要注意横坐标每一小格的频率为fs/(N-1)。其中N为采样点数(包括前后两个端点)。
【此处的N可以自行设置,其决定了频率采样的点数,fs/N为频率域的分辨率。作fft的代码为:fft(x,N)或fft(x)。若为后者没有输入N的值,系统默认为信号时域的采样点数。】
以一个含有10Hz和40Hz频率分量的信号为例:
clc
clear all
close all
tz = 0.01;%采样周期=0.01s
fs = 1/tz;%采样频率=100Hz
t1 = 0.5; %起始时间
t2= 5;%结束时间
tt = t2 - t1;%时间
N= tt/tz + 1;%采样的点数(算上前后两个端点)
t = t1:tz:t2;
y = sin(2*pi*10*t)+2*sin(2*pi*40*t);%含有频率为10Hz和40Hz分量的信号
y_f = fft(y);%作fft
%-------------画原始信号时域图--------------
subplot(3,1,1);%3行一列第一个图
plot(t,y);
title('原始信号');
%-------------作fft后频域图----------------
fx = 0:fs/(N-1):fs;%横坐标频率
subplot(3,1,2);%3行一列第二个图
plot(fx,abs(y_f));
title('fft transform');
%-------------fftshift频域图---------------
subplot(3,1,3);%3行一列第三个图
plot(fx-fs/2,abs(fftshift(y_f)));
title('shift fft transform');
运行得到的结果为:
FFT的处理使得在60Hz和90Hz均出现了频率分量,使用fftshift可将0频率分量移到坐标中心,正确处理了坐标。
纵坐标:
若要获得真实的振幅值,则应对得到的abs(fft(x))乘以2除以N
即将代码plot(fx,abs(y_f)); 更改为plot(fx,2*abs(y_f)/N);
运行得结果: