导入
DFT 线性
探索傅里叶变换的线性性质。
线性意味着输入信号之和的DFT等于各个输入信号DFT之和。我们来具体分析一下。
推导
假设两个输入信号 和 的DFT分别为 和 。在这种情况下,它们之和的DFT等于各自DFT之和。
这意味着:
这是因为:
这一性质使得我们可以在不进行显式计算的情况下,确定信号的DFT。
示例
以一个复数输入信号为例,如下图所示,其采样频率为 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的结果就变得非常简单。
由此可以得出结论:前面展示的复数输入信号实际上仅由两个复指数正弦信号组成,分别位于频域的第 和 两个频bin上。这些频bin对应的实际频率取决于采样率 和DFT长度 ,计算公式为: