一、傅里叶变换 (FT)

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

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

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

源代码:1368069096/From_FT_to_WT_examples-

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

1、离散傅里叶变换(DFT)

在上一篇文章里,我们讲解了FT的本质(1335:从傅里叶变换进阶到小波变换(一))。

在本文正式开始之前,我们需要明确一下实际信号进行的FT的一些特殊之处。实际采集的信号往往是这样的:




java 如何实现 离散小波 离散小波变换特点_java 如何实现 离散小波


实际的信号往往具有两个特点:1、离散性,就是采集数据不连续,很容易理解,采集信号肯定是一个一个数据采集的;2、有限性,虽然理想的傅里叶变换是从


进行积分,但是实际信号往往实在一个区间内(a,b)的。


所以,我们要用到离散傅里叶变换(DISCRETE FOURIER TRANSFORM,简称DFT),DFT与FT相比,就是多了两个特征:1、离散型,2、有限性。

来,我们来一起试一试如何推导DFT公式。首先设采集了N个信号点,其时刻为


,对应时刻采集到的信号值为


。很自然的,原来信号连续,是积分,现在数据离散了,那就是把积分变成累加。于是我们得到:



这么一来,我们发现,原信号有N个数据点,DFT变换后的信号却变成连续的了,我们将之称为离散时间傅里叶变换(DISCRETE TIME FOURIER TRANSFORM,简称DTFT)

DTFT有两个缺点,第一,


且连续,需要进行无数次计算,计算机无法计算;第二,在进行计算的时候,我们需要已知:



,但是调用过FFT函数的同学都知道,FFT只需要已知


就可以进行。


这是怎么回事呢?

首先,我们使用相对采样时间


代替真实采样时间

可以得到:


此时我们发现,


变成了以


为周期的函数,即



那么,我们只需要计算


区间的


,就可以得到


区间的


了。也就是说,通过使用相对采样时间


代替真实采样时间


,我们将


的范围从


缩小到了



自然地,我们希望将


离散化称为N个点,这样计算机就可以计算了!则取


,则有:



好了,这就是离散傅里叶变换DFT了!

接下来,来看DFT的两个性质:

第一,


,即


是所有元素的和,通常会比其他的元素大几个数量级。


第二,




,即第二个元素和最后一个元素共轭,同理有


等等。


如下图所示,DFT之后的


个元素中,第一个为均值;之后的


个元素,只有一半元素是独立的。


java 如何实现 离散小波 离散小波变换特点_离散小波变换每层维数_02


需要说明,这里


是一种相对频率,独立元素中,最小相对频域为1,最大相对频率为


要想把

还原到真实的频率

,只需要

,将

映射到

即可

为采样频率。

PS:简单说一下,根据香农采样定理,当采样频率为


时,能采到的最大信号频率为


。因此,将相对频率


通过公式


,得到的


就在区间


内,也就是真实频率的区间了。


所以DFT公式为:



PS:DFT公式的形式很多,有的是从时域到频域,有的是从空间域到频域,但是本质都是一样的,抓住离散性有限性两个特点即可。离散性是指积分变成了累加,有限性是指积分/累加区间不是


了,而是一个有限区间了。

2、傅里叶变换(FT)的缺点

应该说明,虽然本小节的题目是FT的缺点,但是FT和DFT的本质是相同的。由于信号都是有限长度的、离散的,所以接下来进行的都是DFT,不过在某些部分为了方便理解,还是写了FT的公式。在看本文的时候,你不需要刻意区分这两个概念。

我们现在来看两个信号,如下图:




java 如何实现 离散小波 离散小波变换特点_时域_03


java 如何实现 离散小波 离散小波变换特点_时域_04


这两个信号都是由sin(t)和sin(5t)组成的,y1是先出现了sin(5t),再出现了sin(t),y2是先出现了sin(t),再出现了sin(5t)。

我们对它们进行FT,看看他们包含怎么样的频率,如下图:


java 如何实现 离散小波 离散小波变换特点_java 如何实现 离散小波_05

y1,FT

java 如何实现 离散小波 离散小波变换特点_离散小波变换每层维数_06

y2,FT

Amazing!发现了什么?变换后的结果是一模一样的,都在w=1rad/s和w=5rad/s出现了峰值!这就可以说明FT的缺点了——FT只能提供频域信息,而完全丢失了时域信息!!!

不管某一频率的信号出现的时间是早还是晚,FT都是将它一视同仁地乘上sin和cos(FT的变换基函数),然后在整个时间区间加和。因此,它不能提供某一频率信号出现的时间。

比如,对于上面两个信号,FT只能告诉我们,它们都有1rad/s和5rad/s的频率,而不能告诉我们1rad/s和5rad/s分别出现在哪个时间段。

所以,怎么办呢???

先别看下面,你自己想三想,你肯定可以想到的!

想一想——

想二想——

想三想——

好了,你想的是对的!

那就是把信号分成左右两半啊!左边进行一次FT,右边进行一次FT,很简单吧!好了,这就是短时傅里叶变换(STFT)的基本原理。

所以,接下来我们要正式开始步入——短时傅里叶变换(STFT),看看它是如何解决这个问题的。

3、短时傅里叶变换(STFT)

如上所述,我们将信号从中间截断,左边进行一次FT,右边进行一次FT,分别来看看。


java 如何实现 离散小波 离散小波变换特点_傅里叶变换_07

y1左

java 如何实现 离散小波 离散小波变换特点_时域_08

y1右

java 如何实现 离散小波 离散小波变换特点_基函数_09

y2左

java 如何实现 离散小波 离散小波变换特点_时域_10

y2右

可以看出,y1的左半部分是5rad/s,右半部分是1rad/s,y2恰好相反。这就说明,在y1中,(0, 25)的信号是5rad/s的频率,(25, 50)的信号是5rad/s的频率,y2恰好相反。这就是短时傅里叶变换的基本原理。

但是数学嘛,能用一个公式表达的,就别用一段话表达,截断、切开这些语句太不专业了。截断、切开的操作,更专业的讲叫作分窗,其实是可以通过数学上的处理变成DFT变换的基函数的一部分的。接下来我们来看一看。

首先,你可以想象一下,有一个窗子在这个信号上从左向右滑动,每次你都只能看到这个信号的一部分,所以我们把这个长度叫作窗长width。

现在我们来定义一个方窗函数:


,如下图,即是width = 10 的一个方窗函数:


java 如何实现 离散小波 离散小波变换特点_时域_11


定义了方窗函数之后,我们只需要对方窗函数进行平移,再与原信号作乘,就相当于原来的截断、切开的操作,因此这种操作更专业地叫作分窗。

那么,将方窗函数向右平移了


(s可能是sliding的意思吧),再与原信号相乘,由于方窗函数除了中心的width部分是1外,其他部分都是0,这就相当于提取出了原信号在

处,宽度为width的部分,这个信号分窗这个操作就可以写成:


如下两图所示,将



相乘,就相当于取出来了


中的(20,30)中的一段。


java 如何实现 离散小波 离散小波变换特点_离散小波变换每层维数_12


java 如何实现 离散小波 离散小波变换特点_傅里叶变换_13


那么,我们对原信号中被提取出来的这一部分进行FT,就可以写成:



PS:这里之所以


要变成


,是为了保证做FT的时候相乘的基函数具有统一性。


如此,变换后的


代表

原信号在

处、宽度为width的部分的傅里叶变换,也就可以提取出来 原信号在

处、宽度为width的部分,包含各个频率部分的多少!带入不同的

,也就是随着窗子的滑动,就可以知道不同的时间段内频率的成分。

我们采用width为10的方窗函数对


进行STFT,如下:


首先,方窗函数位于


处,与原始信号相乘,选择出(0,10)的信号。


java 如何实现 离散小波 离散小波变换特点_java 如何实现 离散小波_14


对选择出来的信号进行FT。可以看到,当


时,选择的时间区间为(0,10),这一部分只包含了


的频率成分。


java 如何实现 离散小波 离散小波变换特点_java 如何实现 离散小波_15


之后,方窗函数向右移动,与原始信号相乘,选择出不同时间区间的信号,进行FT。这里选择


进行展示。


java 如何实现 离散小波 离散小波变换特点_时域_16


java 如何实现 离散小波 离散小波变换特点_时域_17


可以看到,当


时,选择的时间区间为(20,30),这一部分即包含了


的频率成分,也包含了


的频率成分。


重复以上过程,我们可以将方窗函数选择的不同时间区间的信号的FT的结果拼合起来,形成一张三维图。由此,我们即可知道,


的时间区间内,信号具有怎么样的频率成分。

java 如何实现 离散小波 离散小波变换特点_傅里叶变换_18


通过width = 10的方窗的STFT结果,我们可以知道,对于信号:


,在(0,10)、(10,20)时间区间内,具有20rad/s的频率成分;在(20,30)时间区间内,具有1rad/s和20rad/s的频率成分;在(30,40)、(40,50)时间区间内,具有1rad/s的频率成分。


最后,进行三点重要的讨论。

第一点,变换之后的


是一个三维函数,它有两个自变量,

和w。

指的是

原信号在

处,w上一篇文章我们已经讨论过了,就是频率。所以,STFT提取出来的信息就是: 原信号在

处、宽度为width的部分,包含的频率信息。

原则上讲,可以得到任一


对应的频率成分,如下图。

java 如何实现 离散小波 离散小波变换特点_离散小波变换每层维数_19


但是


是连续的,并不意味着你知道了每个时刻的频率成分,你知道的还只是

这一段区间内的频率信息。所以一般不需要计算所有的

,每隔width计算一次即可。

你或许会想,我把width缩小一些,不就可以知道更精确的时间范围内的频率了吗?是的,你的猜想很对!但是,如此做也会带来一些频域分辨率的问题。这一点涉及到一些时域分辨率和频域分辨率的知识,我们下一篇文章会着重讲。

第二点,方窗函数是可以包含入变换基函数内部的,这组成了新的基函数,同时反映了STFT的本质。

我们来看, 如果定义


,那么



那么,STFT的公式:


就可以写成:



我们在上一篇文章里说过,变换就是将原信号乘上一个基函数,再积分的过程,那么,SDFT的基函数就是


Amazing!所以,STFT的本质是什么呢?

STFT的本质就是将FT的基函数


乘上一个方窗函数,形成了一个新的基函数

前面说的分窗、截断之类的都是表象, STFT的本质是基函数的改变!

那么,为什么STFT的基函数可以用于分窗,而FT的基函数不行呢?我们来看,我用正弦函数sin(5t)表示原来的基函数


,那么FT基函数和STFT基函数如下:


java 如何实现 离散小波 离散小波变换特点_时域_20


java 如何实现 离散小波 离散小波变换特点_时域_21


原因就是:FT的基函数是在时域无限延伸的,因此,无论怎么平移,都是任分布在整个时域的,起不到分窗的作用。而STFT的基函数只在时域一段不为0,在剩下的时域都是0,因此,STFT的基函数的平移,就相当于自动加了窗子啦!

这种只在时域一段不为0,在剩下的时域都是0的性质被称为“紧支撑性”(compactly supported),具有这种性质的函数,平移之后与一个信号相乘,就相当于分窗操作。这一点很重要,我们之后讲小波变换的基函数的时候还会讲。

第三点,我们前面对于分窗操作使用的函数一直称为“方窗函数”,这是一种最理想的窗函数。还有一些其他的窗函数,比如,汉宁窗、海明窗、高斯窗等。窗函数本质都是一个窗子而已,原理是一模一样的,上面所有的讨论也都成立,只是这些窗子会让信号稍稍变形一丢丢而已。你就想像方窗函数就是一面平面镜,其他的窗函数就是哈哈镜就行了。

1335:从傅里叶变换进阶到小波变换(一)zhuanlan.zhihu.com

1335:从傅里叶变换进阶到小波变换(三)zhuanlan.zhihu.com

1335:从傅里叶变换进阶到小波变换(四)zhuanlan.zhihu.com