引言:尽管离散傅里叶变换(DFT)让频谱分析技术在计算机上的实现成为可能,但是受限于DFT算法庞大的计算量 O(N2)O(N^2)O(N2),使得DFT在一开始并没有被广泛使用,直到快速傅里叶变换算法(FFT)的提出,使得计算复杂度降至 O(N⋅logN)O(N\sdot logN)O(N⋅logN) 。从此,DFT技术如雨后春笋般在更各领域大显身手。那么今天这篇博文,我们就和大家一起来剖析一下FFT算法的推导过程。【注:由于FFT算法有几种版本,因此我们这里重点关注“库利-图基”算法】。


【注:本文虽然涉及大量公式推导,但是博主相信只要大家从第一行开始跟着一步一步往下推是一定可以顺利推出来滴!!】


要解决的事情(如何用更短的序列计算N点DFT?)

【说明】:以下的推导,我们考虑的是长度为N的序列(N假定为2的幂)

现在我们有一个离散序列 x[n]x[n]x[n],我们首先回顾一下它的直接N点 DFT公式:X[k]=∑n=0N−1x[n]WNknX[k] = \sum_{n=0}^{N-1}x[n]W_N^{kn}X[k]=n=0∑N−1​x[n]WNkn​
其中,这个 WNknW_N^{kn}WNkn​ ,其具体的表达式如下:WNkn=e−j2πNknW_N^{kn} = e^{-j\frac{2π}{N}kn}WNkn​=e−jN2π​kn


我们首先来思考一下DFT的计算复杂度,从上面这个公式我们可以知道:计算每一个X[k]的值,都需要做 N 次的复数乘法和 (N-1) 次的复数加法,而 X[k] 一共有 N 个点,所以完成所有 X[k] 的计算一共需要 N2N^2N2 次复数乘法和 N(N−1)N(N-1)N(N−1) 次的复数加法。计算量还是很大的。

下面我们就思考:能不能用较短的序列的DFT计算这个较长的N点DFT呢?—— 首先容易想到的办法是:能不能把 x[n]x[n]x[n] 拆成偶数项 g[n]g[n]g[n] 和 奇数项 h[n]h[n]h[n] 这样一来,g[n],h[n]g[n], h[n]g[n],h[n] 分别都是长度为 N/2N/2N/2 的序列,这两个序列的 DFT 能不能通过什么关系来表示出 X[k]X[k]X[k]呢?我们来试试看:

X[k]=∑n=0N−1x[n]WNkn=∑r=0N/2−1x[2r]WN2rk+∑r=0N/2−1x[2r+1]WN(2r+1)k\begin{aligned} X[k] &= \sum_{n=0}^{N-1}x[n]W_N^{kn}\\ &=\sum_{r=0}^{N/2-1}x[2r]W_N^{2rk}+\sum_{r=0}^{N/2-1}x[2r+1]W_N^{(2r+1)k} \end{aligned} X[k]​=n=0∑N−1​x[n]WNkn​=r=0∑N/2−1​x[2r]WN2rk​+r=0∑N/2−1​x[2r+1]WN(2r+1)k​​

我们从上面的式子里面可以注意到:第二项里面的 WN(2r+1)kW_N^{(2r+1)k}WN(2r+1)k​是可以拆开的,这里用到了 WNkW_N^kWNk​的一个性质,如下:WN(2r+1)k=e−j2πN(2r+1)k=e−j2πN2rk⋅e−j2πNk=WN2rk⋅WNkW_N^{(2r+1)k} = e^{-j\frac{2π}{N}(2r+1)k} =e^{-j\frac{2π}{N}2rk}\sdot e^{-j\frac{2π}{N}k} = W_N^{2rk}\sdot W_N^{k}WN(2r+1)k​=e−jN2π​(2r+1)k=e−jN2π​2rk⋅e−jN2π​k=WN2rk​⋅WNk​

所以,我们把第二项里面这个与 rrr 无关的 WNkW_N^kWNk​提出来,就变成:X[k]=∑r=0N/2−1x[2r]WN2rk+WNk∑r=0N/2−1x[2r+1]WN2rk=∑r=0N/2−1g[r]WN2rk+WNk∑r=0N/2−1h[r]WN2rk\begin{aligned} X[k] &=\sum_{r=0}^{N/2-1}x[2r]W_N^{2rk} + W_N^k\sum_{r=0}^{N/2-1}x[2r+1]W_N^{2rk}\\ &=\sum_{r=0}^{N/2-1}g[r]W_N^{2rk} + W_N^k\sum_{r=0}^{N/2-1}h[r]W_N^{2rk} \end{aligned} X[k]​=r=0∑N/2−1​x[2r]WN2rk​+WNk​r=0∑N/2−1​x[2r+1]WN2rk​=r=0∑N/2−1​g[r]WN2rk​+WNk​r=0∑N/2−1​h[r]WN2rk​​
下面又遇到困难了:我们这里的 g[n],h[n]g[n], h[n]g[n],h[n]明明都是长度为 N/2N/2N/2的序列,你这里的 W 下标怎么还是 NNN ?与DFT的定义不一致啊!别急,所以我们下面做这样的变形:X[k]=∑r=0N/2−1g[r](WN2)rk+WNk∑r=0N/2−1h[r](WN2)rk\begin{aligned} X[k] &=\sum_{r=0}^{N/2-1}g[r](W_N^{2})^{rk} + W_N^k\sum_{r=0}^{N/2-1}h[r](W_N^{2})^{rk} \end{aligned} X[k]​=r=0∑N/2−1​g[r](WN2​)rk+WNk​r=0∑N/2−1​h[r](WN2​)rk​
下面我们用用到了这样一个性质:WN2=WN/21W_N^2 = W_{N/2}^1WN2​=WN/21​,我们下面简单证明一下:WN2=e−j2πN2=e−j4πNW_N^2 = e^{-j\frac{2π}{N}2} = e^{-j\frac{4π}{N}} WN2​=e−jN2π​2=e−jN4π​
而:WN/21=e−j2πN/21=e−j4πNW_{N/2}^1 = e^{-j\frac{2π}{N/2}1} = e^{-j\frac{4π}{N}} WN/21​=e−jN/22π​1=e−jN4π​因此得证。
有了这样得关系,上面的式子我们继续又可以写成:X[k]=∑r=0N/2−1g[r](WN/21)rk+WNk∑r=0N/2−1h[r](WN/21)rk=∑r=0N/2−1g[r]WN/2rk+WNk∑r=0N/2−1h[r]WN/2rk\begin{aligned} X[k] &=\sum_{r=0}^{N/2-1}g[r](W_{N/2}^{1})^{rk} + W_N^k\sum_{r=0}^{N/2-1}h[r](W_{N/2}^{1})^{rk}\\ &=\sum_{r=0}^{N/2-1}g[r]W_{N/2}^{rk} + W_N^k\sum_{r=0}^{N/2-1}h[r]W_{N/2}^{rk} \end{aligned} X[k]​=r=0∑N/2−1​g[r](WN/21​)rk+WNk​r=0∑N/2−1​h[r](WN/21​)rk=r=0∑N/2−1​g[r]WN/2rk​+WNk​r=0∑N/2−1​h[r]WN/2rk​​
那么我们但看这一项:∑r=0N/2−1g[r]WN/2rk\sum_{r=0}^{N/2-1}g[r]W_{N/2}^{rk}∑r=0N/2−1​g[r]WN/2rk​这不恰好就是 g[r]g[r]g[r] 的DFT嘛!而且是 N/2N/2N/2 点的!
所以,现在的 X[k]X[k]X[k] 我们就可以写成:X[k]=G[k]+WNkH[k]X[k] = G[k] + W_N^kH[k]X[k]=G[k]+WNk​H[k]
但是,需要特别注意的是,此时我们的 kkk 的取值范围只是:k=0,1,2,⋯,N2−1k = 0,1,2,\cdots, \frac{N}{2}-1k=0,1,2,⋯,2N​−1,因此,上面这个式子算出来的,只是 X[k]X[k]X[k] 的前 N/2N/2N/2 个,也就是一半,那么剩下的另一半应该如何计算呢?我们接着看:

因为我们现在的 kkk 的范围是:k=0,1,2,⋯,N2−1k = 0,1,2,\cdots, \frac{N}{2}-1k=0,1,2,⋯,2N​−1,所以使得 X[k]X[k]X[k]只表示一半的值。那么,如果我们令 k′=k+N/2k' = k + N/2k′=k+N/2,这样一来,新的 k′k'k′ 的取值范围就是:k′=N2,N2+1,⋯,N−1k' = \frac{N}{2}, \frac{N}{2}+1, \cdots, N-1k′=2N​,2N​+1,⋯,N−1
所以我们欲求X[k]X[k]X[k]的后半部分,也就是计算:X[k+N2]X[k + \frac{N}{2}]X[k+2N​]。我们首先回顾一下刚刚我们都得到了什么式子:X[k]=∑r=0N/2−1x[2r]WN2rk+∑r=0N/2−1x[2r+1]WN(2r+1)kX[k] =\sum_{r=0}^{N/2-1}x[2r]W_N^{2rk}+\sum_{r=0}^{N/2-1}x[2r+1]W_N^{(2r+1)k}X[k]=r=0∑N/2−1​x[2r]WN2rk​+r=0∑N/2−1​x[2r+1]WN(2r+1)k​
那么,我们把上面这个式子里面的 kkk 替换成:k+N2k + \frac{N}{2}k+2N​,就可以得到:X[k+N2]=∑r=0N/2−1x[2r]WN2r(k+N2)+∑r=0N/2−1x[2r+1]WN(2r+1)(k+N2)=∑r=0N/2−1x[2r]WN2kr⋅WNrN+∑r=0N/2−1x[2r+1]WN2rk⋅WNrN⋅WNk⋅WNN2\begin{aligned} X[k+\frac{N}{2}] &=\sum_{r=0}^{N/2-1}x[2r]W_N^{2r(k+\frac{N}{2})}+\sum_{r=0}^{N/2-1}x[2r+1]W_N^{(2r+1)(k+\frac{N}{2})}\\ &=\sum_{r=0}^{N/2-1}x[2r]W_N^{2kr}\sdot W_N^{rN} + \sum_{r=0}^{N/2-1}x[2r+1]W_N^{2rk}\sdot W_N^{rN}\sdot W_N^k\sdot W_N^{\frac{N}{2}} \end{aligned}X[k+2N​]​=r=0∑N/2−1​x[2r]WN2r(k+2N​)​+r=0∑N/2−1​x[2r+1]WN(2r+1)(k+2N​)​=r=0∑N/2−1​x[2r]WN2kr​⋅WNrN​+r=0∑N/2−1​x[2r+1]WN2rk​⋅WNrN​⋅WNk​⋅WN2N​​​
大家看到这个式子是不是觉得有点奇怪,但是没关系,我们把这些 WWW 都变成指数就明白了:

  1. 首先, WNrNW_N^{rN}WNrN​可以变成:(WNN)r(W_N^N)^r(WNN​)r,那么 ,我们就有:WNN=e−j2πNN=e−j2π=1W_N^N = e^{-j\frac{2π}{N}N} = e^{-j2π} = 1WNN​=e−jN2π​N=e−j2π=1因此我们就可以知道:(WNN)r=1(W_N^N)^r=1(WNN​)r=1。
  2. 下面我们看第二项最后的那个:WNN2W_N^{\frac{N}{2}}WN2N​​,它展开成指数形式就是:WNN2=e−j2πN⋅N2=e−j2π2=e−jπ=−1W_N^{\frac{N}{2}} = e^{-j\frac{2π}{N}\sdot \frac{N}{2}} = e^{-j\frac{2π}{2}} = e^{-jπ} = -1WN2N​​=e−jN2π​⋅2N​=e−j22π​=e−jπ=−1

好的,完成了这些项的分析,那么我们把它们带入到上面那个长长的式子里面去,就会得到:X[k+N2]=∑r=0N/2−1x[2r]WN2kr+∑r=0N/2−1x[2r+1]WN2rk⋅WNk⋅(−1)=∑r=0N/2−1x[2r]WN2kr−WNk∑r=0N/2−1x[2r+1]WN2rk=∑r=0N/2−1g[r]WN/2rk−WNk∑r=0N/2−1h[r]WN/2rk\begin{aligned} X[k + \frac{N}{2}] &= \sum_{r=0}^{N/2-1}x[2r]W_N^{2kr}+ \sum_{r=0}^{N/2-1}x[2r+1]W_N^{2rk}\sdot W_N^k\sdot (-1)\\ &= \sum_{r=0}^{N/2-1}x[2r]W_N^{2kr} - W_N^k \sum_{r=0}^{N/2-1}x[2r+1]W_N^{2rk}\\ &=\sum_{r=0}^{N/2-1}g[r]W_{N/2}^{rk} - W_N^k\sum_{r=0}^{N/2-1} h[r] W_{N/2}^{rk} \end{aligned}X[k+2N​]​=r=0∑N/2−1​x[2r]WN2kr​+r=0∑N/2−1​x[2r+1]WN2rk​⋅WNk​⋅(−1)=r=0∑N/2−1​x[2r]WN2kr​−WNk​r=0∑N/2−1​x[2r+1]WN2rk​=r=0∑N/2−1​g[r]WN/2rk​−WNk​r=0∑N/2−1​h[r]WN/2rk​​

那么,我们就可以得到 X[k]X[k]X[k] 后面一半的值的表达式,为:X[k+N2]=G[k]−WNkH[k]X[k+\frac{N}{2}] = G[k] - W_N^kH[k]X[k+2N​]=G[k]−WNk​H[k]

因此,我们就得到了下面这个优美的表达式,即用两个 N/2N/2N/2 的DFT表示一个 N 点DFT:X[k]={G[k]+WNkH[k]k=0,1,2,⋯,N2−1G[k]−WNkH[k]k=N2+1,⋯,N−1X[k] = \begin{cases} G[k] + W_N^kH[k] \quad k = 0,1,2,\cdots , \frac{N}{2}-1\\ G[k] - W_N^kH[k] \quad k = \frac{N}{2}+1, \cdots, N-1 \end{cases} X[k]={G[k]+WNk​H[k]k=0,1,2,⋯,2N​−1G[k]−WNk​H[k]k=2N​+1,⋯,N−1​

这只是一层的分解,如果我们发现 N2\frac{N}{2}2N​ 还能够继续分解成两个 N4\frac{N}{4}4N​ 的DFT,那么就继续重复刚刚的分析。下面我们来看一个例子巩固一下:


我们现在要计算一个8点的DFT,那么首先,我们根据偶部和奇部将其分为两个4点的DFT,如下图所示。

那么结果其实也是分两个部分计算出来的,第一部分是:X[0],X[1],X[2],X[3]X[0],X[1],X[2],X[3]X[0],X[1],X[2],X[3],它们就是利用公式:G[k]+WNkH[k]G[k] + W_N^kH[k]G[k]+WNk​H[k]
如框图所示。第二部分就是 X[4],X[5],X[6],X[7]X[4],X[5],X[6],X[7]X[4],X[5],X[6],X[7],它利用公式:G[k]−WNkH[k]G[k] - W_N^kH[k] G[k]−WNk​H[k]
同时,我们也注意到:左边由于是对输入信号按照时间抽取的,因此实际的输入顺序就变成了:x[0],x[2],x[4],x[6],x[1],x[3],x[5],x[7]x[0],x[2], x[4],x[6],x[1],x[3],x[5],x[7]x[0],x[2],x[4],x[6],x[1],x[3],x[5],x[7],但是输出就是按照顺序的。

接下来,对于每一组的 N/2=4N/2 = 4N/2=4点DFT,我们还可以继续细分,一个4点DFT可以由两个2点DFT得出,因此我们再看看如何由2点DFT得到4点DFT。

我们先写出 g[n]g[n]g[n] 的DFT表达式:G[k]=∑n=0N/2−1g[n]WN/2knG[k] = \sum_{n = 0}^{N/2-1}g[n]W_{N/2}^{kn}G[k]=n=0∑N/2−1​g[n]WN/2kn​
那么,还是一样的做法,我们把 g[n]g[n]g[n] 分为偶部 a[n]a[n]a[n] 和奇部 b[n]b[n]b[n],那么就可以写成:G[k]=∑r=0N/4−1g[2r]WN/22rk+∑r=0N/4−1g[2r+1]WN/2(2r+1)k=∑r=0N/4−1g[2r]WN/22rk+WN/2k∑r=0N/4−1g[2r+1]WN/22kr=∑r=0N/4−1a[r]WN/4rk+WN/2k∑r=0N/4−1b[r]WN/4kr=A[k]+WN/2kB[k]=A[k]+WN2kB[k]\begin{aligned} G[k] &=\sum_{r = 0}^{N/4-1}g[2r]W_{N/2}^{2rk} + \sum_{r = 0}^{N/4-1}g[2r+1]W_{N/2}^{(2r+1)k}\\ &=\sum_{r = 0}^{N/4-1}g[2r]W_{N/2}^{2rk} + W_{N/2}^k\sum_{r = 0}^{N/4-1}g[2r+1]W_{N/2}^{2kr}\\ &=\sum_{r = 0}^{N/4-1}a[r]W_{N/4}^{rk} + W_{N/2}^k\sum_{r = 0}^{N/4-1}b[r]W_{N/4}^{kr}\\ &=A[k] + W_{N/2}^kB[k]\\ &=A[k] + W_N^{2k}B[k] \end{aligned} G[k]​=r=0∑N/4−1​g[2r]WN/22rk​+r=0∑N/4−1​g[2r+1]WN/2(2r+1)k​=r=0∑N/4−1​g[2r]WN/22rk​+WN/2k​r=0∑N/4−1​g[2r+1]WN/22kr​=r=0∑N/4−1​a[r]WN/4rk​+WN/2k​r=0∑N/4−1​b[r]WN/4kr​=A[k]+WN/2k​B[k]=A[k]+WN2k​B[k]​

因此,做类似的何理推断,我们也可以得出 G[k]G[k]G[k] 后一半的表达式为:G[k+N/4]=A[k]−WN2kB[k]k=0,1,⋯,N/4−1G[k + N/4] = A[k] - W_N^{2k}B[k] \quad k = 0, 1,\cdots , N/4-1G[k+N/4]=A[k]−WN2k​B[k]k=0,1,⋯,N/4−1

因此,我们就可以得到下面细分的框图。


我们发现:如果是按照时间抽取,那么在输入端是需要按照一定的顺序输入的(乱序输入),下面我们介绍另外一种类似的方式——从频域抽取:

还是一样,我们先摆出DFT公式:X[k]=∑n=0N−1x[n]WNknX[k] = \sum_{n=0}^{N-1}x[n]W_N^{kn} X[k]=n=0∑N−1​x[n]WNkn​

那么,我们可以先直接把 X[k]X[k]X[k] 拆成前一半的DFT和后一半的DFT的叠加,即:X[k]=∑n=0N/2−1x[n]WNkn+∑n=N/2N−1x[n]WNkn=∑n=0N/2−1x[n]WNkn+∑n=0N/2−1x[n+N2]WNk(n+N/2)=∑n=0N/2−1x[n]WNkn+(WNN/2)k∑n=0N/2−1x[n+N2]WNkn\begin{aligned} X[k] &= \sum_{n=0}^{N/2-1}x[n]W_N^{kn}+\sum_{n=N/2}^{N-1}x[n]W_N^{kn}\\ &=\sum_{n=0}^{N/2-1}x[n]W_N^{kn}+\sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_N^{k(n+N/2)}\\ &=\sum_{n=0}^{N/2-1}x[n]W_N^{kn}+ (W_N^{N/2})^k\sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_N^{kn} \end{aligned} X[k]​=n=0∑N/2−1​x[n]WNkn​+n=N/2∑N−1​x[n]WNkn​=n=0∑N/2−1​x[n]WNkn​+n=0∑N/2−1​x[n+2N​]WNk(n+N/2)​=n=0∑N/2−1​x[n]WNkn​+(WNN/2​)kn=0∑N/2−1​x[n+2N​]WNkn​​

我们又意识到:(WNN/2)k=(−1)k(W_N^{N/2})^k = (-1)^k(WNN/2​)k=(−1)k,因此,上式就可以表示为:X[k]=∑n=0N/2−1x[n]WNkn+(−1)k∑n=0N/2−1x[n+N2]WNknX[k] = \sum_{n=0}^{N/2-1}x[n]W_N^{kn}+(-1)^k\sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_N^{kn}X[k]=n=0∑N/2−1​x[n]WNkn​+(−1)kn=0∑N/2−1​x[n+2N​]WNkn​

看到 (−1)k(-1)^k(−1)k ,我们就发现,这里就需要对 kkk 做奇偶的讨论了。
【1】当 k 是偶数时,我们可以得到:X[2r]=∑n=0N/2−1x[n]WN2rn+∑n=0N/2−1x[n+N2]WN2rn=∑n=0N/2−1x[n]WN/2rn+∑n=0N/2−1x[n+N2]WN/2rn=∑n=0N/2−1{x[n]+x[n+N2]}WN/2rn\begin{aligned} X[2r] &= \sum_{n=0}^{N/2-1}x[n]W_N^{2rn}+\sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_N^{2rn}\\ &=\sum_{n=0}^{N/2-1}x[n]W_{N/2}^{rn}+\sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_{N/2}^{rn}\\ &=\sum_{n=0}^{N/2-1}\{x[n] + x[n+ \frac{N}{2}]\}W_{N/2}^{rn} \end{aligned}X[2r]​=n=0∑N/2−1​x[n]WN2rn​+n=0∑N/2−1​x[n+2N​]WN2rn​=n=0∑N/2−1​x[n]WN/2rn​+n=0∑N/2−1​x[n+2N​]WN/2rn​=n=0∑N/2−1​{x[n]+x[n+2N​]}WN/2rn​​

我们发现,X[k]X[k]X[k]的偶数项正好是 x[n]+x[n+N2]x[n] + x[n+\frac{N}{2}]x[n]+x[n+2N​]的 N/2 点DFT。

类似地,当 k 是奇数时,有:X[2r+1]=∑n=0N/2−1x[n]WN(2r+1)n−∑n=0N/2−1x[n+N2]WN(2r+1)n=∑n=0N/2−1x[n]WN2rn⋅WNn−∑n=0N/2−1x[n+N2]WN2rn⋅WNn=∑n=0N/2−1{{x[n]−x[n+N2]}WNn}WN/2rn\begin{aligned} X[2r+1] &= \sum_{n=0}^{N/2-1}x[n]W_N^{(2r+1)n} - \sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_N^{(2r+1)n}\\ &=\sum_{n=0}^{N/2-1}x[n]W_{N}^{2rn}\sdot W_N^n-\sum_{n=0}^{N/2-1}x[n+\frac{N}{2}]W_{N}^{2rn}\sdot W_N^n\\ &=\sum_{n=0}^{N/2-1}\{\{x[n] - x[n+\frac{N}{2}]\}W_N^n\}W_{N/2}^{rn} \end{aligned}X[2r+1]​=n=0∑N/2−1​x[n]WN(2r+1)n​−n=0∑N/2−1​x[n+2N​]WN(2r+1)n​=n=0∑N/2−1​x[n]WN2rn​⋅WNn​−n=0∑N/2−1​x[n+2N​]WN2rn​⋅WNn​=n=0∑N/2−1​{{x[n]−x[n+2N​]}WNn​}WN/2rn​​

我们发现,[k][k][k] 的奇数项正好是 {x[n]−x[n+N2]}WNn}\{x[n] - x[n+\frac{N}{2}]\}W_N^n\}{x[n]−x[n+2N​]}WNn​}的N/2点DFT。所以在 x[n]x[n]x[n] 输入时,我们首先得做这样的变换:

搞明白这个了,那么我们直接上8点DFT的FFT实现就很清晰了:

这里,我们不加证明地给出:FFT算法中,当N是2的整数次幂时,N点FFT复数相乘和复数相加的总数等于 N(log2NN(log_2NN(log2​N)。是不是快了很多!!


那么至此,我们对基于库利-图基算法的FFT就介绍完毕啦!我们在学习的时候,还是应该保证一种欣赏的态度去学习,殊不知这些现在理所应当的东西是当时轰动一时的艺术品之一!

PS:能坚持推导到这里的想必也是真爱了!赶紧吃顿好的犒劳一下自己吧!!

【DSP数字信号处理学习笔记】—— 详细推导DFT的快速实现算法:FFT 基于库利-图基算法的实现相关推荐

  1. 【DSP数字信号处理学习笔记】—— 线性相位的四种类型的推演以及来龙去脉

    我们知道线性相位就是相位是一次函数的关系,当然这里面还细分成了严格的线性相位和非严格的线性相位.那么他们究竟是怎么来的呢?我们今天来推导一下,同时,我们将会给出一种如何用时域信号通过对称性的关系计算除 ...

  2. 数字信号处理学习笔记

    文章目录 信号处理 离散时间信号与系统 为什么要处理信号 信号是如何处理的 信号处理的目的 数字信号的表示 信号的分类 DSP 和 ASP 数字信号处理的特点 数字信号处理的应用 两类DSP 数字信号 ...

  3. 数字信号处理学习笔记(一)|离散傅里叶变换

    离散傅里叶变换(DFT) 离散傅里叶变换(Discrete Fourier Transform)的实质是有限长序列傅里叶变换的有限点离散采样,实现了频域离散化,使数字信号处理可以在频域采用数值运算的方 ...

  4. 数字信号处理学习笔记[0] 连续信号的频谱和傅氏变换

    文章目录 绪论 1 连续信号的频谱和傅氏变换 1.1 有限区间上连续信号的傅氏级数和离散频谱 1.2 傅氏变换,连续信号与频谱 1.2.3 频谱的基本性质 实际应用举例 习题 绪论 Q: 举例说明&q ...

  5. 数字信号处理知识点总结(四):快速傅里叶变换(FFT)

    本篇文章主要介绍快速傅里叶变换(FFT)的优化原理,基-2FFT算法的推导.实现及用FFT实现的线性卷积. 主要参考知乎[精品讲义]-快速傅里叶变换(Fast Fourier Transformati ...

  6. 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...

  7. 数字信号处理学习笔记(三)|时域离散系统的网络结构

    时域离散系统的网络结构 一.何为网络结构 网络结构如同差分方程.单位脉冲响应以及系统函数一样,描述了一个系统实现方法的表达形式. 例如给定一个差分方程:y(n)=0.8y(n-1)-0.15y(n-2 ...

  8. 数字信号处理学习笔记(二)|快速傅里叶变换

    快速傅里叶变换(FFT) 一.FFT出现的原因 对x(n)进行N点DFT计算,一共有N2 次乘法,N2次加法 如果N=1024,则有2*1048576次计算,计算量过于庞大. FFT的思想就是:不断把 ...

  9. 数字信号处理学习笔记[5] 冲激函数——delta函数

    文章目录 5 冲激函数--δ\deltaδ函数 5.1 冲激函数--δ\deltaδ函数的定义和频谱 5.2 δ\deltaδ函数的微商 5.3 用δ\deltaδ函数求函数的微商和频谱 5 冲激函数 ...

最新文章

  1. 好用到哭!你需要立刻学会的20个Python代码段
  2. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
  3. python【蓝桥杯vip练习题库】ALGO-10集合运算
  4. 如何在 Outlook 2003、Outlook 2007 中管理pst 文件
  5. 等待链表_调度(准备运行)链表
  6. 用FTP客户端实现主机和虚拟机之间文件的传输(方法2)
  7. R语言中的特殊值 NA NULL NaN Inf
  8. MS CRM 2011 C#中获取Web Resource
  9. [转]5分钟实现Android中更换头像功能
  10. dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用
  11. 文本输入框input将输入转换为统一大小写
  12. 2014年计算机求职总结--准备篇
  13. 从浏览器大战看未来软件发展
  14. 数据库设计——概念模型
  15. R语言假设检验完整入门教程
  16. M1 Mac上更好的 Golang 使用方案
  17. 美团点评女技术总监任登君:不要给自己的人生设限
  18. C#界面程序设计——04导入并修改word文件
  19. Android高手进阶教程(一)-------Android常用名令集锦(图文并茂)!
  20. linux安装和配置 MariaDB (ubuntu20.04)

热门文章

  1. 英文姓名 格式 结构
  2. 第15讲:Python列表对象的反转与排序
  3. java printable_java解析电话薄 VCF文件ENCODING=QUOTED-PRINTABLE编码
  4. 【理财】信托产品的发行和成立
  5. 山东省有哪些计算机专业大学排名,山东人工智能专业大学排名
  6. 谷歌竞价推广Google Ads如何自己开户?
  7. Istio 中实现客户端源 IP 的保持
  8. 苹果计算机系统是什么情况,苹果电脑自动重启是什么原因
  9. 支付宝借呗跟花呗有什么区别?
  10. 自定义组件-behaviors