天天看点

MATLAB中FFT的整理

作为一个资深的健忘症患者,需要把每次用都忘记的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');
           

运行得到的结果为:

MATLAB中FFT的整理

FFT的处理使得在60Hz和90Hz均出现了频率分量,使用fftshift可将0频率分量移到坐标中心,正确处理了坐标。

纵坐标:

若要获得真实的振幅值,则应对得到的abs(fft(x))乘以2除以N

即将代码plot(fx,abs(y_f)); 更改为plot(fx,2*abs(y_f)/N);

运行得结果:

MATLAB中FFT的整理