不久前的项目需要学习短时傅立叶变换,今天总结一下现阶段对短时傅立叶变换的理解。

短时傅立叶变换是最常用的时频分析方法,用时间窗内的信号表示某一时刻的信号特征。 在短时傅立叶变换过程中,窗的长度决定频谱图的时间分辨率和频率分辨率,窗的长度越长切取的信号越长,信号越长傅立叶变换后的频率分辨率越高,时间分辨率越差,相反,窗的长度越短切取的信号越长也就是说,短时傅立叶变换不能在时间分辨率和频率分辨率之间兼顾,应该根据具体需要进行取舍。

简而言之,短时傅立叶变换是指将一个函数与窗函数相乘,然后进行一维傅立叶变换。 并且,根据窗函数的滑动,可以得到一系列福利也发生了变化的结果,排列这些结果可以得到二维表象。

短时傅立叶变换的公式是

这里,z(t )是源信号,z(t )是窗函数。

为了便于计算机处理,一般对信号进行离散化,具体形式如下

短时傅立叶变换的编程思路如下。

1 .第一步确定相关参数。 主要包括原信号、窗函数、窗长、重复点数、采样频率、傅立叶点数等。

其中,傅立叶点数主要用于傅立叶变换过程中,当信号长度小于傅立叶点数时,系统自动填零,然后进行快速傅立叶变换。

2 .在步骤2中,执行将源信号和窗函数转换为列向量的计算。 计算信号长度,计算从信号长度nx、窗长WinLen以及重复点数noverlap中将窗滑动的次数n,也就是后来将源信号分为列时的信号的列数。

n=fix () NX-nOverlap)/(WinLen-noverlap ) )

3 .将针对每个窗函数幻灯片选择的信号表示为列,确定各列的值,得到列数n、行数WinLen的矩阵Fig。

colindex=(0:(t-1 ) * ) * (双赢重叠);

rowindex=(1:winlen ) ‘;

Xin=Zeros(frame_length,t );

Xin(3360 )=x(Rowindex(:ones(1(1) 1,t ) ) colindex (ones ) winlen,1 ), );

4 .将变换为列向量的窗函数扩展为n列矩阵w,对矩阵Fig和w进行点乘法,对点乘法的结果进行快速傅立叶变换,得到时间频率矩阵。

Xin=win(:ones(1) 1,t ).*xin;

5 .根据时间-频率矩阵,输出频谱图。

以上是我对短时傅立叶变换实现过程的理解。 以后有新的理解,会继续修改完善!