离散傅里叶变换(DFT)

预备知识

傅里叶级数

傅里叶变换是 以时间 为自变量的时域信号以频率 为自变量的频域函数 之间的变换关系。

对于周期为 的连续时间信号 ,其频谱 是离散非周期函数

其中 为离散频谱两谱线间的角频率间隔, 为谐波序号。

对于连续的非周期时间信号 ,其频谱 是一个连续的非周期函数。满足

对于离散非周期信号,其频谱 是连续周期信号

其中 是数字角频率,满足

可以看出,时间域的周期造成频谱的离散,时间域的非周期造成频谱的连续。

不过,上面的三种傅里叶变换总有一个域是连续的,这不能利用计算机辅助计算。

周期序列的离散傅里叶级数(DFS)

离散非周期信号的频谱是连续的,将连续的傅里叶变换 点采样后,频域离散,时域周期延拓。因此,离散傅里叶级数对周期序列才存在。

是周期为 的一个离散周期序列

由离散时间傅里叶变换(DTFT)可知,该周期序列可以表示为

其中 是离散傅里叶级数的系数,

并且

也是周期序列。因此,时域的离散周期序列的离散傅里叶级数(DFS)在频域也是离散的周期序列。

,离散傅里叶级数可表示为

连续周期信号与离散周期序列的对比
分类 基频序列 周期 基频 次谐波序列
连续周期
离散周期

由于 ,离散傅里叶级数的所有谐波成分中只有 个是独立的,因此在展开成离散傅里叶级数时,只能取 个独立的谐波分量。

有限长序列的离散傅里叶变换(DFT)

将长度为 的有限长序列 看作是周期为 的周期序列的一个周期,计算该周期序列的离散傅里叶级数,即可得到有限长序列的离散傅里叶变换。

也可以表示为周期延拓或时窗运算

可以得到有限长序列的离散傅里叶变换为

有限长序列 的 DFT ,就是 的周期延拓序列 的 DFS 系数 的主值序列。DFT 的时域与频域都是有限长序列,方便用计算机表示。

频域采样(频域采样点数 的选取)

设时域周期序列 的周期为

带入上式,得到

其中,当

说明,频域 点采样等价于时域上以 为周期延拓,因此 时,时域不发生混叠。

  • 循环移位性质

频域移位点数 与对应的 时域频偏频率 的关系:

假设捕获模块的输入信号时经过 倍内插的信号,即 ,则在频域进行 点循环移位对应时域生成的载波为

其中 表示扩频比, 为内插系数, 为采样频率, 为码片速率, 为符号速率。

可以得到结论:频域循环移位 点对应时域乘以频率为为 的载波.

  • 共轭对称性(类似于偶对称和奇对称)

在 DFT 中,涉及的序列 均为有限长序列,主值区间为 ,这里的对称性指的是关于 的圆周对称,长度为 的有限长序列 的圆周共轭对称分量 和圆周共轭反对称分量 分别定义为

满足

因此,任何有限长序列都可分解为圆周共轭对称分量 和圆周共轭反对称分量 的和,

其中

同理,将 表示为 ,其中

DFT 与 DTFT、ZT 的关系

已知 点有限长序列,则 变换为

DTFT 为

DFT 为

有限长序列 的 DTFT 是单位圆上的 变换, 是连续的,体现出 DTFT 是以 为周期的连续谱。

有限长序列 的 DFT 是对 在单位圆上进行 点的等间隔采样,也是 DTFT 一个周期 上的 点等间隔采样。

如果频域采样满足频域采样定理(频域采样点数 不小于时域序列长度 ),就可以用频域采样值恢复序列的 变换,

可以表示为

函数 有一个极点 个零点 ,因此内插函数 在除了 的其它 个采样点均为

同理,

其中 为内插函数,满足

也就是每个采样点上的 的值等于 ,即 ,各个采样点之间的值由各采样点的加权内插函数 在所求 点上的值叠加得到。

interpolation

由内插函数求频率响应

频域内插(与 卷积),等价于时域截断(加矩形窗)

线性卷积与线性相关

周期卷积

都是以 为周期的序列,DFS 分别为 ,若

圆周卷积(循环卷积)

设当 都是长度为 的有限长序列,DFT 分别为 ,若

记作 .

当信号通过线性时不变系统时,系统的输出 时输入 与单位脉冲响应 的线性卷积,即 ,当 均为有限长序列时,可以考虑用圆周卷积代替线性卷积,下面分析代替的条件:

设序列 分别是长度为 的有限长序列,设 是两者的线性卷积

是长度为 的有限长序列。

是两者的 点圆周卷积

因此, 点圆周卷积 是线性卷积 为周期延拓序列的主值序列,且不失真的条件是

circ_conv

圆周卷积代替线性卷积

谱分析

对于时域连续的非周期信号 ,其 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;

% FIXME System Parameters
fs = 160e3;
t_total = 1;

% Taking single tone signal as an example
fc = 20e3;
t = 0 : 1/fs : t_total - 1/fs;
s = cos(2 *pi* fc * t);

% FIXME Hamming Window Function (or Bartlett, Hanning, Blackman et al.)
N = 2048; % FIXME The number of FFT points
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;

% FIXME System Parameters
fs = 1e6;
t_total = 1;

% Taking the dual-tone signal as an example
fc1 = 5e3; fc2 = 6e3; % FIXME
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; % FIXME The number of FFT points
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))));

% After padding zero at the end
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 为

由此可知, 是由原频谱 复制 次的结果。