二、从连续到离散:离散傅里叶变换

       上一个博客https://blog.csdn.net/lxhdy12345/article/details/106319168介绍了音频领域的简单的基础知识,并提及了傅里叶变换。那么这一篇博客就重点介绍采样之后的离散序列如何使用傅里叶变换,这也是各种语音算法和前端处理的基础。

       第一个重要的点是周期性抽样串及其傅里叶变换,我们之所以要提及周期性抽样串,是因为它是连续信号到离散信号的桥梁,而且由于其傅里叶变换也是一个频域的周期抽样串所以可以用来对信号进行离散和周期化。

       周期性抽样串,就是以T为周期的无穷个δ函数相加,δ函数是一个奇异函数 ,可以视作在非常短时间内函数值为无穷,但是积分为1的函数,周期性抽样串可以定义为\sum_{n}{\delta(t-nT)},一般在离散的信号处理中,我们将使用值为1的冲击函数做为δ函数,无限个这样的δ函数周期组成了周期性抽样串。周期性抽样串的最大性质就是其傅里叶变换也是一个周期性抽样串,因而可以做到时频域采样:

                                                                             \int{\sum_{n}{\delta(t-nT)}e^{-jwt}}\mathrm{d}t\\ =\sum_{n}{e^{-jwnT}}

要将连续时域函数按照T周期采样,直观的方法就是拿周期性抽样串去和这个连续函数相乘:

                                          

因此我们就可以从连续的时间信号x(t)得到其离散化的信号:

                                                            x_{p}(t)=\sum_{n}x(nT)\delta(t-nT)

对这个离散化的信号做傅里叶变换可以得到离散时间的傅里叶变换:

                                                   X_{p}(w)=\int (\sum_{t}x(nT)\delta(t-nT))e^{-jwt}\mathrm{d}t \\ =\sum_{n}x(nT)\int \delta(t-nT)e^{-jwt}\mathrm{d}t \\ =\sum_{n}x(nT)e^{-jnwT}\\= \sum_{n}{x(n)e^{-jwn}}\\= DTFT[x(n)]

这个就是离散时间傅里叶变换(DTFT)形式,一般这里的T会省略掉,当然要注意每一个离散的时间序列(数组)的数值都是含一个采样的周期T在里面的。时间上离散了,但是上述式子需要求一个频率的相应需要计算无穷时间n的和,仍然不能再计算机上进行计算,那么我们要将信号的频率也进行离散化。这里就要用到δ函数的采样性质,即δ函数与连续的时间函数相卷积可以得到这个函数相同的输出,只不过有时间移位。

连续函数卷积可以定义为:

                                                                 x(t)*y(t)=\int {x(\tau)y(t-\tau)}\mathrm{d}\tau

因此在nT处的δ函数与连续时间函数的卷积可以提取函数在nT处的值:

                                                   \delta(t-nT)*x(t)=\int{\delta(t-\tau-nT)x(\tau)}\mathrm{d}\tau \\ =x(t-nT)

所以通过周期性抽样串和时间函数卷积就可以将时间函数周期化:

                                                           \sum_{n}\delta(t-nT)*x(t)=\\ =\sum_{n}x(t-nT)

                                                       

通过时域的周期化,频域就可以离散化,这是因为时域的卷积在频域是相乘,因此时域的周期化就是在频域上将原来的函数的频谱和一个周期性抽样串相乘,做到了频域的离散,因此离散的傅里叶变换就可以求解了。这里我们假设上面的时域周期性抽样串的采样周期是T0,而我们要对时域信号进行T1周期延拓,假设T1=NT0,那么用于周期延拓的周期性抽样串可以定义为:

                                                                                \sum_{m}{\delta(t-mNT_{0})}

它的离散时间傅里叶变换为:

                                                                          \sum_{n}{\sum_{m}{\delta(n-mNT_{0})}}e^{-jwnT_{0}}

省略掉采样周期T0,然后对求和符号调换:

                                                                             \sum_{n}{\sum_{m}{\delta(n-mN)}}e^{-jwn}\\ =\sum_{m}{\sum_{n}{\delta(n-mN)e^{-jwn}}}\\ =\sum_{m}{e^{-jwmN}}

因为有这个式子:

                                        e^{-jw_{0}n} = \frac{1}{2\pi}\int 2\pi \sum_{k}{\delta(w-w_{0}+2\pi k)e^{jwn}}\mathrm{d}w

因而当w_{0}为0,即只有实数项1时,其傅里叶变换为:

                                                       \sum_{n}{e^{-jwn}}=\sum_{m}{2\pi \delta{(w-2\pi m)}}\\ \sum_{m}{e^{-jwmN}}=\sum_{k}{\frac{2\pi}{N} \delta{(w-\frac{2\pi}{N} k)}}\\

    把上式与离散时间傅里叶变换式子相乘得到离散傅里叶变换:

                                              DFT[x(n)]=DTFT[x(n)*\sum_{m}{\delta(n-mN)}]\\= DTFT[x(n)]\sum_{k}{\frac{2\pi}{N} \delta{(w-\frac{2\pi}{N} k)}}\\ \\=\frac{2\pi}{N}\sum_k X_{p}(w)\delta{(w-\frac{2\pi}{N} k)}\\=\frac{2\pi}{N}\sum_k\sum_{n} x(n)e^{-j\frac{2\pi}{N}nk}

要求某一个频点k的相应,就是:

                                               DFT[x(n)](k)=DTFT[x(n)](w=\frac{2\pi}{N}k)=\frac{2\pi}{N}\sum_{n} x(n)e^{-j\frac{2\pi}{N}nk}

这就是离散傅里叶变换(DFT)的公式,可以发现这个公式相对于DTFT公式,就是在频域w上进行了离散,我们将一个周期的频域分为N份,只能求解其中第k/N个频率分量的响应。

上述的DFT形式可以写做下面的矩阵乘法形式,N点的傅里叶变换可以把N点的时域信号变为N点的频域信号:

                                                       \textbf{f}=\left| \begin{array}{c} \textbf{f} (0)\\ \textbf{f} (1)\\... \\\textbf{f} (N-2)\\ \textbf{f} (N-1)\end{array} \right|= \frac{2\pi}{N} \left| \begin{array}{ccccc} 1 & 1&...&1&1 \\ 1 & e^{-j\frac{2\pi}{N}}&...&e^{-j\frac{2\pi}{N}(N-2)}&e^{-j\frac{2\pi}{N}(N-1)} \\ ... & ...&...&...&...\\1&e^{-j\frac{2\pi}{N}(N-2)}&...&e^{-j\frac{2\pi}{N}(N-2)(N-2)}&e^{-j\frac{2\pi}{N}(N-2)(N-1)}\\ 1&e^{-j\frac{2\pi}{N}(N-1)}&...&e^{-j\frac{2\pi}{N}(N-1)(N-2)}&e^{-j\frac{2\pi}{N}(N-1)(N-1)} \end{array} \right| \left| \begin{array}{c} \textbf{x} (0)\\ \textbf{x} (1)\\... \\\textbf{x} (N-2)\\ \textbf{x} (N-1)\end{array} \right|=\boldsymbol{\mathrm{F}}\textbf{x}

这也是计算机求解傅里叶变换的主要方法,只不过,由于有两重求和上述矩阵乘法的复杂度是O(N*N),这对于求解超长的傅里叶变换是昂贵的。而快速傅里叶变换方法(FFT)将求解上述矩阵乘法的复杂度降低到O(Nlog2(N)),这也是傅里叶变换方法可以真正走入大规模应用的基础。优化上述傅里叶变换的乘法的方法主要在于通过变换矩阵的对称性压缩计算量,这个我们后面有机会再说。这个变换矩阵F非常优美,它是一个复数矩阵,也是一个酉矩阵,就是说,F的共轭转置和其本身相乘可以得到一个单位阵,而且它的共轭转置等于其逆矩阵。简单计算就可以发现有如下式子:

                                                                                        \boldsymbol{\mathrm{F}}\boldsymbol{\mathrm{F^{\mathrm{H}}}}=N\boldsymbol{\mathrm{I}}=N\boldsymbol{\mathrm{F}}\boldsymbol{\mathrm{F}^{-1}}

因此要得到逆离散傅里叶变换\boldsymbol{\mathrm{F}^{-1}}很简单,只要对上述的变换矩阵进行共轭转置操作即可。

在这个过程中我们要注意的几个问题:

1上述离散化过程中的采样率问题,频域上的采样间隔是\frac{2\pi}{N},相当于把一个周期分为了N段,分辨率就是\frac{2\pi}{N},低于这个频率的分量我们是无法求出其大小的,在上面第二张图上表现就是时域混叠,因为函数周期大于周期化的周期了。(图是频域的混叠,这里说的是时域的混叠)

2其实还有一种延拓方式,并非周期延拓,而是对称延拓,得到的变换是离散余弦变换DCT,也是一种非常重要的变换,好处就是变换是实数域上的。

3进行了上述周期化操作之后,原本的序列移位,就要变成循环移位,序列翻转就要变成对称翻转(0位置的序列不变,其他对称翻转)。

4最重要的特点就是共轭对称性质,上面只是说了在变换矩阵上面的表现。具体来说对称性如下图:

有对称性的好处就是可以用N点的FFT计算2N点实信号的的FFT,简单来说我们只要把2N点的信号按照奇偶分别作为一个新的复数信号的实部和虚部,然后对这个复数信号做FFT,然后求这个输出的共轭偶分量和共轭奇分量即为原来的两个实信号的FFT。

看似只是书本上的数学变换,但是这个对于实际运用意义很大,因为一般来说双声道的左右声道的信号是按照一左一右的顺序在缓存中排列的,利用上面的方法就可以同时处理双声道的傅里叶变换,也算实际处理的小trick了。

5最后提一下变换矩阵,这个变换矩阵是一个线性变换,有N个输入就有N个输出,用卷积神经网络的结构来说,就是有N个卷积核,但是由于是复数的,相当于有2N个实数卷积核,其中N个是正弦基N个是余弦基,在tensorflow等框架中实现傅里叶变换也可以通过一个2N个卷积核的一维卷积层实现。一般来说2N个实数基的卷积核算是完备变换了,超过2N的卷积核是过完备的,这种变换在现在端到端的语音模型中(比如Conv-Tasnet等)达到了比传统基于傅里叶变换的模型更高的性能。

 

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值