离散傅里叶变换(DFT)
预备知识
傅里叶级数
傅里叶变换是以时间 为自变量的时域信号 和以频率 为自变量的频域函数 之间的变换关系。
对于周期为 的连续时间信号 ,其频谱 是离散非周期函数 其中 为离散频谱两谱线间的角频率间隔, 为谐波序号。
对于连续的非周期时间信号 ,其频谱 是一个连续的非周期函数。满足 对于离散非周期信号,其频谱 是连续周期信号 其中 是数字角频率,满足 。
可以看出,时间域的周期造成频谱的离散,时间域的非周期造成频谱的连续。
不过,上面的三种傅里叶变换总有一个域是连续的,这不能利用计算机辅助计算。
周期序列的离散傅里叶级数(DFS)
有限长序列的离散傅里叶变换
离散非周期信号的频谱是连续的,将连续的傅里叶变换 点采样后,频域离散,时域周期延拓。因此,离散傅里叶级数对周期序列才存在。
设 是周期为 的一个离散周期序列 由离散时间傅里叶变换(DTFT)可知,该周期序列可以表示为 其中 是离散傅里叶级数的系数, 并且 也是周期序列。因此,时域的离散周期序列的离散傅里叶级数(DFS)在频域也是离散的周期序列。
令 ,离散傅里叶级数可表示为
连续周期信号与离散周期序列的对比
由于 ,离散傅里叶级数的所有谐波成分中只有 个是独立的,因此在展开成离散傅里叶级数时,只能取 个独立的谐波分量。
有限长序列的离散傅里叶变换(DFT)
将长度为 的有限长序列 看作是周期为 的周期序列的一个周期,计算该周期序列的离散傅里叶级数,即可得到有限长序列的离散傅里叶变换。
把周期序列 的一个周期 定义为主值区间, 也可以表示为周期延拓或时窗运算 可以得到有限长序列的离散傅里叶变换为
有限长序列 的DFT ,就是 的周期延拓序列 的DFS系数 的主值序列。DFT的时域与频域都是有限长序列,方便用计算机表示。
频域采样(频域采样点数 的选取)
设时域周期序列 的周期为 , 将 带入上式,得到 其中,当 时 则 说明,频域 点采样等价于时域上以 为周期延拓,因此 时,时域不发生混叠。
频域移位点数 与对应的时域频偏频率 的关系:
假设捕获模块的输入信号时经过 倍内插的信号,即 ,则在频域进行 点循环移位对应时域生成的载波为 其中 表示扩频比, 为内插系数, 为采样频率, 为码片速率, 为符号速率。
可以得到结论:频域循环移位 点对应时域乘以频率为为 的载波.
在DFT中,涉及的序列 和 均为有限长序列,主值区间为 ,这里的对称性指的是关于 的圆周对称,长度为 的有限长序列 的圆周共轭对称分量 和圆周共轭反对称分量 分别定义为 满足 因此,任何有限长序列都可分解为圆周共轭对称分量 和圆周共轭反对称分量 的和, 其中
则 同理,将 表示为 ,其中 则
DFT与DTFT、ZT的关系
已知 为 点有限长序列,则 的 变换为 DTFT为 DFT为 有限长序列 的DTFT是单位圆上的 变换, 是连续的,体现出DTFT是以 为周期的连续谱。
有限长序列 的DFT是对 在单位圆上进行 点的等间隔采样,也是DTFT一个周期 上的 点等间隔采样。
如果频域采样满足频域采样定理(频域采样点数 不小于时域序列长度 ),就可以用频域采样值恢复序列的 变换, 令 , 可以表示为 函数 有一个极点 , 个零点 ,因此内插函数 在除了 的其它 个采样点均为 ,
同理, 其中 为内插函数,满足 , 也就是每个采样点上的 的值等于 ,即 ,各个采样点之间的值由各采样点的加权内插函数 在所求 点上的值叠加得到。
由内插函数求频率响应
频域内插(与 卷积),等价于时域截断(加矩形窗)
线性卷积与线性相关
周期卷积
设 与 都是以 为周期的序列,DFS分别为 和 ,若 则 圆周卷积(循环卷积)
设当 与 都是长度为 的有限长序列,DFT分别为 和 ,若 则 记作 .
当信号通过线性时不变系统时,系统的输出 时输入 与单位脉冲响应 的线性卷积,即 ,当 和 均为有限长序列时,可以考虑用圆周卷积代替线性卷积,下面分析代替的条件:
设序列 和 分别是长度为 和 的有限长序列,设 是两者的线性卷积 则 是长度为 的有限长序列。
设 是两者的 点圆周卷积
因此, 点圆周卷积 是线性卷积 以 为周期延拓序列的主值序列,且不失真的条件是
圆周卷积代替线性卷积
谱分析
对于时域连续的非周期信号 ,其CTFT为
频谱泄漏
理论分析
实际要把观测的信号 限制在一定的时间间隔内,时域截断数学上表示为无限长时间序列乘以窗函数,频域上是两者频谱的卷积,由于窗函数不能无限宽,频谱不是冲激函数,因此,时域截断必然会造成频谱展宽(拖尾),造成频谱泄漏。
以正弦信号 为例,先对其采样,采样频率为 , 做DFT,得到 是 的频谱以 为周期进行延拓的结果。 则 ,其中 是样本的长度,并且,对于正弦信号, ,则有 因此,当样本的长度为信号周期的整数倍时,DFT能正确分析频谱。否则,会因为对信号的不当截断造成频谱泄漏。
MATLAB仿真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 close all; clear; clc; tic; fs = 160e3 ; t_total = 1 ; fc = 20e3 ; t = 0 : 1 /fs : t_total - 1 /fs; s = cos (2 *pi * fc * t); N = 2048 ; hamming_window = hamming(length (s)); s_truncated = s .* hamming_window'; f = (-fs/2 : fs/N : fs/2 - fs/N); S = 10 * log10 (abs (fftshift(fft(s, N))) /N); Hamming_window = 10 * log10 (abs (fftshift(fft(hamming_window, N)))); S_truncated = 10 * log10 (abs (fftshift(fft(s_truncated , N)))); figure ;subplot(3 , 2 , 1 ); plot (t, s);xlabel("Time (s)" ); ylabel("Amplitude" ); title("The Original Signal" ); grid on; subplot(3 , 2 , 2 ); plot (f, S);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of the Original Signal" ); grid on; subplot(3 , 2 , 3 ); plot (t, hamming_window);xlabel("Time (s)" ); ylabel("Amplitude" ); title("Hamming Window" ); grid on; subplot(3 , 2 , 4 ); plot (f, Hamming_window);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of Hamming Window" ); grid on; subplot(3 , 2 , 5 ); plot (t, s_truncated);xlabel("Time (s)" ); ylabel("Amplitude" ); title("The Truncated Signal" ); grid on; subplot(3 , 2 , 6 ); plot (f, S_truncated);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of the Truncated Signal" ); grid on; sgtitle("Simulation of Spectrum Leakage" ); toc;
栅栏效应
理论分析
点DFT是将 周期分成 份,在 这几个离散的栅栏点 上观察一个周期。
考虑一个 点的时域序列 ,其DFT为 其中 ,对该时域序列的末尾补 个 ,得到新的时域序列 其中 ,补零后的DFT为 可以发现 与 仅是点数不同,即频率的分辨率不同。
当 时,有 表征补零前后的频谱谱线有相同的频点,在该频点处原信号的幅值被保留,如果补零前后没有相同的频点,则原频点只能由补零后的其它频点合成,能量也就被分散到那些频点上,发生频谱泄漏 。
末尾补零本质上是在增加频率的分辨率,当用FFT观察一个离散信号的频谱时,实际是在观察一个连续谱的一些离散点,就像是透过栅栏 观察频谱。
MATLAB仿真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 close all; clear; clc; tic; fs = 1e6 ; t_total = 1 ; fc1 = 5e3 ; fc2 = 6e3 ; t = 0 : 1 /fs : t_total - 1 /fs; s = cos (2 * pi * fc1 * t) + cos (2 * pi * fc2 * t); f = (-fs/2 : fs/length (s) : fs/2 - fs/length (s)); S = 10 * log10 (abs (fftshift(fft(s)))); figure ;subplot(2 , 1 , 1 ); plot (t, s);xlabel("Time (s)" ); ylabel("Amplitude" ); title("The Original Signal" ); grid on; subplot(2 , 1 , 2 ); plot (f, S);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of the Original Signal" ); grid on; N = 2048 ; f_2048 = (-fs/2 : fs/N : fs/2 - fs/N); S_2048 = 10 * log10 (abs (fftshift(fft(s, N)))); N = 1024 ; f_1024 = (-fs/2 : fs/N : fs/2 - fs/N); S_1024 = 10 * log10 (abs (fftshift(fft(s, N)))); N = 2048 ; f_zero_padding = (-fs/2 : fs/N : fs/2 - fs/N); s = [s(1 :1024 ) zeros (1 , 1024 )]; S_zero_padding = 10 * log10 (abs (fftshift(fft(s, N)))); figure ;subplot(3 , 1 , 1 ); plot (f_2048, S_2048);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of the Original Signal ((FFT-2048)" ); grid on; subplot(3 , 1 , 2 ); plot (f_1024, S_1024);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of the Original Signal (FFT-1024)" ); grid on; subplot(3 , 1 , 3 ); plot (f_zero_padding, S_zero_padding);xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Spectrum of the Zero-padding Signal (FFT-2048)" ); grid on; sgtitle("Simulation of Fence Effect" ); toc;
内插与抽取
在原有的离散数据间插入 个数据,实现对数据的上采样,具体实现流程为插值 和滤波 。
假设原数据为 ,经过 倍上采样后得到 .
原数据的DFT为 经过上采样的数据 的DFT为 由此可知, 是由原频谱 复制 次的结果。