利用matlab产生离散信号(周期与非周期有区别);绘制频谱图(涉
利用matlab产生离散信号(周期与非周期有区别);绘制频谱图(涉及卷积);验证卷积定理时容易遇到的问题
matlab与信号与系统的结合前言一、matlab产生一个离散的信号
二、matlab算卷积
绘制频谱图
三、验证卷积定理
四、 心得体会
五、总结
前言
这真的是我第一次写博客,好吧也不是第一次,是第一次写如此高大上的博客。(咦?为什么我的话风还是比较low?)
咳咳,转回正题啊。第一次接触matlab竟然是信号与系统的课后作业,其实很早就想学一学这个强大的软件了,现在入门啦,以后可以慢慢地把他当一个工具使用了。以下是我用matlab来解决一些信号的产生,绘制频谱图,以及验证卷积定理时的经验与教训的总结
现在给了一个信号:
x1[n]=cos(2πf1*n);
我遇到的第一个问题就是:π怎么搞?3.14来估计?还是怎么算?
最后发现:妈耶matlab好强大,在matlab中:pi=π.
那这个信号是怎么产生的呢?直接看代码会明白的很快的:
w0=pi/8;
n=64;
n=0:n-1;
X1=cos(w0*n);
figure(1);
subplot(3,1,1);stem(x1);title('cos[pi/8*n]');%这个是在画时域中的图像
用matlab算卷积可以说是非常方便了,一个” conv(x,y)“函数就可以搞定了,不过用conv的时候需要注意一下:卷积有conv(x,y);conv2(x,y); convn;这三种。区别就是跟要卷积的矩阵有关系了(matlab中的思想是以矩阵的形式存储变量)
这一段也给一下例程代码吧,【跟着代码学思路,不懂函数的用法的话百度或者在命令行里面输入“help conv(或者其他的函数名)”就会有解释的,不过我这样的小白还是觉得百度比较快hhh。】
h1[n]=[0.0031,0.0044, -0.0031, -0.0272,-0.0346,0.0374, 0.1921, 0.3279,0.3279,0.1921,0.0374,-0.0346,-0.0272,-0.0031,0.0044,0.0031 ];%M=16
w0=pi/4;
n=16;%N=16
n=0:n-1;
x1=cos(w0*n);
y1=conv(x1,h1);
N=16;M=16;L=N+M-1;
ny=0:L-1;%这句是ny从0取到L1;
figure(1);
subplot(1,1,1);stem(ny,y1);ylabel('x1*h1');
图形让你们看一下长啥样:
代码:
N1=16;df=0.098;f=(0:N1-1)*df;
X1=fft(x1)/N1*2;
figure(7);
subplot(2,1,1);
plot(f,abs(X1));xlabel('w');ylabel('幅值');
subplot(2,1,2);
plot(f,angle(X1));xlabel('w');ylabel('相位');
X2=fft(x2)/N1*2;
要讲频谱的话,就必须要讲傅里叶变换(傅里叶在大学简直无处不在呀)
傅里叶变换里面有CFT(连续傅里叶变换)、DFT(离散傅里叶变换),这里要说的FFT是DFT的快速变换,听说了很久终于用到了。FFT的逆变换就是IFFT(inverse fast fouriour transform,啊~英语凭感觉写)
FFT不仅可以用于求乘积,另一个重要的用途就是求频谱啦!
至于为什么:X1=fft(x1)/N1*2;这一点我也不是很清楚啦,而且我的结果里面应当再乘个pi呀(据我所看的资料里是说,这样得出的是真实的幅值,感觉并没有呀)
离散信号的频谱是连续函数,但是matlab不能表示连续函数,其中两个点之间我们用到步进的概念:就是代码里面的dt。很多人绘制频谱的思路:是将连续信号采样变成离散信号,然后再将离散信号进行fft,此时他们的dt是跟采样频率有关的。但是像我这样的不进行实验还要进行频谱分析的,这个dt就很迷了。我在做实验的时候发现:
dt=w0/(n/N);(n是序列长度、N是信号周期)
这个是自己不断试验试出来的,从理论上我还没想好怎么解释。(想好再来补吧)
这个就是要注意* 和. *的关系(一个是 乘,另一个是点乘)
在验证卷积定理时:我希望将H1与X1相乘,于是我写成
Z1=H1X1
结果出现了一个问题:矩阵内部维度不相同,我于是将H1与X1的维度都调成了16,但仍然会报错。
于是我在网上找类似错误的解决方法,发现了“”与“.”的区别。
:dv表示矩阵相乘,要求内部维度相同是指d的列数要与v的行数相同。
d.*v表示矩阵内部的元素对应相乘,要求内部维度相同是指d的行数与列数要和v的行数与列数相同。
最后,我修改为:
Z1=H1.*X1
就可以正常运行了。
结论:在仿真离散周期序列时,序列长度应取为周期的整数倍。
结论比较重要,验证随便看看就好啦
由于matlab并不能实现无限序列的产生,我在最开始时,希望这个序列尽可能的长一些,从而逼近无限情况,所以一开始x1[n]的长度取的50,但是在分析频谱时发现:
理论上分析:X1[n]应当在w=π/4(0.789)与w=5π/4(3.92)处,赋值应当为π(即在图像中显示为1),但n=50时(即n不为周期的整数倍时),频谱如下:
可以由此看到幅值并不为π,并且x1(t)中有其他w分量。
我猜想:可能是由于当n取的不为周期的整数倍时,这个序列并不是呈周期性,那么理论分析与实践就会产生一些误差。
因此,我取了n=8;n=16;n=20;n=40,n=70,又做了一次比较,其频谱图如下:
可以由此看到幅值并不为π,并且x1(t)中有其他w分量。
我猜想:可能是由于当n取的不为周期的整数倍时,这个序列并不是呈周期性,那么理论分析与实践就会产生一些误差。
因此,我取了n=8;n=16;n=20;n=40,n=70,又做了一次比较,其频谱图如下:
由这几幅频谱图的对比,可说明猜想是正确的:即在仿真离散周期序列时,序列长度应取为周期的整数倍。
最后我取了n=64;其实后来发现没必要取那么多,n=16就好,但实验前4小题我都是采取了n=64,最后的一道验证卷积定理时遇到了我下面要论证的问题,最后一道题取的维度为n=32;
假装有个结尾叭,matlab的确很好用哈,我之后可能会学图像处理,学到这的时候,估计还要用到matla。再见喽!
利用matlab产生离散信号(周期与非周期有区别);绘制频谱图(涉相关教程