02_实验二 卷积与傅立叶变换

实验二  卷积与傅立叶变换
1. 本次试验内容提要:
卷积和解卷积函数
卷积和解卷积是信号处理中常用的数学工具。
conv ( a , b )      卷积函数
deconv ( a , b )    解卷积函数
其中,a , b为两个向量。
傅立叶分析
傅立叶变换是信号处理的最重要、最基本的工具之一。
fft(a)    离散傅立叶正变换
ifft(a)    离散傅立叶反变换
abs(a)    求复数的模(幅值)
angle(a)  求复数的相角
real(a)    求复数的实部
imag(a)    求复数的虚部
注:在使用函数fft时,可加入另一个参数n来指定变换的点数,如:y= fft (x , n ),当数据x的点数少于水平潜流人工湿地n时,则补零使总点数为n;当点数多于n点时则截断输入数据,当不输入参数时,MATLAB使用x的点数计算。
2. 信号的卷积
2.1. 离散信号的卷积
由《信号与系统》可知,两个离散信号的卷积公式为:
sbr池
计算机只能处理离散的有限的数字信号, 因而我们首先考虑两个有限长序列的卷积。假设序列的非零区间为(),的非零区间为(),则的序列长度为,的序列长度为。由卷积运算的性质可以得出,的序列长度为,且非零区间为(
matlabconv()函数可以用来快速计算两个离散序列的卷积和。例如,已知序列f1(k)f2(K)如下所示:
       
则调用conv()函数求取上述两个序列卷积和的命令如下:
f1=ones(1,3);
f2=0:3;
f=conv(f1,f2)
运行结果为:
f = 0    1    3    6    5    3
前面我们提过,完整的表示一个离散信号需要两个离散序列,一个用来表示各个点上的函数值,一个用来表示非零信号的时间区间。而matlabconv()函数计算卷积时,只对函数值进行卷积,而无法给出卷积后的信号非零区间的范围。因此,要正确地标识出函数conv()的计算结果,我们还需要确定非零区间所对应的序号向量。下面我们利用conv()函数做出一些改进写出函数dconv(),函数语句如下:
function [f,k]=dconv(f1,f2,k1,k2)
f=conv(f1,f2);
k0=k1(1)+k2(1);
k3=length(f1)+length(f2)-2;
k=k0 : k0+k3;
subplot(3,1,1), stem(k1,f1,'filled')南北乱世情
title('f1(k)'), xlabel('k'), ylabel('f1(k)')
subplot(3,1,2), stem(k2,f2,'filled')
title('f2(k)'), xlabel('k'), ylabel('f2(k)')
subplot(3,1,3), stem(k,f,'filled')
title('f(k)'), xlabel('k'), ylabel('f(k)')
例如,我们想利用上面的dconv()函数做出下列序列的卷积
       
调用dconv()的语句如下:
f1=[1,2,1];
k1=[-1,0,1];
f2=ones(1,5);
k2=-2:2;
[f,k]=dconv(f1,f2,k1,k2)
运行结果如下:
2.2. 连续信号的卷积
两个连续信号的卷积公式为:
但我们应该知道,计算机只能处理离散的数字信号,所以连续信号的卷积实际上都是用离散信号的卷积来近似的。我们回想一下在《信号与系统》中如何得到连续信号的卷积积分公式的,积分实际上是一个极限过程,是将图像看成许多个小矩形近似构成的。因此有如下公式:
上面y(t)是一个连续函数,我们作它的图像时实际上只需求出有限个间断点上的函数值,再用直线连接这些点的数值就可以了。在作图时,我们一般等间隔的取这些点,比如间隔取为,则作图时我们需要求处的值(n =)。实际上n的值也不可能是负无穷到正无穷,作图时我们往往只关心某个区间的函数图像并不一定需要绘出全部范围。因此上面的公式还可以改写为:
式中A,B根据需要的作图区间来定,即为间隔的大小。我们注意这时公式中求和号后面的部分,实际上可以用离散序列的卷积来代替。这样我们更改的值就可以得到y(t)的各种不同精度的估计值。例如,我们需要求取下列两个连续信号的卷积积分:
我们可以象离散情况时那样,先写出一个计算连续卷积的函数sconv(),再用它来作图。函数体的命令如下:
function [f,k]=sconv(f1,f2,k1,k2,p)
f=conv(f1,f2);
f=f*p;
k0=k1(1)+k2(1);高等学校化学学报
k3=length(f1)+length(f2)-2;
k=k0 :p : k0+ k3*p;
subplot(3,1,1), plot(k1,f1)
ylabel('f1(t)')
subplot(3,1,2), plot(k2,f2)
ylabel('f2(t)')
subplot(3,1,3), plot(k,f)
xlabel('t'), ylabel('f(t)')
萌发菌调用它的命令为:
p=0.01;
k1=0:p:2;
f1=0.5*k1;
k2=-2:p:2;
f2=ones(1,length(k2));
[f,k]=sconv(f1,f2,k1,k2,p);
运行结果为:
注意:我们应该记住,计算机没有办法处理真正连续或持续时间为无穷的信号,对于上述两种情况我们只能作近似处理,实际上都是转化为在某一个区域内、离散序列的问题来处理。这样当然会有误差,但只要在允许的精度范围内,这种误差就是可以接受的。
3. 线性系统的响应
3.1. 连续系统
我们一般使用微分方程来描述连续系统的特性,如:
这样我们只需用两个向量就可以表示上面的微分方程,其中:
,       
注意:在用向量表示微分方程描述的连续系统时,向量一定要以微分方程对时间求导的降幂方式排列,而且缺项要用0来补齐。
然后Matlab中可以使用impulse( )和step( )函数,来分别求取这个微分方程所表示的线性连续系统的单位脉冲响应和单位阶越响应。
例如:线性连续系统微分方程为的单位脉冲响应和单位阶越响应用matlab求取过程如下:
a=[2,1,8];
b=[1];
subplot(2,1,1),impulse(b,a);
subplot(2,1,2),step(b,a);
运行结果如下:
如果,我们还想知道该系统在输入信号为x(t)=sin(t)的作用下输出信号的波形,我们可以使用lsim( )函数,代码如下:
    t=0:0.01:25
x=sin(t);
lsim(b,a,x,t);
运行结果为:
由这个例题可见,matlab把原来求解微分方程的复杂计算变为十分简单的函数调用,大大简化了专业技术人员的工作,让我们能将注意力和时间集中到感兴趣的专业知识上。所以说,matlab是一种科学家和技术人员的便签似的计算机语言工具,一个非常方便功能强大的工具。
3.2. 离散系统
对于离散系统我们一般采用差分方程来描述系统特性,如下所示:
则我们可以用下面两个向量来表示差分方程:
,       
然后可以用impz( )函数来画出该线性系统的单位脉冲响应,例如:
函数调用的代码如下:
a=[2,-2,1];
b=[1,3,2];
impz(b,a);
运行结果如下:
如果我们想知道该系统对其它输入信号的响应情况,可以使用filter( )函数。对上面的例子,如果输入信号为,则调用的函数代码如下:
    a=[2,-2,1];
b=[1,3,2];
k=0:20;
x=(1/2).^k;
y=filter(b,a,x);
stem(k,y);
运行结果为:
4. 傅立叶分析
傅氏变换是信号分析的最重要的内容之一,如何从已知信号求出相应的频谱是十分有用的。针对信号的符号运算表示和离散序列表示,matlab有两个函数分别来完成傅立叶变换。
4.1. 符号运算表示法
matlab的symbolic math toolbox提供了两个函数分别用来直接求解傅立叶变换和它的反变换,两者的调用格式如下。
Fourier变换
Fourier反变换
F = fourier(f)
F = fourier(f, v)
F = fourier(f, u, v)
f = ifourier(F)
f = ifourier(F, u)
f = ifourier(F, v, u)
例:求的傅立叶变换
syms t;
f=exp(-2*abs(t));
F=fourier(f);
subplot(1,2,1), ezplot(f);
subplot(1,2,2), ezplot(F);华夏之声
运行结果为:
书上例题4.1,P207
syms x;
f=sym(exp(-1*2*x)*sym('Heaviside(x)'));
F=fourier(f);
subplot(3,1,1);
ezplot(f,[-3,3]);
axis([-3,3,-0.5,1.5]);
subplot(3,1,2);
ezplot(abs(F),[-3,3]);
subplot(3,1,3);
ezplot(imag(F),[-3,3]);
程序运行结果:
例:求的傅立叶反变换
syms t w;
F=1/(1+w^2);
f=ifourier(F,t);
subplot(1,2,1), ezplot(F);
subplot(1,2,2), ezplot(f);
运行结果为:
其中:Heaviside(t)就是单位阶越函数u(t),采用fourier()和ifourier()得到的返回函数,仍然是符号表达式。若需对返回函数作图,则应用ezplot()绘图命令而不能用plot()命令。如果返回函数中含有德尔塔等奇异函数,则用ezplot()无法做出函数的图像。此外,用fourier()
对某些信号求变换,其返回的函数可能会包含一些不能直接表达的式子,甚至可能会出现一些屏幕提示为“未被定义的函数或变量”的项。这是fourier()函数的一个缺陷。
4.2. 离散序列表示法
一般最为常用的是离散傅立叶变换的函数 fft(),并以它来近似连续信号的傅立叶变换。以下将对它进行介绍。
另外,需要说明的是,傅立叶变换公式在各种书籍上采用的形式可能略有不同,差别仅在于常数项,也就说最后的结果如果有差异,那也只是相差了一个常数系数,绘制出的图形在幅度上放大和缩小一个常数系数而已,而图形的形状和性质不变,这就三角形相似的原理是一样的。在MATLAB中采用的离散傅立叶变换公式如下:

本文发布于:2024-09-22 12:37:08,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/293359.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   信号   卷积   离散   序列   变换   需要   表示
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议