Logo
Section 1 / 8

DFT 线性

探索傅里叶变换的线性性质。

导入

DFT 线性

探索傅里叶变换的线性性质。

线性意味着输入信号之和的DFT等于各个输入信号DFT之和。我们来具体分析一下。

推导

假设两个输入信号 x1[n]x_1[n] 和 x2[n]x_2[n] 的DFT分别为 X1[k]X_1[k] 和 X2[k]X_2[k]。在这种情况下,它们之和的DFT等于各自DFT之和。

DFT x1[n]→X1[k]DFT x2[n]→X2[k]\begin{align*} \text{DFT }x_1[n]\quad \rightarrow\quad X_1[k]\\ \text{DFT }x_2[n]\quad \rightarrow\quad X_2[k] \end{align*}

这意味着:

DFT {y[n]=x1[n]+x2[n]}→Y[k]=X1[k]+X2[k]\text{DFT }\Big\{y[n]=x_1[n]+x_2[n]\Big\}\quad \rightarrow\quad Y[k]=X_1[k]+X_2[k]

这是因为:

Y[k]=∑n=0N−1{x1[n]+x2[n]}e−j2πkNn=∑n=0N−1x1[n]e−j2πkNn+∑n=0N−1x2[n]e−j2πkNn=X1[k]+X2[k]\begin{align*} Y[k]&=\sum_{n=0}^{N-1}\Big\{x_1[n]+x_2[n]\Big\}e^{-j2\pi\frac{k}{N}n}\\ &=\sum_{n=0}^{N-1}x_1[n]e^{-j2\pi\frac{k}{N}n}+\sum_{n=0}^{N-1}x_2[n]e^{-j2\pi\frac{k}{N}n}\\ &=X_1[k]+X_2[k] \end{align*}

这一性质使得我们可以在不进行显式计算的情况下,确定信号的DFT。

示例

以一个复数输入信号为例,如下图所示,其采样频率为 fs=12f_s=12 kHz。

...
DFT input signal

该信号看起来非常复杂。我们使用以下代码计算其DFT并查看结果:

1import numpy as np 2from math import e 3import matplotlib.pyplot as pl 4 5figWidth = 20 6figHeight = 8 7 8# 生成信号 9 10fs = 12000 # 采样率 11Ts = 1/fs # 采样时间 12 13f1 = 1000 14T1 = 1/f1 15A1 = 2 16phi1 = 28*np.pi/180 17 18f2 = -4000 19T2 = 1/f2 20A2 = 3 21phi2 = -16*np.pi/180 22 23t = np.arange(0, T1, Ts) 24 25x1 = A1*e**(1j*(2*np.pi*f1*t + phi1)) 26x2 = A2*e**(1j*(2*np.pi*f2*t + phi2)) 27x = x1+x2 28 29 30# 绘制信号 31 32fig, axs = pl.subplots(figsize=(figWidth, figHeight)) 33 34nfft = int(fs/f1) 35xf = np.fft.fft(x,nfft) # 从 0 到 2π 36xf = np.fft.fftshift(xf) # 从 -π 到 π 37k = np.arange(-nfft/2,nfft/2,1) 38print(np.abs(xf)) 39axs.vlines(k, ymin=np.abs(xf), ymax=0, color='b', linewidth=2) 40axs.plot(k, np.abs(xf), 'o', color='b', markersize=10, zorder=10, clip_on=False) 41 42axs.axhline(y=0, color='k', linewidth=1) 43axs.axvline(x=0, color='k', linewidth=1) 44axs.set_xlim(min(k),max(k)+1) 45axs.set_xticks(np.arange(min(k),max(k)+1,1)) 46axs.set_xlabel('$k$', fontsize=18) 47axs.grid() 48 49axs.set_ylim(0, 51) 50axs.set_yticks(np.arange(0, 51, 10)) 51axs.tick_params(labelsize=18) 52 53axs.set_ylabel("$|X[k]|$", fontsize=18) 54 55fig.tight_layout() 56pl.savefig('output/dft-linearity.png', bbox_inches='tight')

如果我们记得时域中的复指数正弦信号在频域中对应的是冲激函数,那么DFT的结果就变得非常简单。

由此可以得出结论:前面展示的复数输入信号实际上仅由两个复指数正弦信号组成,分别位于频域的第 k=1k=1 和 k=−4k=-4 两个频bin上。这些频bin对应的实际频率取决于采样率 fsf_s 和DFT长度 NN,计算公式为:

f=fskNf = f_s \frac{k}{N}

离散傅里叶变换

频谱:时间偏移之后 I