【五】离散傅里叶变换——1

主要参考知乎大神回答:

参考三位知乎大神的回答,自己总结如下:

1.傅里叶变换实际上就是找一组合适的基,对原信号进行一个基变换,即:把原信号表示成几个新的信号现性相加的形式:x[n]=\sum c_ky^{(k)}[n]

2.对于寻找的这个基,不唯一,当你表示同一个信号 x[n] ,可以有多组 y^{(k)}[n] 作为基,但是y^{(k)}[n]不同就会有不同的 c_k。而你的目的决定了你怎样选择用怎样的 y^{(k)}[n] 表示。

3.【我的理解】将离散的信号看做是周期函数,对于具有N个采样点的信号,至少需要N个正交基对其进行线性表示。我们选择N个正交的正弦函数作为基,我们只需要求其相应的系数即可。求系数的过程就是求基信号与原信号相关程度的过程。

一.知乎回答1:

作者:肖畅
链接:https://www.zhihu.com/question/21314374/answer/542909849
来源:知乎

对一段有限长的离散信号,找出它含有的各个频率的正弦波分量。(这是句大家都知道的废话)

但如果换个单独针对DFT的解释就会好理解很多:

在长度为N的离散信号中,针对k=(0,1,2...),分别找出在长度N内振动k次的三角波分量的权值

怎么做呢?举个例子,可以打开MATLAB一起做:

抛开时间抛开采样频率,只看点的个数,我们对某个余弦信号在两个周期内采样了40次:

x[n]=cos(2\pi\frac{n}{20} ),n=0,1,...,39

现在我们想通过DFT知道它在40次采样时间内振动了几次(经历了几个周期?),算法是怎么处理的呢?其实很暴力:

事先选取40个长度为40个点的基信号,它们分别长这样:

第一个,40次采样内振动0个周期:cos(2\pi\frac{0n}{40} ) ,即常值

第二个,40次采样内振动1个周期cos(2\pi\frac{1n}{40} )

第三个,40次采样内振动2个周期cos(2\pi\frac{2n}{40} )

第四个,40次采样内振动3个周期cos(2\pi\frac{3n}{40} )

第五个,40次采样内振动4个周期cos(2\pi\frac{4n}{40} )

......以此类推一直到40个采样内振动39个周期。

接下来,对于上述40个基信号,判断它们跟原信号的相关程度。代数里判断两个长度相同的离散函数x[k],y[k]的相关程度,就是把它们同一点的函数值相乘,再对所有点求和的方法,即下面的公式:

correlation(x,y)=\sum_kx[k]y[k]

{\color{Blue} \mathbf{{\color{Magenta} X_{k}=\sum_{n=0}^{N-1}\; cos(2\pi\frac{2n}{40} )cos(2\pi\frac{kn}{40} )=cos(2\pi\frac{2*0}{40} )cos(2\pi\frac{k*0}{40})+cos(2\pi\frac{2*1}{40} )cos(2\pi\frac{k*1}{40})+...+cos(2\pi\frac{2*(N-1)}{40} )cos(2\pi\frac{k*(N-1)}{40})}}}

这个值越大,x[k],y[k]长得越像。于是DFT把cos(2\pi\frac{0n}{40} )cos(2\pi\frac{39n}{40} )这40个基函数都跟当前函数 cos(2\pi\frac{2n}{40} ) 比较了一下,发现 cos(2\pi\frac{2n}{40} )cos(2\pi\frac{38n}{40} ) 跟它长得最像!

这很显然,因为 cos(2\pi\frac{38n}{40} )=cos(2\pi -2\pi\frac{38n}{40} )=cos(2\pi\frac{2n}{40} )

于是 X_{2}=X_{38}=\sum_{n=0}^{39}cos(2\pi\frac{2n}{40} )cos(2\pi\frac{2n}{40} )=20

下面,如果我们把这40次每次比较的correlation值记下来,就得到了原信号在每个频率上的分量大小,比如,我要看它跟40次采样中振动8次的那个基信号相似程度,就是:

把这40个correlation值记下来,就得到了原信号的频域X:

可以看到 ,X_{2}=X_{38}=20其他值都是0

如果写成一般形式,用 x[n]替换原信号, 就是:

{\color{Emerald} \mathbf{\mathbf{{\color{Magenta}X_{k}=\sum_{n=0}^{39}x[n]cos(2\pi\frac{kn}{40} )}}}}

问题来了,虽然貌似联系很紧密,但这怎么跟DFT的公式长得不一样。。。DFT的公式应该是这样的:

X_{k}=\sum_{n=0}^{N-1}x[n]e^{-2\pi j \frac{kn}{N}})

就算用欧拉公式展开,我们得到的是:

X_{k}=\sum_{n=0}^{39}x[n]cos(2\pi\frac{kn}{40} )-j\sum_{n=0}^{39}x[n]sin(2\pi\frac{kn}{40} )

这又是为什么?

这是因为,对于一个信号,如果只跟余弦函数比较,会损失一些信息,比如相位。

如果我们的原信号有一些相位偏移,x=cos(2\pi\frac{2n}{40} +\frac{\pi }{4})

如果对这个函数同样按照上面的方法计算频域,结果会有一些不一样:

虽然对应频率还是筛选出来了,但是权值大小不一样了,如果计算一下得知

X_{2}=X_{38}=\sum_{n=0}^{39}cos(2\pi\frac{2n}{40} +\frac{\pi }{4} )cos(2\pi\frac{2n}{40} )=10\sqrt{2}

在相位偏移前,这个值是20,我们没法通过频域信息知道原信号到底是什么。

解决方法是另选一组以正弦函数为基准的“基信号”,即 sin(2\pi\frac{0n}{40} )sin(2\pi\frac{39n}{40} ),计算另一组原信号与正弦基的相关系数,这两组系数一起作为DFT的最终结果。而复数只是一个工具,用来方便地同时存储两组计算结果。当然它还有一个好处就是能够比较直观地表现出模和相位。如果一个信号跟某频率余弦和正弦的相关系数分别为a,b,那么代表这个信号差不多型如

acos(\frac{kn}{N})+bsin(\frac{kn}{N})

根据高中数学可以求得其模为 \sqrt{a^{2}+b^{2}},相位为 arctan\frac{b}{a},这与复数a+bi的模和相位是相同的,因此DFT的公式

X_{k}=\sum_{n=0}^{N-1}x[n]e^{-2\pi j \frac{kn}{N}})

相当于同时把x[n]做了跟N个余弦基、N个正弦基的比对,结果用N个复数存储。如果想要看某个频率的相位和模,就看对应复数的相位和模。

我们再来看看上面有相位偏移的那个例子:

原信号:x[n]=cos(2\pi\frac{2n}{40} +\frac{\pi }{4})

与余弦比对:X_{2}=\sum_{n=0}^{39}cos(2\pi\frac{2n}{40} +\frac{\pi }{4} )cos(2\pi\frac{2n}{40} )=10\sqrt{2}

与正弦比对:X_{2}=\sum_{n=0}^{39}cos(2\pi\frac{2n}{40} +\frac{\pi }{4} )sin(-2\pi\frac{2n}{40} )=10\sqrt{2}

在40个点内振动两个周期这个频率上,其DFT的结果为10\sqrt{2}+10\sqrt{2}j

其模为20,与相位偏移前相同。

其相位为\frac{\pi }{4} ,也没有问题。

如果将原信号变为 x[n]=cos(2\pi\frac{2n}{40} +\frac{\pi }{4}),会求得该频率DFT结果为10\sqrt{2}+10\sqrt{2}j ,求得其相位为 \frac{\pi }{4}。因此,根据DFT结果求得的相位是相对余弦信号的相位。

对于实际信号

上面做的分析没有考虑时间和采样频率,但只要给定一个采样频率,时域的横轴就可以换算成时间,频域的横轴就可以换算成频率。

DFT所做的只是选取了在给定长度内振动了整数个(k个)周期的正弦和余弦波作为基

上面的信号是40个采样,如果给一个采样频率是100Hz,那么信号长度就是0.4s,原信号在40个采样内振动了两个周期,可以算出其频率为5Hz。

对于频域,每个“在40个采样内振动了k个周期”的基信号的实际频率为 \frac{100}{40}k=2.5k,也就是说频域图中的每一个点代表2.5Hz,这个系统的频域分辨率是2.5Hz,所以我们从X_{2}=20 得知原信号的实际频率为2\times 2.5=5Hz

二.知乎回答2:

作者:智穎
链接:https://www.zhihu.com/question/21314374/answer/588436102
来源:知乎

1.信号的表示

一个很重要的概念就是信号的表示(signal representation),一个信号可以表示为如下的样子:

x[n]=\sum c_ky^{(k)}[n]

其中, x[n] 就是我们想要表示的信号。我们的目的就是为了把这个信号表示成几个新的信号 y^{(k)}[n] 的linear combination。 c_k 是一个是实数,每个新的信号 y^{(k)}[n] 对应一个 c_{k}

注意,我们现在说的不是DFS这一种信号表示,这个一个非常一般性的表达式:

  1. x[n], y[n] 可以是任何信号。
  2. 这个linear combination可以是有限项相加,也可以是无限项相加。
  3. 对于某一个信号 x[n] ,你总可以选出一组信号\{y^{(1)}[n],y^{(2)}[n],y^{(3)}[n],...,y^{(k)}[n],...\}来表示它
  4. 当你表示同一个 x[n] ,你选的 y^{(k)}[n] 不同就会有不同的 c_k

对于第1点和第2点,我只想强调我现在讨论的是比Discrete Fourier Transform更一般性的概念, x[k], y[k] 完全没有必要是periodic的。

对于第3点,你有没有发现,如果我有创造了一组 y^{(1)}[n],y^{(2)}[n],y^{(3)}[n],...,y^{(k)}[n],... 能够分别表示 x_1[n],x_2[n],x_3[n],...,x_m[n] ,那么我只用记住 y^{(1)}[n],y^{(2)}[n],y^{(3)}[n],...,y^{(k)}[n],... 这些signal一次,对于 x_1[n],x_2[n],x_3[n],...,x_m[n],我知道了每个 x_i[n] 所对应的一组 c 值,我就知道了每一个信号的所有信息。

【类似于空间中一个点的表示,y^{(1)}[n],y^{(2)}[n],y^{(3)}[n],...,y^{(k)}[n],...相当于是基,对应的一组 c 值相当于坐标值。所以知道基,再知道对应的c 值,x[n]就确定了。】

有没有一种线性代数里change of basis的感觉?

因为每一个signal都一定有的表示方式就是:

x[n]=\sum x[k]\delta[n-k]

那么所做的无非就是把basis从 \{...,\delta[n+k+1],\delta[n+k],...,\delta[-1],\delta[0],\delta[1],...,\delta[n-k],\delta[n-k-1],...\} 变成了 \{y^{(k)},y^{(k)},...,,y^{(k)},...\}

第4点,说明了你的目的决定了你怎样选择用怎样的 y^{(k)}[n] 表示 x[n] 。举个例子:比如你想压缩信号,那么你就想选择一组 y^{(k)}[n] 使得最后得到的一组 c_k 会很多是0,很少是非0。

同理,我现在想选择一组 y^{(k)}[n] 来表示periodic signals,理由很简单因为periodic signals 有很多很nice的性质,所以就开始了Discrete time Fourier Series (DFS或DTFS)

二.DFS

Discrete time Fourier Series (DFS或DTFS) 是一种表示periodic signal的一种方法。

如果我想表示一个periodic signal,用这种形式,

x[n]=\sum c_ky^{(k)}[n]

那么 y^{(k)}[n] 应该有什么特点呢?

x[n] 已经是periodic的了,假设它的period为 N , 那么 y^{(k)}[n] 的period也为 N

那么我们完全可以用一个period来表示 x[n] ,即

x[n]=\sum_{i=0}^{N-1} c_ky^{(k)}[n]

我们都知道period signal可以用Euler's Identity表示,那么因为 x[n]=e^{i\frac{2\pi}{N}n},我们就可以让 y^{(k)}[n]=e^{i\frac{2\pi p}{N}n} 。注意 p=\{0,1,...,N-1\} ,因为 e^{i\frac{2\pi (p+N)}{N}n} = e^{i\frac{2\pi p}{N}n}  e^{i\frac{2\pi N}{N}n} = e^{i\frac{2\pi p}{N}n}  e^{i2\pi n}= e^{i\frac{2\pi p}{N}n}

同时注意 k=\{0,1,...,N-1\} ,所以,without loss of generality, y^{(k)}[n]=e^{i\frac{2\pi p}{N}n}

那么,我们就有了

x[n]=\sum_{i=0}^{N-1} c_ke^{i\frac{2\pi k}{N}n}

最后一个问题,如何求 c_k ?

注意, \{e^{i\frac{2\pi}{N}n}, ..., e^{i\frac{2\pi k}{N}n},...,e^{i\frac{2\pi (N-1)}{N}n}\}是orthogonal basis(标准正交基,因为

\langle e^{i\frac{2\pi k_1}{N}n}, e^{i\frac{2\pi k_2}{N}n} \rangle = \sum_{i=0}^{N-1}{e^{i\frac{2\pi k_1}{N}n} \left( e^{i\frac{2\pi k_2}{N}n} \right)^*} = \sum_{i=0}^{N-1}{e^{i\frac{2\pi k_1}{N}n} e^{-i\frac{2\pi k_2}{N}n} } = \sum_{i=0}^{N-1}{e^{i\frac{2\pi (k_1-k_2)}{N}n}}

k_1=k_2\langle e^{i\frac{2\pi k_1}{N}n}, e^{i\frac{2\pi k_2}{N}n} \rangle=1

k_1\neq k_2

\langle e^{i\frac{2\pi k_1}{N}n}, e^{i\frac{2\pi k_2}{N}n} \rangle =  \sum_{i=0}^{N-1}{e^{i\frac{2\pi (k_1-k_2)}{N}n}} =  \sum_{i=0}^{N-1}{ \left( e^{i\frac{2\pi (k_1-k_2)}{N}} \right)^n}  = \frac{1-\left(e^{i2\pi \frac{(k_1-k_2)}{N}} \right)^N}{1-e^{i\frac{2\pi (k_1-k_2)}{N}} }

=\frac{1-e^{i2\pi (k_1-k_2) n}  }{1-e^{i\frac{2\pi (k_1-k_2) n}{N}} } =  \frac{1-1 }{1-e^{i\frac{2\pi (k_1-k_2) n}{N}} } =0

所以\{e^{i\frac{2\pi}{N}n}, ..., e^{i\frac{2\pi k}{N}n},...,e^{i\frac{2\pi (N-1)}{N}n}\}是orthogonal basis,那么求 c_k 就很直接了:

c_k = \frac{\langle x[n], e^{i\frac{2\pi k}{N}n}\rangle}{\langle e^{i\frac{2\pi k}{N}n}, e^{i\frac{2\pi k}{N}n}\rangle} = \frac{\sum_{n=0}^{N-1}{x[n]e^{i\frac{2\pi k}{N}n}}}{N}

所以,

x[n]=\sum_{i=0}^{N-1} c_ke^{i\frac{2\pi k}{N}n}

c_k = \frac{1}{N}\sum_{n=0}^{N-1}{x[n]e^{i\frac{2\pi k}{N}n}}

这就是DFS。

三.知乎回答3:

作者:杨宇翔
链接:https://www.zhihu.com/question/21314374/answer/25295545
来源:知乎

DFT可以这样推导:
1.标准正交基
向量空间V\mathbb{R}^N\mathbb{C}^N)的标准正交基\left\{b_k\right\}_{k=0}^{N-1}满足以下两个条件:
\left<b_k,b_l\right>=0,k \ne l
\|b_k\|_2=1
我们可以得到一个N \times N的标准正交基矩阵:
\mathbf{B}=\left[b_0|b_1|\cdots|b_{N-1}\right]
再把每一个标准正交基对应的系数\alpha_k写成一个列向量:
a=\left[\begin{array}{c} \alpha_0 \\  \alpha_1 \\ \vdots \\ \alpha_{N-1} \end{array}\right]
则信号x的标准正交基表示:
x=\alpha_0b_0+\alpha_1b_1+\cdots+\alpha_{N-1}b_{N-1}=\sum_{k=0}^{N-1}{\alpha_kb_k} =\left[b_0|b_1|\cdots|b_{N-1}\right]\left[\begin{array}{c} \alpha_0 \\  \alpha_1 \\ \vdots \\ \alpha_{N-1} \end{array}\right]=\mathbf{B}a
那么a=\mathbf{B}^{-1}x=\mathbf{B}^{H}x(这里,\mathbf{B}^H是指\mathbf{B}的共轭转置矩阵,不难证明\mathbf{B}^{-1}=\mathbf{B}^H

关键结论:
对于一组标准正交基\left\{b_k\right\}_{k=0}^{N-1}和标准正交基矩阵\mathbf{B},对于任意的信号x,我们有以下的表达:

综合式:x=\mathbf{B}a=\sum_{k=0}^{N-1}{\alpha_kb_k}

分析式:a=\mathbf{B}^Hx\alpha_k=\left<x, b_k\right>

综合式表明信号x可以表示成标准正交基的线性组合。
分析式给出了计算标准正交基对应系数\alpha_k的方法,\alpha_k的大小表征了信号x与标准正交基向量b_k
之间的相似度。

2.特征向量与特征值
结论:LTI系统的特征向量是复正弦谐波(证明略):
s_k\left[n\right]=\frac{e^{j{\frac{2\pi}{N}kn}}}{\sqrt[]{N}},0\le n,k\le N-1
可以看出复正弦谐波是一组标准正交基。

3.标准化的DFT(Normalized DFT)
对于标准正交基\left\{s_k\right\}_{k=0}^{N-1}和标准正交基矩阵\mathbf{S},我们定义长度为N的有限长信号x的标准化DFT为:
综合式(IDFT):x=\mathbf{S}X

x\left[n\right]=\sum_{k=0}^{N-1}{X\left[k\right]\frac{e^{j{\frac{2\pi}{N}kn}}}{\sqrt[]{N}}}

分析式(DFT):X=\mathbf{S}^Hx

X\left[k\right]=\left<x,s_k\right>=\sum_{n=0}^{N-1}{x\left[n\right]\frac{e^{-j{\frac{2\pi}{N}kn}}}{\sqrt[]{N}}}
通过标准正交基得到的DFT一种表达,也是比较容易被人理解的一种形式。但这并不是我们通常能够见到的DFT表达。

4.未标准化的DFT(Unnormalized DFT)
未标准化的DFT是通过正交基而非标准正交基得到的一种DFT表达,这也是我们常见的一种形式。这种形式可以避免计算上的复杂性,对于计算机来说,这是一种比较优雅的形式。由于传统,在书本、文献中一般统一采用这种DFT表达。
综合式(IDFT):

x\left[n\right]=\frac{1}{N}\sum_{k=0}^{N-1}{X_u\left[k\right]e^{j{\frac{2\pi}{N}kn}}}

分析式(DFT):

X_u\left[k\right]=\sum_{n=0}^{N-1}{x\left[n\right]e^{-j{\frac{2\pi}{N}}kn}}

简单来说,DFT就是有限长信号的一种基变换,以复正弦谐波作为变换域的基是因为复正弦谐波是LTI系统的特征函数。这样,对于有限长信号,DFT就很自然成为分析LTI系统的工具了。
我的理解就是这样了,好像也不是很通俗。


注:本文整理网上资料,包括知乎、博客等,如有侵权立刻删除。

猜你喜欢

转载自blog.csdn.net/mrdonghe/article/details/90257477