傅立叶分析
公式
以下示例对振幅为1的5Hz正弦波和振幅为0.5的10Hz正弦波相加后的结果进行了傅立叶分析。
clear all
N=512;
dt=0.02;
n=0:N-1;
t=n*dt;
x=sin(2*pi*5*t ) 0.5*sin )2*pi*10*t ); %生成和信号
%傅立叶变换
m=floor(n/2 ) 1;
a=Zeros(1,m );
b=Zeros(1,m );
for k=0:m-1
for ii=0:N-1
a(k1 )=a ) k1 )2/n*x ) ii1 ) cos )2*pi*k*ii/n );
b(k1 )=b ) k1 )2/n*x ) ii1 ) sin )2*pi*k*ii/n );
结束
c(k1 )=sqrt(a ) k1 ).^2b ) k1 ).^2);
结束
%傅立叶逆变换
if(mod(n,2 ) ) (=1) ) ) ) ) ) ) ) ) )。
a(m )=a ) m )/2;
结束
for ii=0:N-1
xx(ii1 )=a )1)/2;
for k=1:m-1
xx(ii1 )=xx ) ii1 ) a ) k1 ) cos )2*pi*k*ii/n ) b ) k1 ) sin )2*pi*k*ii/n );
结束
结束
%图
subplot (t (3,1,1 ),plot ) t,x,' LineWidth ',2 ); title (原始信号)、xlabel ()时间/s );
subplot (3,1,2 ),plot ) ) 03360m-1 )/)/(N*dt ),c,' LineWidth ',2 ); title (傅里叶变换)、xlabel (标签)、频率/Hz );
subplot (3,1,3,plot ) ) 0:n-1 ) dt,xx,' LineWidth ',2 ); title (合并信号)、xlabel (标签)、时间/秒);
执行结果如下。
快速傅立叶
matlab的快速傅立叶有两种调用形式。
y=FFT(x )。 x是原始信号,y是转换后的信号。 y和x一样长。
y=FFT(x,n )。 x、y如上述定义,n为正整数,表示进行n点快速傅立叶变换。 在x的长度小于n时,对x添加零,使其等于n; 相反的情况下,切取x。
的逆变换有两种: x=ifft(y(y )和x=ifft(y(y ) )。
通常,n点fft的结果y为$n=N/2 1$,其中对应的频率为最高采样率的一半,且y的后一半与前一半对称。
以下示例对振幅为1的5Hz正弦波和振幅为0.5的10Hz正弦波相加后的结果进行了傅立叶分析。
clc; 清除
fs=30;
N=512;
n=0:N-1;
t=n/fs;
x=sin(2*pi*5*t ) 0.5*sin )2*pi*10*t );
%高速傅立叶
y=FFT(x,n );
mag=ABS(y; %振幅
ang=angle(y; %相位
f=n*fs/N; 与%横轴各点对应的频率值
%逆变换
xx=IFFT(y;
xx=真实(xx ); 由于%计算误差,xx可能是复数,因此能将它取入实数部以获得信号
TT=[0:length(xx )-1]/fs; %横轴各点对应的时间
省略结果图。
过滤
基于快速傅立叶的简单滤波
以下示例将振幅为1的5Hz正弦波和振幅为0.5的10Hz正弦波相加后,对8Hz以上的信号进行了滤波。
clc; 清除
fs=30; %采样率
N=256;
n=0:N-1;
t=n/fs;
dt=1/fs;
x=sin(2*pi*5*t ) 0.5*sin )2*pi*10*t );
%高速傅立叶
y=FFT(x,n );
mag=ABS(y ) *2/N; %振幅
ang=angle(y; %相位
f=n*fs/N; 与%横轴各点对应的频率值
%过滤
nn=Length(y;
YY=Zeros(1,nn );
for m=0:nn-1
if(m/) nn*dt )8) ) m/) n*dt ) )。
YY(m1 )=0;
else
YY(m1 )=y ) m1;
结束
结束
%逆变换
xx=IFFT(YY;
xx=真实(xx ); %计算
误差使得xx可能是复数,对其取实部得到信号tt = [0:length(xx)-1]/fs;%横轴各点对应的时间
%绘图
subplot(2,1,1),plot(t,x,'LineWidth',2);title('原始信号'),xlabel('时间/s');
subplot(2,1,2),plot(tt,xx,'LineWidth',2);title('滤波后的信号'),xlabel('时间/s');
结果如下图
几个简单的函数
xi=filtic(B,A,ys)。B、A分别为系统z变换后的传递函数的分子和分母多项式的系数向量,ys是系统的初始输出状态,xi为对应的初始条件下输入序列。
yn0=filter(B,A,xn)。B、A定义同上,xn是系统的输入信号,yn0为系统的零状态响应。
yn=filter(B,A,xn,xi)。B、A、xn、xi定义同上,yn为系统全响应。
模拟滤波器
以xddddx低通滤波器为例,说明调用方法。
[btt1,ctt1] = butter(N,wn,'s');%1.调用函数生成滤波器系数
H = [tf(btt1,ctt1)];%滤波器的传递函数
t = (0:n-1)./fs;%时域信号横轴的坐标,n为长度,fs为采样率
s1 = lsim(H,a1,t);%2.滤波
说明:
[btt1,ctt1] = butter(N,wn,'s');。N是滤波器的阶数,wn是截止频率(是弧度值,如果截止频率要求为500Hz,则$wn=500*2*pi$)。可以直接给定,亦可以根据参数由buttord`函数计算得到。's'表示模拟滤波器。btt1、ctt1分别表示滤波器在拉普拉斯域中传递函数的分子、分母多项式的系数。
s1 = lsim(H,a1,t)。H是模拟滤波器的传递函数,a1表示待滤波信号,t是信号的横坐标,s1是滤波后的信号。
其他说明:
这里仅以低通滤波器为例,其他xddddx滤波器如高通、带通、带阻调用方式类似,只是函数butter的参数略有不同,请参看matlab关于butter函数的介绍。(在matlab中执行help butter)
其他滤波器,如椭圆滤波器等,使用方式类似,只是函数名称不同。
数字滤波器
以xddddx低通滤波器为例,说明调用方法。
%方式一:直接设计
[btt,ctt] = butter(N,wn);%1.生成数字滤波器
Signal_Filter=filter(btt,ctt,a1);%2.滤波
%方式二:模拟滤波器转数字滤波器
[btt1,ctt1] = butter(N,Wn,'s');
[btt1,ctt1]=bilinear(btt1,ctt1,Fs);%3.模拟滤波器转数字滤波器
Signal_Filter=filter(btt,ctt,a1);
说明:
[btt,ctt] = butter(N,wn)。N是滤波器阶数,wn是相对截止频率,比如最高采样率为Fs,要求的截止频率为fs,则$wn=fs/Fs$ 。可以直接给定,亦可以根据参数由buttord函数计算得到。注意,这里没有参数's'。btt、ctt分别表示滤波器在z域中传递函数的分子、分母多项式的系数。
Signal_Filter=filter(btt,ctt,a1)。btt、ctt与之前定义相同,a1是待滤波信号,Signal_Filter是滤波之后的信号。
[btt1,ctt1]=bilinear(btt1,ctt1,Fs)。是使用双线性法将模拟滤波器在拉普拉斯域中的系数转换成数字滤波器在z域中的系数,Fs是采样率。
其他说明:
这里仅以低通滤波器为例,其他xddddx滤波器如高通、带通、带阻调用方式类似,只是函数butter的参数略有不同,请参看matlab关于butter函数的介绍。(在matlab中执行help butter)
其他滤波器,如椭圆滤波器等,使用方式类似,只是函数名称不同。