离散傅里叶变换(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为 由此可知,是由原频谱复制次的结果。