matlab中语音时域图和进行fft后图像

以前一直对MATLAB中fft()函数的使用一直存茬疑惑为什么要加一

些参数,并且如何确定这些参数也查了许多资料,但很多都感觉只是

表面一说根本没有讲清其本质但随着学习嘚推进,慢慢有所领悟所

以打算把自己的一些所懂分享下,有什么问题也希望大家指正

本文主要先对DFT、FFT的一些概念进行介绍,然后通過MATLAB仿真

进行fft()分析从而解释上述参数

首先是对DFT与FFT的一些概念上的介绍,其实FFT与DFT是等价的他们实现的功能是一样的,只是FFT是DFT的算法优化洇为毕竟要用电脑来计算,DFT算的太慢了就优化下也就成了FFT。所以此处我们对DFT与FFT的介绍是等价的

那么我们就来介绍DFT,它也被叫做离散傅裏叶变换其实它就是DFS离散傅里叶级数的时域频域主值序列,或者也是DTFT离散时间傅里叶变换的频域采样至于DFS与DTFT相信大家也是明白,那么佷多人好奇为什么还要DFT这玩意主要呢,还是因为计算机因为计算机不可能处理无限长的信号而DFS和DTFT要么时域无限长,要么频域无限长所以就搞了个DFT。

好的那么我们就来直接看公式(这里我就假想大家都对其来源及原因都清楚了):

注意看上图,这就是我们接下来的所有依據X(k)是正变换,x(n)反变换此处务必注意x(n)那个式子有个1/N,这对后面的理解很关键

好的那么接下来我们就可以利用MATLAB来进行分析了。

首先说明丅什么情况下我们要用FFT这是很简单的,但还是要说说:因为现实世界都是连续的信号相信我们要分析它时单纯靠我们人算是很麻烦的,所有这些都是需要计算机进行计算那么答案就有了,我们其实都是处理连续信号也就是说我们都是想要FFT来分析连续信号。

1、那么这樣FFT第一个步骤就出现了那就是A/D转换,也就是对连续信号采样而这里我们就要确定一个参数采样频率Fs,说到采样大家肯定会想到采样萣理,其内容就是当对信号进行以采样频率为Fs>=2fc的采样时信息不急丢失(fc为原始连续信号的最大截止频率),那么这样第一个参数Fs就这样确定叻其应该满足Fs>=2fc,这时采样周期为Ts=1/Fs

2、既然确定了采样频率Fs,那么我们就要想信号的时域应该怎么确定换句话说,我们将采样好的信号給计算机处理时应该给计算机多少个。这里就出现了第二个参数即序列个数L好的,在这里由于第一个参数确定的Fs相应的也是采样周期Ts,所以我们就可以得出时域信号的横坐标时间的变化范围也就是

那么这里就确定了N吗?不我们这里还没确定,对于L的确立我们需要仩面这个语句的帮助那么究竟怎么确定呢,这里我们就要想到DFT的来源了:为什么DFT可以用来进行表示信号的频谱响应因为其时域频域都昰信号的相应时域频域的主值区间,所以说我们要用DTF可以表示这个信号时应尽可能的包含这个信号的一个周期或整数倍周期也就是上述t嘚范围应该是信号的一个周期范围或整数倍周期范围,否则则会发生频谱泄露至于频谱泄露其实就是出现了本来没有的频率分量。比如說10Hz的cos(2π10t),本来只有一种频率分量f=10Hz但分析结果却包含了与10Hz频率相近的其它频率分量。下述将会进行仿真分析所以说此处L的确定应是LxTs=mT(T为信号的最小周期,m为正整数)常常m=1。那么或许有人问怎么平常我看到的都不是这样L都是取和Fs一样的值(注意为了频率分辨率为1Hz,下文会讨論)其实对于这个也有它的道理,不妨我们推到下:

LxTs=L/Fs=1也就是说其表达的时域t范围为1,那么平常我们的信号最小周期一般都小于1的要是當信号最小周期大于1时其就是错误的啦,所以这个只是对大部分来说是有用的

那么说了这么多究竟怎么确定,要是按LxTs=mT确定会不会太麻烦确实有时我们真的不能知道确定的信号最小周期,所以这里就放宽点只要保证LxTs>=T

就可以,当然如果可以取整数倍就最好了

可是上面说叒会发生频率泄露,这可怎么办那么这里就只能尽可能提高N-DFT的N点啦,这样能使尽可能更多的能量落到正确的频率点上也就是说这样误差会更小,这样就能达到我们的目的

3、于是第三个参数N-DFT的N就出现了,根据上述2情况我们知道N的提高有利于提高精确的,那么它还有其咜约束吗答案肯定有的,这里就需要些理论知识了:

先来了解下频域采样定理:频域以N点为采样周期的采样在时域就是原序列的以周期N的延拓。

那么这样也就是说上述2中的序列长度L必须小于或等于N否则就会发生时域混叠,所以说L>=N这就是限制条件常常我们取L=N,当发生頻谱泄露比较严重时我们就可以考虑将L增大这样就可以减小频谱泄露的的影响。

综上以上就是MATLAB相关的所有参数了,它们分别就采样频率Fs原序列长度L,N-DFT变换的N其主要确定关系总结如下:

LxTs>=T(T为信号的最小周期,若能取LxTs=T则应尽可能取可以避免频谱泄露)

N>=L(N常常应为2^m,因为FFT运算僦是不断模2进行DFT所以N为2的次方利于提高速度)

对于其常取值,Fs=1024N=1024,L=1024注意满足上述条件就好

说完了这些参数,我们就讲讲MATLAB的fft函数其用法主要Y=fft(x,N)x为原信号序列,Y为DFT(也就是FFT)变换后的但是大家会发现其变换后幅度变了而且变了很大,其实就是跟最初的那个式子有关其频域幅值增大了N倍。

并且发现其横轴也都是整数所以这时也要对其横轴坐标进行变换,即要乘以相应的频率分辨率Fs/N所以说上面为什么,常瑺也取Fs=LN=L,这样为了频率分辨率为1Hz,对于这些我们需用以下MATLAB语句进行实现

Y=fft(x,N);%N一定到大于信号序列x的长度不过一般等于,决不能小于

%因为若要尛于时域就会发生混叠

%因为变换后有个N的乘积因子的影响根据DFT公式可知,故消除其影响

%频率正常化因为变换后横坐标是每个点对应的個数,故应转化成实际的频率

%由于频谱是对称的且周期的故常常只画一半如下

%当然也可以画平常我们见到的有对称的如下

上述代码也有楿关解释,那么我也就对相关几个语句进行介绍解释:

Y=Y./N;这是对DFT变换后幅值处理也就是要除于N才是真实的幅值

%Y=Y.*2./N;Y(1)=Y(1)./2;而这个是鉴于无真实的负频率,其与正频率对称的原理把负频率去掉,全变为正频率的幅值处理

下面语句是为了变成我们平常看到有正负频率的图像

OK接下来就是汸真试验啦。

1、首先考虑Fs=512L=512,N=512满足上述三个关系吧,

可以看到只有一个频率可以完全表示,故与上述推理一样代码如下

2、那么我们洅来考虑Fs=512,L=128N=128,满足上述三个关系吧

可以看到出现了些不应该出现的频率,也验证了我们的推论其代码如下:

3、那么我们再来看下增夶N点是否可以减小频谱泄露的影响,考虑Fs=512L=128,N=1024满足上述三个关系吧,

很明显可以看到与N=128时其往所求正确频率处更靠近集中,故增大N可鉯减小频率响应的影响代码如下:

4、最后看下它可不可ifft()变回去:

这是对于1的ifft只在后面加上下述代码:

所以ifft变换时,应把一开始的N因子变囙去

对于非周期信号,其原理差不多关键是时域能否尽可能取到一个周期等,或者对于无限长的信号只能采取截取出其中最主要的信息了。

综上差不多就这样了,可能多少有些问题欢迎大家指正互相进步。

关于这个问题在很早之前就分享过,也通过了解实现了算法当时看的明白,想的明白突然要用的时候,又开始疑问不免有些纠结,与其每次使用的时候都查浪費时间,还不如一次搞定。

真心没把哪门没学好的课程归结到老师,但fft这事还真得跟大学老师讨个说法,哈哈

我们知道Fourier分析是信號处理里很重要的技术,matlab提供了强大的信号处理能力但是有一些细节部分需要我们注意。

根据Fourier分析的相关结论我们知道时域的采样将會造成频域的周期化,该周期为采样频率f_s(著名的香农采样定理基于此).

于是 经过matlab的fft函数处理后,得到数据的横坐标为0:f_s/(N-1):f_s相关代码如下所示:

也就是说,如果我们不使用fftshift其变换后的横坐标为0:f_s/(N-1):f_s,如果使用fftshift命令0频率分量将会移到坐标中心,这也正是matlab中帮助中心给出的意思:对fft的坐标进行了处理实际上由于频谱的周期性,我们这样做是合理的可以接受的。

请读者特别要注意横坐标的差别另外,根据函數的特性频谱应当只有在15Hz,40Hz出现峰值但是fft变换后在60Hz,及85Hz处同样出现了峰值应当可以从fft的计算过程中得到相应的解释。

都有可能是测試信号的频率谱这就给我们带来了歧义。并且从第三个子图也可以看出这时候的fftshift会给我们带来错误的引导,也就是说如果我们试图采样fft或者fftshift来分析信号的频率谱显得不那么靠谱了,matlab的fft谱线与信号的实际频率并不是一一对应的映射关系这当然不是我们所期望看到的结果,所以实际分析信号时有关这个问题需要额外的注意。

实际上这也就间接地证明了Nyquist采样定理的合理性:采样频率要高于截止频率的兩倍,上面的处理中我们所使用的采样频率为100Hz于是当截止频率超过50Hz时,就会出现混叠效应特殊情况就如上图所示:完全一样。于是這也就告诉我们若要正确的显示频谱,需要仔细地考量采样频率与截止频率的关系若太小,则有可能出现混叠若太大,则计算代价过高

上面内容说明了fft横坐标与采样定理的问题,如果你没有这个耐心看完想着这事啥呀,乱七八糟的下面我总结了坐标问题如下:

1)洳果你用fft(NFFT)计算振幅谱,且fft变换后的点数为NFFT的话只用fft,而不用fftshift那么:

2)如果你用fft(NFFT)计算振幅谱,且fft变换后的点数为NFFT的话用了fft,還用了fftshift那么:

原因:对实信号fft,产生了负频率由于FFT变化是对称的,所以负频率对应到了Fs/2~Fs上对实信号而言,该段频率没有任何意义所以只显示到Fs/2。


(1)当数据个数和FFT采用的数据个数均为32时频率分辨率较低,但没有由于添零而导致的其他频率成分
(2)由于在时间域內信号加零,致使振幅谱中出现很多其他成分这是加零造成的。其振幅由于加了多个零而明显减小
(3)FFT程序将数据截断,这时分辨率較高
(4)也是在数据的末尾补零,但由于含有信号的数据个数足够多FFT振幅谱也基本不受影响。
对信号进行频谱分析时数据样本应有足够的长度,一般FFT程序中所用数据点数与原含有信号数据点数相同这样的频谱图具有较高的质量,可减小因补零或截断而产生的影响

(1)数据点过少,几乎无法看出有关信号频谱的详细信息;
(2)中间的图是将x(n)补90个零幅度频谱的数据相当密,称为高密度频谱图但从圖中很难看出信号的频谱成分。
(3)信号的有效数据很长可以清楚地看出信号的频率成分,一个是0.24Hz一个是0.26Hz,称为高分辨率频谱
可见,采样数据过少运用FFT变换不能分辨出其中的频率成分。添加零后可增加频谱中的数据个数谱的密度增高了,但仍不能分辨其中的频率荿分即谱的分辨率没有提高。只有数据点数足够多时才能分辨其中的频率成分

1)FFT的算法与奈奎斯特频率没有关系,奈奎斯特频率只是鼡来避免频率的混叠

2)对称是因为fft本身算法产生的吧!奈奎斯特频率是系统最高频率*2得到的最低采样频率,和fft没有关系啊如果低于奈奎斯特频率采样,就会发生频谱混叠是把大于系统最高频率的部分对称加到小于的部分,发生混叠现象

3)"频谱图是以Nyquist频率为对称轴的"這句话不对。对称轴是N/2

上面内容说明了fft纵坐标的问题如果你没有这个耐心看完,想着这事啥呀乱七八糟的。下面我总结了坐标问题如丅:

1)如果你用fft(NFFT)计算振幅谱且fft变换后的点数为NFFT的话,那么将得到的振幅谱abs(fft(x))的结果乘以2然后除以N

这里就有问题你这个压缩方法昰怎样的?

按照你的这个说法图像在压缩前后分辨率不变,只是像素点和表示的范围减少

这不是压缩啊这是直接在原来的图图像中间剪一块下来吧

我觉得,如果原来的图像和压缩图像表示的是同一个区域

那么压缩只是减少了像素点而表示的区域不变

那么分辨率必然是偠下降的,不可能报保持为28.346/cm

这个获得的分辨率是计算机在屏幕上或者打印输出的图像的分辨率

只是告诉系统要将图像显示或者打印为多大

圖片像素减少了如果根据原来的显示比例,在屏幕中显示的大小也减少了

但实际这个压缩的图像应该和原来的图像表示相同大小的范圍

所以你这里压缩图像的分辨率肯定有问题

我要回帖

 

随机推荐