CTFT、DTFT、DFT、FFT
毕导RAM
编辑于 2022年07月14日 10:52
  • 欧拉公式

【 1. CTFT 】

  • 连续时间傅里叶变换(Continuous Time Fourier transform)

  • 处理对象: 连续时间信号

【 2. DTFT 】

  • 离散时间傅里叶变换(Discrete Time Fourier transform)

  • 处理对象: 离散时间信号

【 3. DFT 】

  • 离散傅里叶变换(Discrete Fourier transform)

  • 处理对象: 离散时间信号

  • DFT 和 DTFT 的关系 在 DTFT 基础上,w轴上的 [0,2π] 范围内,对的频率均匀抽样N次,即序列X[k]就是在N个等间隔频率上的一组频率样本。

【 4. CTFT、DTFT、DFT 之间的关系 】

【 5. FFT 】

  • 快速傅里叶变换(Fast Fourier transform)

  • FFT 和 DFT 之间的关系:FFT是一种 DFT 的高效算法

5.1 Matlab 对 fft 函数的阐述

代码块
Go
自动换行
复制代码
X = fft(xn,M); %计算 xn 的 M 点 FFT,赋值给X。
复制成功
  • 采样点数N(xn的长度) > FFT运算点数Mfft() 函数对信号 xn 进行截断操作即只取N个采样点中的前M个点进行分析。幅度轴:频率轴:

  • 采样点数N(xn的长度) < FFT运算点数Mfft() 函数对信号 xn 进行尾补零操作即在该信号尾部添加多个值为0的数据点以使信号总点数N增至FFT运算所需点数M。幅度轴:频率轴:

代码块
Go
自动换行
复制代码
%% [预处理]
clc;   %清除命令窗口
clear; %清除工作空间的变量和函数
clf;   %清除当前图形

%% [采样参数]
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=5000;    %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%% [被采信号] 
fa=100;           %信号a的频率
fb=900;           %信号b的频率
xn=2.5+sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%% [FFT处理]
M=4096;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=[X(1)/M,X(2:M)*2/M]; %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%% [作图]
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线
复制成功

5.2 FFT运算点数对结果的影响

为了更好的分析单一变量对结果的影响,本例不考虑频谱泄漏。

代码块
Go
自动换行
复制代码
%% [预处理]
clc;   %清除命令窗口
clear; %清除工作空间的变量和函数
clf;   %清除当前图形

%% [采样参数]
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=1000;    %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%% [被采信号] 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%% [FFT处理1]
M=128;         %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/M;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

subplot(2,3,1);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图1:采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线

%% [FFT处理2]
M=256;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/M;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

subplot(2,3,2);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图2:采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线

%% [FFT处理3]
M=512;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/M;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

subplot(2,3,3);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图3:采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线

%% [FFT处理4]
M=1024;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/N;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

subplot(2,3,4);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图4:采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线

%% [FFT处理5]
M=2048;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/N;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

subplot(2,3,5);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图5:采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线

%% [FFT处理6]
M=4096;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/N;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

subplot(2,3,6);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图6:采样频率',num2str(fs),' , 采样点数',num2str(N)],['FFT运算点数',num2str(M)]});
grid;            %显示表格线
复制成功

采样频率、采样点数固定时,随 FFT运算点数增大,精度不断提高 。

5.3 采样点数对结果的影响

代码块
Go
自动换行
复制代码
%% [预处理]
clc;   %清除命令窗口
clear; %清除工作空间的变量和函数
clf;   %清除当前图形

%% [FFT处理1]
%%% 1.1 采样参数
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=1000;    %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%%% 1.2 被采信号 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%%% 1.3 FFT处理
M=4096;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/N;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%%% 1.4 作图
subplot(2,3,1);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图1:采样频率',num2str(fs),' , FFT运算点数',num2str(M)],['采样点数',num2str(N)]});
grid;            %显示表格线

%% [FFT处理2]
%%% 2.1 采样参数
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=2000;    %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%%% 2.2 被采信号 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%%% 2.3 FFT处理
M=4096;         %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/N;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%%% 2.4 作图
subplot(2,3,2);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图2:采样频率',num2str(fs),' , FFT运算点数',num2str(M)],['采样点数',num2str(N)]});
grid;            %显示表格线

%% [FFT处理3]
%%% 3.1 采样参数
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=4000;    %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%%% 3.2 被采信号 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%%% 3.3 FFT处理
M=4096;         %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/N;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%%% 3.4 作图
subplot(2,3,3);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图3:采样频率',num2str(fs),' , FFT运算点数',num2str(M)],['采样点数',num2str(N)]});
grid;            %显示表格线

%% [FFT处理4]
%%% 4.1 采样参数
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=8000;    %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%%% 4.2 被采信号 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%%% 4.3 FFT处理
M=4096;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/M;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%%% 4.4 作图
subplot(2,3,4);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图4:采样频率',num2str(fs),' , FFT运算点数',num2str(M)],['采样点数',num2str(N)]});
grid;            %显示表格线

%% [FFT处理5]
%%% 5.1 采样参数
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=16000;   %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%%% 5.2 被采信号 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%%% 5.3 FFT处理
M=4096;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/M;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%%% 5.4 作图
subplot(2,3,5);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图5:采样频率',num2str(fs),' , FFT运算点数',num2str(M)],['采样点数',num2str(N)]});
grid;            %显示表格线

%% [FFT处理6]
%%% 6.1 采样参数
fs=4096;   %采样频率 (Hz)  
ts=1/fs;   %采样周期 (s)
N=32000;   %采样点数 (个)
n=0:N-1;   %采样点索引
t=n*ts;    %采样时间轴

%%% 6.2 被采信号 
fa=128;           %信号a的频率
fb=512;           %信号b的频率
xn=sin(2*pi*fa*t)+3*sin(2*pi*fb*t); %被采信号=信号a+信号b

%%% 6.3 FFT处理
M=4096;        %FFT运算点数
X=fft(xn,M);   %FFT输出值
X=X*2/M;       %幅度轴
k=0:M-1;       %频率点索引
f=fs*k/(M-1);  %频率轴

%%% 6.4 作图
subplot(2,3,6);
stem(f,abs(X));  %序列图
xlabel('频率');  %横轴坐标
ylabel('幅度');  %纵轴坐标
title({['图6:采样频率',num2str(fs),' , FFT运算点数',num2str(M)],['采样点数',num2str(N)]});
grid;            %显示表格线
复制成功

采样频率、FFT运算点数 固定时,随着 采样点数 的提高,精度逐渐提高直至不变。

【 6. 分辨率 】

6.1 时间分辨率

  • 时间分辨率是指在同一区域进行的相邻两次观测的最小时间间隔。时间间隔越小,时间分辨率越高。

  • 反映在FFT中,就相当于对一段序列的进行采样的采样周期。

6.2 频率分辨率

  • 频率分辨率是指将两个相邻谱峰分开的能力,在实际应用中是指分辨两个不同频率信号的最小间隔。

  • 反映在FFT中,频率分辨率可以理解为在频率轴上的所能得到的最小频率间隔。

  • 所以,当被采样信号长度一确定,信号的最大周期就是该长度,信号的最小频率(即频率分辨率)就是原始信号时间长度的倒数。

6.3 频率分辨率和准确度的关系

  • 只有当原信号频率 f0 正好等于频率分辨率的整数倍时才能获得该信号频率及其幅值的准确值。

【 7. 信号补零 】

  • FFT运算点数M > 采样点数N 时,fft(xn,M) 函数对信号 xn 进行尾补零操作即在该信号尾部添加多个值为0的数据点以使信号总点数N增至FFT运算所需点数M。

  • 补1次零相当于在原始频谱图中每两个频率之间插入1个频率值,补2次零相当于在原始频谱图中每两个频率之间插入2个频率值,并且原始频率值的位置及其幅值保持不变。因此, 补零会使频谱图中的频率点的数量增加,从而使得频谱图更加的光滑连续,但是补零不能对频谱图中的 频率分辨率、频率值以及幅值有所改善

  • 在补零操作中,所补的零值点的数量所占分析信号比例越大,分析结果中的幅度越小。

  • 补零的好处: ① 使数据N为2的整次幂,便于使用 FFT。 ② 补零后,其实是对DFT结果做了插值,克服“栅栏"效应,使谱外观平滑化。我把“栅栏&#​34;效应形象理解为,就像站在栅栏旁边透过栅栏看外面风景,栅栏会挡住比较多风景,此时就可能漏掉较大频域分量,但是补零以后,相当于你站远了,风景就看的越来越清楚了。 ③ 由于对时域数据的截短必然造成频谱泄露,因此在频谱中可能出现难以辨认的谱峰,补零在一定程度上能消除这种现象。

【 8. 频谱泄漏 】

  • 对频率为 f0 的原信号 xt 以 Fs 的采样频率进行采样,采样点数为 N ,得到离散序列值 xn ,FFT 运算点数为M,由于 M≠N 时,fft() 函数会进行尾补零或截断操作,因此 令 fft() 函数经过上述操作后所得分析信息中原信号 f0 的周期数为 k,若 k 为非整数,则相当于对信号进行非整周期截断,此时会造成严重的频谱泄露现象,造成频率值和幅度值的偏差。

  • 通过增加 FFT 所分析信息中原信号 f0 的周期数 k 可以改善频谱泄露的现象,减小偏差。当周期数增多时,非整周期部分占整体信号的比例逐渐减少,对整个信号的影响也逐渐变小,频谱泄露逐渐减少,频率值逐渐靠近真实频率值;当周期数足够多时能够得到较准确的频率值,幅值会收敛到一个常数。

【 9. 信号的周期延拓 】

  • 有时我们采集到的信号比较短,这样得到的频率分辨率比较低,这时可能会想如果将信号进行周期延拓可以增加信号的长度。

  • 整周期延拓时两段信号之间是连续的。 非整周期截断会导致频谱中的频率及其幅值不准确,对信号进行延拓后相邻两段信号之间会出现间断点,使得信号之间的连接不连续。

  • 综合整周期截断和非整周期截断后的延拓次数对频谱的影响情况来看,对信号进行延拓相当于增加了采样时间,能够提高频率分辨率,但是不会改善频谱中频率及其幅值的准确性。