PART2 离散傅里叶变换


PART 2 离散傅里叶变换

1. 离散时间傅里叶变换

以上内容,属于对傅里叶变换较为基础的数学内容,在《微积分》等课程中有不少详尽的介绍。接下来,将会面对如何在计算机中实现傅里叶变换的问题。

首先,观察傅里叶变换公式:

\[\begin{equation*} \begin{aligned} F(\omega) &= \left.\int_{-\infty}^{\infty} \right. f(t) e^{-j\omega t} dt \\ f(t) &= \frac{1}{2\pi} \int_{-\infty}^{\infty} F(\omega)e^{j\omega t} d\omega \end{aligned} \end{equation*} \]

有这么几个问题:

  1. 在时域上,是负无穷到正无穷的积分,显然在计算机上无法做到;
  2. 在频域上,也是负无穷到正无穷的积分,显然在计算机上也无法做到;
  3. 原函数 \(f(t)\)

因此,需要对傅里叶变换进行离散化,从而更好的在计算机上实现相关功能。

首先,我们引入离散时间傅里叶变换。

1.1 离散时间傅里叶变换

为了解决上面提出的第三个问题,自然而然地引入采样的概念。通过采样,将原来的连续信号转变为离散信号,就可以作为计算机的输入了。

沿用之间的假设:对原信号做采样处理

\[f^*(t) = \sum _{n=-\infty}^{\infty}f(t)\cdot \delta(t-nT_s) \]

其中,\(f^*(t)\) 是采样后的信号序列;\(\delta(t-nT_s)\) 为狄克拉函数,\(nT_s\) 是采样的时刻, \(T_s\) 是采样时间间隔,其倒数 \(f_s = \frac{1}{T_s}\) 表示采样频率。假设这满足香农采样定律,\(f_s \ge 2f_{max}\)

将采样信号带入傅里叶变换中去:

\[\begin{equation*} \begin{aligned} F(\omega) &= \left.\int_{-\infty}^{\infty} \right. f^*(t) e^{-j\omega t} dt \\ & = \left.\int_{-\infty}^{\infty} \right. \sum _{n=-\infty}^{\infty}f(t)\cdot \delta(t-nT_s)e^{-j\omega t} dt \\ &= \sum _{n=-\infty}^{\infty} \left.\int_{-\infty}^{\infty} \right.f(t)e^{-j\omega t}\cdot \delta(t-nT_s)dt \end{aligned} \end{equation*} \]

根据狄克拉函数的筛选性质:

\[\begin{equation} \begin{aligned} F(\omega) &= \sum _{n=-\infty}^{\infty} \left.\int_{-\infty}^{\infty} \right.f(t)e^{-j\omega t}\cdot \delta(t-nT_s)dt \\ & = \sum _{n=-\infty}^{\infty}f(nT_s)e^{-j\omega n T_s} \end{aligned} \end{equation} \]

而在计算机的存储中,通常不会涉及 \(T_s\)

\[\begin{equation} \begin{aligned} F(\omega) & = \sum _{n=-\infty} ^ {\infty} f(n) e^ {-j\omega n} \end{aligned} \end{equation} \]

此式即为离散时间的傅里叶变换(DTFT)

观察 (3) 式,我们发现相比于原来的傅里叶变换,首先是积分符号变成了求和符号,这就说明原来的连续时间变量变成了离散时间变量(狄克拉函数的作用)同时,在采样定律的限制下,频域不再是无穷,而是约束在 \(\frac{f_s}{2}\)

其次是函数自变量由 t 变成了 n,n是序列的索引,满足 \(t = n \times T_s\) ,这样,\(T_s\)

最后,发现即便是解决了连续时间的问题,但是求和上下限依旧为无穷,即针对的还是无限长时间序列,得到一个无限长的频谱序列,无法在计算机上实现。因此,需要更近一步处理,即为离散傅里叶变换。

2. 离散傅里叶变换

在离散时间序列傅里叶变换中,有:

\[\begin{equation*} \begin{aligned} F(\omega) & = \sum _{n=-\infty} ^ {\infty} f(n) e^ {-j\omega n} \end{aligned} \end{equation*} \]

我们想,是否可以通过一定的方式,改变无限长的时间序列。幸运的是,在计算机的采样过程中,得到的一定是一段序列,而不是无限长的序列!这就说明,傅里叶变换中时间无限长的概念并不存在。然而,对于这一段时间序列,显然是不能进行傅里叶变换的。这就又回到了非周期函数做傅里叶展开时的问题,面临两种处理方式:

如果让周期趋于无穷,显然不可行。所以只能进行周期延拓。而一旦进行周期延拓,对应的频谱就变成了离散的,受限于采样定律,又是有限的。所以,沿着这个思路就可以解决最初提出的三个问题。

2.1 离散傅里叶变换

假设我们得到的序列共有 N 个数据,那么对应的离散傅里叶变换就是:

\[\begin{equation*} \begin{aligned} F(\omega) & = \sum _{n=0} ^ {N-1} f(n) e^ {-j\omega n} \end{aligned} \end{equation*} \]

但是注意到,周期函数的频谱是离散的,显然不能用 \(\omega\)

类似于时间分辨率,离散的频率一定存在最小分度,将其称为频率分辨率,记作:\(\omega_s\) ,令 k 作为离散频谱的索引,有 \(\omega = k\omega_s\) ,类似于 \(T_s\) 由采样频率决定,\(\omega_s\) 由信号周期决定。这是因为周期越大,频率越小,角频率也就越小,最大的周期就是 \(T=NT_s\)

此时:

\[\begin{equation*} \begin{aligned} F(k) & = \sum _{n=0} ^ {N-1} f(n) e^ {-j k\omega_s n} \\ & = \sum _{n=0} ^ {N-1} f(n) e^ {-j k \frac{2\pi}{T} n} \\ & = \sum _{n=0} ^ {N-1} f(n) e^ {-j k \frac{2\pi}{NT_s} n} \end{aligned} \end{equation*} \]

在计算机的存储中,认为 \(T_s=1\),将 n 变为序列,就有离散傅里叶变换(DFT):

\[\begin{equation*} \begin{aligned} F(k) & = \sum _{n=0} ^ {N-1} f(n) e^ {-j 2\pi \frac{k}{N} n} \end{aligned} \end{equation*} \]

我们再回到最初的傅里叶变换,是否也存在离散傅里叶逆变换?答案是存在的。这里不加证明的给出离散傅里叶变换式:

\[\begin{equation*} \begin{aligned} f(n) & = \frac{1}{N}\sum _{n=0} ^ {N-1} F(k) e^ {j 2\pi \frac{k}{N} n} \end{aligned} \end{equation*} \]

就此,得到离散傅里叶变换对:

\[\begin{equation} \begin{aligned} F(k) & = \sum _{n=0} ^ {N-1} f(n) e^ {-j 2\pi \frac{k}{N} n} \\ f(n) & = \frac{1}{N}\sum _{k=0} ^ {N-1} F(k) e^ {j 2\pi \frac{k}{N} n} \end{aligned} \end{equation} \]

观察 (3) 式,可以看出:

  1. 在时域上,通过采样,得到 0~N-1 共 N 个时域数据点,这些时域点之间实际的时间间隔是 \(T_s\)
  2. 在频域上,通过采样,得到 0~N-1 共 N 个频域数据点,这些频域点之间实际的频率间隔是 \(\omega_s\)
  3. 逆变换中的 N 分之一是从 \(d\omega\)

2.2 离散傅里叶逆变换的证明

在后续的探索中,发现还是有必要对离散傅里叶逆变换(IDFT)进行一个简单的证明。

由傅里叶逆变换公式:

\[\begin{equation*} \begin{aligned} f(t) &= \frac{1}{2\pi} \int_{-\infty}^{\infty} F(\omega)e^{j\omega t} d\omega \end{aligned} \end{equation*} \]

在离散化后,取

\[\begin{equation*} \begin{aligned} t &= nT_s \\ \omega &=k\omega_s \end{aligned} \end{equation*} \]

其中满足

\[\begin{equation*} \begin{aligned} T_s &= \frac{1}{f_s} \\ \omega_s &=\frac{2\pi}{T}=\frac{2\pi}{NT_s} \end{aligned} \end{equation*} \]

此时,对 \(dw\) 的积分可以看作是对 \(k\omega_s\)

\[\begin{equation*} \begin{aligned} f(nT_s) &= \frac{1}{2\pi} \sum _{k=0}^{N-1}F(k\omega_s)e^{jk\omega_s nT_s} d(k\omega_s) \end{aligned} \end{equation*} \]

当序列化表示, \(T_s=1\)

\[\begin{equation*} \begin{aligned} f(n) &= \frac{1}{2\pi} \sum _{k=0}^{N-1}F(k)e^{jk\frac{2\pi}{NT_s} nT_s} d(k\frac{2\pi}{N})\\ &= \frac{1}{N} \sum _{k=0}^{N-1}F(k)e^{j2\pi \frac{k}{N} n} \end{aligned} \end{equation*} \]

即可得证离散傅里叶逆变换。

2.3 关于\(\frac{1}{N}\)

事实上,离散傅里叶变换也可以从傅里叶级数推出。(关于这部分内容,将在最后的说明中加以阐述)

由傅里叶级数:

\[\begin{equation*} \begin{aligned} f(t) &= \sum_{-\infty}^{\infty} F(n\omega_1) e^{jn\omega_1 t} \\ F(n\omega_1) &=\frac{1}{T_1} \left[ \left.\int_{-\frac{T_1}{2}}^{\frac{T_1}{2}} \right. f(t) e^{-jn\omega_1 t} dt\right] \quad n &= 0, \pm1, \pm2, \cdots \end{aligned} \end{equation*} \]

当取:

\[\begin{equation*} \begin{aligned} t &= nT_s \\ T_1&=NT_s\\ \omega &=k\omega_s \\ T_s &= \frac{1}{f_s} \\ \omega_s &=\frac{2\pi}{T_1}=\frac{2\pi}{NT_s} \\ \end{aligned} \end{equation*} \]

可以得到:

\[\begin{equation} \begin{aligned} F(k) & = \frac{1}{N}\sum _{n=0} ^ {N-1} f(n) e^ {-j 2\pi \frac{k}{N} n} \\ f(n) & = \sum _{k=0} ^ {N-1} F(k) e^ {j 2\pi \frac{k}{N} n} \end{aligned} \end{equation} \]

(5) 式与 (4) 式比较,发现 \(\frac{1}{N}\)

事实上,这两种写法都是正确的。因为在傅里叶变换的过程中,我们关注点在于后面的 \(F(k)\) ,至于前面的系数,更多的是为了满足正变换和逆变换之间的自洽,即可以相互推导即可。所以, \(\frac{1}{N}\)

\[\begin{equation} \begin{aligned} F(k) & = \frac{1}{\sqrt{N}}\sum _{n=0} ^ {N-1} f(n) e^ {-j 2\pi \frac{k}{N} n} \\ f(n) & = \frac{1}{\sqrt{N}}\sum _{k=0} ^ {N-1} F(k) e^ {j 2\pi \frac{k}{N} n} \end{aligned} \end{equation} \]

再利用Python实现的过程中,我们可以再次深刻的认知到这一点。

接下来,我们通过Python中程序验证公式的正确性。[附录 Ⅱ ]