热度 14
2012-4-18 13:00
966 次阅读|
0 个评论
matlab作为强大的矩阵计算软件,在数字信号处理方面有着很多的应用,今天所说的就是其中的一个小小的应用,数字信号处理,说到底,就是对信号做处理,而且这种处理是一个我们所希望的简化的方式,或者说,在这里,我们是将信号的时域做一个变换,然后我们来分析频域的情况,可以这么说,频域谱上能够看到一切。 在matlab中,首先我们明确计算机的能力实际上是很有限的,很多的时候我们没有办法把无穷的概念用计算机表示出来,你可能回去说我们自己也不能,又为啥寄希望于我们创造的电脑上呢?而无穷在电脑中,其实就是一个实数域的概念,实数域就意味着无穷,对于信号做变换的时候,我们是在实数域上进行的,然后计算机就无能为力了,然而就像计算机奉行的法则一样,离散化是另一种世界,实际上,计算机本身就是一个离散的存在,0和1,这两个似乎像是非黑即百的表述,正是计算机最好的阐释,而离散又如何不能得到某种连续呢?比如说我们的电影,最近3D搞得热火朝天,泰坦尼克就要上映了,电影就是一种离散的艺术,这种艺术实际上就是对我们眼睛的欺骗,你如果直到一点电影或是视频的原理,也就很简单了,不连续的画面,随着切换速度的改变和人眼的视觉暂留效应,从而促成了一个行业最为激动人心的发展,或许这只是起源于广告里最简单的小孩子玩的不断的换页的绘画书上渐变的动作的实现。 所以说,在离散的世界中,我们还是一样在用连续的梦想在解析着世界,不得不说的是傅利叶,他的变换可以说是一种巧妙的变通,是一种不易的大胆,这种大胆不是所有的人都能够想得到的,当然,你也可以认为这本身就是必然会产生的,只不过时间问题而已,但是我还是要说,这里讲到的东西,很大程度上就是和这个东西有关的,现实的傅利叶变换是连续的,但是这个东西电脑做不了,所以我们就将其化作离散的,这里的函数是我们熟悉的fft,这个就是快速的傅利叶变换,为啥是快速的呢?这个倒确实是快速的,这里面有一种编程的思想在里面,也有工程解决现实困难的智慧在里面,可以说,这样的做法让我们的可怜的电脑少走了很多的弯路。或者说是不必要的路。 好了,似乎说了很多没有实际的作用的话,下面赶快进入正题,首先我们要看看离散的东西究竟是怎么样的一回事,对于离散的变换来说,这里用的就是fft这个函数,我们直到matlab是以C语言来编写的,我是说matlab这个软件,而不是matlab的程序,而这里面就有C++的一些思想,就是函数的多态,那么多态我们其实是熟悉的,就是对待不同的入口得到不同的相对应的结果,这样,我们调用这个函数,当然也包括以后很多的需要调用到的函数,都可以给我们以最最方便的方法和入口参数方案来调用,也就是说,如fft这个函数,我可以直接输入一个有限长的序列作为这个函数唯一的参数,当然,我也可以在不偷懒的情况下设定需要变换的总的点数,也就是第二个参数了,因为这个函数的编写者当初就已经考虑到了这个函数的多种的调用的情况了,所以很多的方案都已经实现好了,而我们在这里就可以坐享其成了。 当然,如果下次是我们自己去编写一个我们需要的函数,或者我们可以这样说,如果那一天我们自己觉得这个fft函数实现的不好,速度太慢,自己似乎有更好的办法,有一些特殊的参数的入口设置的需求,这个时候我们也可以去实现多种多样的函数的实现,当然,这一切尽在编程之中了,在离散的信号的处理过程中,有两个东西显得特别的重要,一样是信号的抽样的点数,也就是我所希望在连续的信号中抽取的样本的点数,而第二个就是抽样的频率,你可能会问,这两个东西有啥不同呢?在我们所说的变换中,首先,我们确保电脑可以在比较短的时间之内可以完成这个工作,然后是我们的选择,在合适的点数下,以一个合适的频率来进行采样,就如同播放电影,我们就是那个站在银幕后面的那个人,我们现在是放映员,我们在不断的旋转着胶片,旋转的速度不能太快,也不能太慢,所以说我们只能在合适的速度之下给观众看到合适的移动的精彩。 这里控制效果的参数就是我们所能够控制的采样的频率和采样的点数,点数一般来说肯定是越多越好的,当点数达到足够多的时候,那么其实我们得到的原始的待处理的材料就是连续的信号,而不再是我们之前眼中的离散的信号,当然,这里必须要顾及到电脑的能力,不过有了快速傅利叶,这一点其实可以免去很大的麻烦,你可能直到在软件的编写中有意个时间的复杂度的问题,这个问题可能算是大型或是实际投入使用的软件的最需要关心的问题,在多个领域,在编程的多个领域,这个问题还有很多的可以优化和改进的地方,还有很多我们至今无法解决的问题,有些问题或许现在还根本没有找到任何的头绪。当然,今天不是来讨论这个问题的,不过在这之前,在fft(快速傅利叶变换)之前,电脑的处理离散信号的程序还是卡在了这个问题上,所以可以说,算法还是很重要的,不过像编程之美这类的书也是很好看的,只要你能够看得懂。采样频率就如同一个重复的程度或是频繁程度的度量,这是啥意思呢?在我看来,这个问题其实也可以用电影放映来看待,不过在这里换一个例子,其实也是别人用过的例子,在告诉公路上行驶的汽车,当速度达到了一定的速度的时候,你会突然神奇的发现,汽车的轮子竟然不是在正着转的,而是倒着转的,这就是问题的所在了,我们的眼睛就像是有一定的采集的频率的,超过了一定的边界,这是就会让我们产生某种“错觉”,这里用错觉这个词我想是很合适的。 好了,在抽样频率的理论中,我们已经可以知道,抽样的频率必须要超过原始的信号频率的2倍,具体的道理就由不懂的人自己看喽! 贴上一段简短的代码: fre=50; fs=100;N=16; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=sin(2*pi*fre*t); %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 subplot(2,2,1); stem(f,mag); %绘出随频率变化的振幅 xlabel('频率/Hz'); ylabel('振幅');title('N=16');grid on; fre=50; fs=150;N=16; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=sin(2*pi*fre*t); %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 subplot(2,2,2); stem(f,mag); %绘出随频率变化的振幅 xlabel('频率/Hz'); ylabel('振幅');title('N=16');grid on; fre=50; fs=200;N=16; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=sin(2*pi*fre*t); %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 subplot(2,2,3); stem(f,mag); %绘出随频率变化的振幅 xlabel('频率/Hz'); ylabel('振幅');title('N=16');grid on; 这里面其实是三段代码,就是可以看到不同的采样的频率对采样后得到的信号的信息的情况的不同和影响,而且在这里面嗨可以看到频率泄露等的情况,当然,在这里我们至少可以看出来一点,就是采样的频率越高,那么得到的频谱的泄露就越少,其他就是自己去分析啦。