一、傅里叶变换 (FT)

二、傅里叶变换(FT)的缺点与短时傅里叶变换(STFT)

三、短时傅里叶变换(STFT)的缺点与连续小波变换(CWT)

四、连续小波变换(CWT)的缺点与离散小波变换(DWT)

源代码:1368069096/From_FT_to_WT_examples-

三、短时傅里叶变换(STFT)的缺点与连续小波变换(CWT)

1、分辨率问题

首先,我们需要了解一下海森堡测不准原理:





为信号的时间不确定度,



为信号的频率不确定度。即,我们永远


无法同时确定一个信号的确切时间和确切频率。


原因比较简单,频率其实就是时域周期性。如果我只给你一个数据点,问你这个数据点的频率是多少,这肯定是做不到的。要确定频率,就需要一个时域区间(包含几个时域周期)的信号。

时域区间越宽,信号的时间定位越不准,时间不确定度



越大,但是得到的频率越准,频率不确定度



越小;我们称之为:


低的时域分辨率,高的频域分辨率。


时域区间越窄,信号的时间定位越准,时间不确定度



越小,但是得到的频率越不准,频率不确定度



越大;我们称之为:


高的时域分辨率,低的频域分辨率。




python 利用小波变换进行特征提取算法 小波变换提取频率_频域


python 利用小波变换进行特征提取算法 小波变换提取频率_时域_02


如上两图,对于第一个图中


的信号,要确定频率,即使把


都拿来,还是不太准,因为只包含了一个周期;对于第二个图中


的信号,要确定频率,取个


就差不多了,因为已经包含了好几个周期了。


我们来总结一下。

对于低频信号,为了更好地确定频率,我们希望,时域区间宽一些,即时间不确定度


大一些,根据海森堡测不准原理,频率不确定度


自然小一些;即

低频信号,我们希望:宽窗子,低的时域分辨率,高的频域分辨率。

对于高频信号,为了更好地在时域定位,我们希望,时域区间窄一些,即时间不确定度


小一些,根据海森堡测不准原理,频率不确定度


自然大一些;即

高频信号,我们希望:窄窗子,高的时域分辨率,低的频域分辨率。

python 利用小波变换进行特征提取算法 小波变换提取频率_matlab小波变换频率确定_03


上图所示是我们希望的动态分辨率。图中每个小矩形的


轴方向的宽度是时间区间大小,


轴方向的宽度是频率区间大小。注意,每个小矩形的面积是相等的,这保证了时域分辨率乘上频域分辨率是定值,最大程度满足海森堡测不准原理。通过图可以看出,我们希望,

对于低频信号:低的时域分辨率,高的频域分辨率;对于高频信号:高的时域分辨率,低的频域分辨率。

对于整体低频、局部高频的信号,这种动态调整分辨率的规则特别有用。在实际信号中,频率非常高的高频信号往往是一种噪声,只在局部出现,基本都满足整体低频、局部高频这一条件。

最后,我们再来看两张分辨率图来强化一下对于分辨率的理解。


python 利用小波变换进行特征提取算法 小波变换提取频率_matlab小波变换频率确定_04


上图是一张采集信号的分辨率图。每个小矩形的


轴方向的宽度是很小,


轴方向的宽度很大。也就是说,

其时域分辨率很好,可以确切地确定每个信号采样点的时间,但是其频域分辨率很差,或者说完全不具有频域分辨率。

python 利用小波变换进行特征提取算法 小波变换提取频率_母函数_05


上图是一张傅里叶变换(FT)的分辨率图。每个小矩形的


轴方向的宽度是很大,


轴方向的宽度很小。也就是说,

其频域分辨率很好,可以比较精确地确定信号中的频率成分,但是其时域分辨率很差,或者说完全丢失了时域分辨率。

傅里叶变换的这一特性,这一点我在上一篇文章里讲过,这也是我们转而使用短时傅里叶变换(STFT)的原因。

2、短时傅里叶变换(STFT)的缺点

我们来回忆一下STFT(详见:1335:从傅里叶变换进阶到小波变换(二)),STFT的窗长是固定的,即时域分辨率是固定的,根据海森堡测不准原理,其频域分辨率也是固定的。其分辨率图如下:


python 利用小波变换进行特征提取算法 小波变换提取频率_matlab小波变换频率确定_06


每个小矩形的


轴方向的宽度和


轴方向的宽度是恒定的!也就是说,不论高频低频,其时域和频域分辨率都不可调,这与我们之前讨论的“对于低频信号:低的时域分辨率,高的频域分辨率;对于高频信号:高的时域分辨率,低的频域分辨率”这一原则不符合。


这种不符合会带来什么后果呢?

如图所示正弦信号,0~250ms:300HZ,250~500ms:200HZ ,500~750ms:100HZ , 750~1000ms:50HZ。


python 利用小波变换进行特征提取算法 小波变换提取频率_母函数_07


选择一个较窄的窗子


做STFT,结果如下:


python 利用小波变换进行特征提取算法 小波变换提取频率_第二代小波变换和第一代小波变换的应用比较_08


当窗子较窄的时候,STFT的时域分辨率还行,但是频域分辨率不佳。

我们选择一个宽一些的窗子


做STFT,结果如下:


python 利用小波变换进行特征提取算法 小波变换提取频率_频域_09


当窗子较宽的时候,STFT的频域分辨率很好,基本可以确定频率,但是时间轴上开始出现交叠了,也就是时域分辨率下降了。

我们选择一个更宽的窗子


做STFT,结果如下:


python 利用小波变换进行特征提取算法 小波变换提取频率_第二代小波变换和第一代小波变换的应用比较_10


当窗子更宽的时候,STFT的频域分辨率非常好了,但是时域分辨率已经很差了,时间轴上出现了大规模的交叠现象。

我们来总结一下,对于STFT,如果窗子的宽度选择合适,是可以得到时域和频域分辨率都“还可以”的结果的(由于STFT的分辨率固定,只能说“还可以”,不能说“满意”,因为我们最想要的是动态分辨率)。但是,在变换之前,我们也不知道选择多宽的窗子是合适的。

这就是STFT的缺点:1、时间和频率分辨率都固定,不能随着频率的高低实现动态可调;2、选择一个合适的窗宽十分困难。

3、连续小波变换(CWT)

为了实现动态分辨率,我们引入了小波母函数。

需要说明,小波母函数并不是一个特定的函数,而是一种函数的集合,满足了一定条件的函数均可以作为小波母函数。小波母函数


需要满足的有:


条件1,紧支撑性:


,即

仅在一小部分定义域里不为0,剩下部分均为0。这个性质带来的便利我们在前一篇文章讲过了,就是 具有紧支撑性的基函数,在原信号的时间轴上平移,就相当于对于原信号就行了加窗操作。

条件2,波动性:


,即在所有定义域内积分值为0,这说明小波母函数是一个波。


条件3,容许条件:


,这个条件使变换可逆。其中,


是小波函数傅里叶变换的共轭。由3可知


,也就是条件2。


条件4,正交性:这个条件也是为了使变换可逆。

PS:条件3、4的数学证明比较复杂,所以仅仅提了一下他们的作用,就是使得变换可逆。


python 利用小波变换进行特征提取算法 小波变换提取频率_matlab小波变换频率确定_11


上图就是一个小波母函数的例子,我们看到了:

1、紧支撑性:仅在一小部分定义域里不为0,剩下部分均为0;2、波动性: 在所有定义域内积分值为0。这两个条件是满足的。

小波母函数既然是一个波,那么就具有频率。根据我们第一篇文章讲的内容(1335:从傅里叶变换进阶到小波变换(一)),将小波母函数作为基函数,与采集到的信号相乘并积分,可以筛选出:信号在小波母函数非0部分,频率与小波母函数相近的成分。

需要说明,不同于FT的基函数


,小波母函数不具有特定的某一频率,而是具有一个范围内的频率,因此筛选的是一定范围的频率,类似于一个带通滤波器。


接下来我们讲一讲,小波母函数的变换,变换公式如下:



一是平移,用上式中的


控制,


改变,就相当于


在时间轴上不断的平移。


二是缩放,用上式中的


控制。


变换后的函数


称为小波函数。


如下图,中间的图,


较小,相当于挤压;右侧的图,

较大,相当于拉伸。变换公式前的

是为了能量守恒,没有特别目的。


python 利用小波变换进行特征提取算法 小波变换提取频率_时域_12


我们再来仔细观察一下上图。中间的图,


较小,相当于挤压,是不是频率提高了?右侧的图,

较大,相当于拉伸,是不是频率降低了?咦?有点意思了吧?缩放就是改变频率!另外, 一定记住,

越大,频率

越低,

是倒数关系。

我们再来更仔细地观察一下上图。回忆一下上一篇文章,具有紧支撑性的基函数,滑动相当于分窗。那么,这个窗长有多大呢?是不是就是基函数不为零的长度呢?那么,中间的图,


较小,相当于挤压,频率提高了,窗长是不是变小了?右侧的图,

较大,相当于拉伸,频率降低了,窗长是不是变大了?

这不正是我们需要的“低频,宽窗,差的时间分辨率,好的频域分辨率;高频,窄窗,好的时间分辨率,差的频域分辨率”吗?


python 利用小波变换进行特征提取算法 小波变换提取频率_matlab小波变换频率确定_03


和上图对一下,是不是一模一样了呢?这就是动态调分辨率,得来全不费工夫啊!

接下来我们对一个信号就行一次连续小波变换(CWT)。下图中蓝色部分为小波函数(但原图没画成波的形式,只是表示小波函数的时间轴位置和不为0的部分的宽度),黄色部分为信号。


python 利用小波变换进行特征提取算法 小波变换提取频率_matlab小波变换频率确定_14

图源:THE WAVELET TUTORIAL

如上图,选择较小的


对小波母函数进行缩放,此时小波函数频率较高,窗子较窄(小波函数不为0的部分窄),用来筛选高频部分。小波函数在时间轴上平移,每一次平移就先相乘,再积分,筛选出信号中与自己频率相近的部分。


此时,窗子较窄(小波函数不为0的部分窄),时间分辨率好,频率分辨率差。


python 利用小波变换进行特征提取算法 小波变换提取频率_频域_15

图源:THE WAVELET TUTORIAL

如上图,将


增大,对小波母函数进行缩放,此时小波函数频率降低,窗子变宽(小波函数不为0的部分变宽),用来筛选中频部分。小波函数在时间轴上平移,每一次平移就先相乘,再积分,筛选出信号中与自己频率相近的部分。


此时,窗子变宽了(小波函数不为0的部分变宽),时间分辨率变差,频率分辨率变好。


python 利用小波变换进行特征提取算法 小波变换提取频率_第二代小波变换和第一代小波变换的应用比较_16

图源:THE WAVELET TUTORIAL

如上图,将


进一步增大,对小波母函数进行缩放,此时小波函数频率再次降低,窗子更宽(小波函数不为0的部分更宽),用来筛选低频部分。小波函数在时间轴上平移,每一次平移就先相乘,再积分,筛选出信号中与自己频率相近的部分。


此时,窗子很宽(小波函数不为0的部分很宽),时间分辨率差,频率分辨率很好。

这就是连续小波变换CWT啦!

将上述CWT的过程写成公式就是:



注意:上图中我们只列举了三种


(即三次缩放)和4种


(每种缩放对应四个时间位置,但是事实上,


是连续的,无穷多个的。


还是这个正弦信号,0~250ms:300HZ,250~500ms:200HZ ,500~750ms:100HZ , 750~1000ms:50HZ。


python 利用小波变换进行特征提取算法 小波变换提取频率_频域_17


其小波变换如下图所示(忽略图中坐标,原图如此,坐标不太对,还得映射一下,有空了我自己再画一张改一改):


python 利用小波变换进行特征提取算法 小波变换提取频率_频域_18

图源:THE WAVELET TUTORIAL

我们来看,绿色的小峰,对应小的


,也就是高的频率。他们的

时间分辨率很好

的区间很小,根据


的倒数关系,对应的


的区间就很大,因此

频率分辨率不好

粉色的高峰,对应高的


,也就是低的频率,


的区间很大,根据


的倒数关系,对应的


的区间就很小,因此

频率分辨率很好,时间分辨率不好(有混叠)。

这也就再一次说明了CWT是动态分辨率的,这也是CWT相对于STFT的优势所在。

4、FT、STFT、CWT基函数对比

最后,再来看看,FT、STFT、CWT的基函数之间的不同,以便加深理解。


python 利用小波变换进行特征提取算法 小波变换提取频率_时域_19

图源:百度图片

FT的基函数,是分布在



,不具有紧支撑性,只能筛选频率,使得FT完全丧失了时间信息,不具有时间分辨率。


STFT的基函数,是用窗函数截断的


(图中是被高斯窗截断的),具有了紧支撑性,时域平移等同于分窗,使得STFT既能筛选频率,也能筛选时间。但是STFT基函数是:先确定频率,再与窗函数相乘构成的。因此不同的频率,具有同样的时间和频率分辨率。另外,窗函数的长短也比较难以确定。


CWT的基函数,是小波函数,具有紧支撑性,时域平移等同于分窗,使得CWT既能筛选频率,也能筛选时间。小波函数在改变频率的时候,是通过“缩放”实现的,这使得小波函数在改变频率的同时,改变了窗长。因此不同的频率,具有不同的时间和频率分辨率,实现了分辨率动态可调。

最后,再说一下,有很多类型的小波母函数,比如haar小波,db系列小波,sym系列小波,coif系列小波等等等等。具体哪一个小波适应哪种情况,估计都能写一本书了,我也没深入钻研过。我在利用小波变换做肌电信号识别的时候就是读一读有关肌电信号识别的论文,看看别人试过哪些小波,是一种上手比较快的方法。