离散时间傅里叶变换(DTFT)和离散傅里叶变换(DFT)
1 基本原理
DTFT:离散时间傅里叶变换;
DFT:离散傅里叶变换;
FFT:FFT是DFT的一种高效快速算法,也称作快速傅里叶变换。
总图
2 仿真分析
2.1 DTFT和DFT的区别与联系
源代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 程序功能:求序列的离散时间傅里叶变换(DTFT)、离散傅里叶变换(DFTorFFT)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear all;
close all;
N=2000; % 序列的点数
fs=1e2;
t=0:1/fs:(N-1)/fs;
n=t; % 原信号是1行8列的矩阵
x_n=0.5.^n; % 构建原始信号,为指数信号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 离散时间傅里叶变换(DTFT)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
womiga=2*pi*(-1:1/800:1); % 频域共-800~+800 的长度(本应是无穷,高频分量很少,故省去)
X_jwomiga=x_n*exp(-1j*n'*womiga); % 求DTFT变换,采用原始定义的方法,对复指数分量求和而得
P_DTFT=abs(X_jwomiga)/N;
figure(1)
subplot(211);
stem(n,x_n);grid on;
xlabel('时间/s');ylabel('幅度');
title('原始信号');%时域波形
subplot(212);
plot(womiga/(2*pi),P_DTFT);grid on;
title('DTFT变换'); %频域波形
xlabel('频率/Hz');ylabel('幅度');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 离散傅里叶变换(DFT or FFT)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x_t=0.5.^t;
X=fftshift(fft(x_t));
P_FFT=abs(X)/N;
f=(0:N-1)*fs/N-fs/2;
figure(2)
subplot(211);
stem(t,x_t);grid on;
xlabel('时间/s');ylabel('幅度');
title('原始信号');%时域波形
subplot(212);
plot(f,P_FFT);grid on;
xlim([-1,1]);
title('FFT变换'); %频域波形
xlabel('频率/Hz');ylabel('幅度');
% 对比DTFT和FFT的频谱
figure(3)
plot(womiga/(2*pi),P_DTFT);hold on;grid on;
plot(f,P_FFT);hold on;grid on;
xlim([-1,1]);
xlabel('频率/Hz');ylabel('幅度');
legend('DTFT','FFT');
仿真结果
2.2 DFT和FFT的区别与联系
源代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 程序功能:
%(1)求序列的离散傅里叶变换(DFT);
%(2)对应的快速算法FFT的实现(调用函数和根据原理自己编写);
%(3)验证两个的结果是否一致。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear all;
close all;
N=2048; % 序列的点数
f1=1e4; % 信号频率
f2=3e4;
fs=10*f2; % 采样频率
t=0:1/fs:(N-1)/fs;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 原始信号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% x=cos(2*pi*f1*t); % 构建原始信号
x=cos(2*pi*f1*t)+3*cos(2*pi*f2*t);
figure(1)
plot(t,x);grid on;
xlabel('时间/s');ylabel('幅度');
title('原始信号'); % 时域波形
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1、 DFT算法的实现
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for m=1:N % 不同频率成分所对应的序号
sum_X(m)=0;
for n=1:N % 不同采样点所对应的序号
sum_X(m)=sum_X(m)+x(n)*exp(-1j*2*pi/N*m*n);
end
end
P_DFT=abs(sum_X)/N;
f1=(0:N-1)*fs/N; % 注意此时横轴的范围 和用了fftshift的区别
figure(2)
plot(f1,P_DFT);grid on; % 在f和fs-f出现频点
title('DFT变换');
xlabel('频率/Hz');ylabel('幅度');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2、 FFT算法的实现(调用函数实现)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% X=fftshift(fft(x)); % 快速算法
X=fft(x);
P_FFT=abs(X)/N;
% f2=(0:N-1)*fs/N-fs/2;
figure(3)
plot(f1,P_FFT);grid on; % 在f和fs-f出现频点
title('FFT变换(调用函数实现)');
xlabel('频率/Hz');ylabel('幅度');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 3、 FFT算法的实现(根据原理自己编写)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 为什么x1和x2的序列是这样,见陈后金老师的《数字信号处理》94页
x1=x(1:2:end); % x1(k)=x(2k) x1(k)是序列x(k)中的偶数点构成的序列 k=0,1,...,N/2-1
x2=x(2:2:end); % x2(k)=x(2k+1) x2(k)是序列x(k)中的奇数点构成的序列 k=0,1,...,N/2-1
% 得到两个短序列的DFT
for m=1:N/2 % 不同频率成分所对应的序号
sum1_X(m)=0;
sum2_X(m)=0;
for n=1:N/2 % 不同采样点所对应的序号
sum1_X(m)=sum1_X(m)+x1(n)*exp(-1j*2*pi/(N/2)*m*n);% 计算X1_m
sum2_X(m)=sum2_X(m)+x2(n)*exp(-1j*2*pi/(N/2)*m*n);% 计算X2_m
end
end
% 合成长序列
for m=1:N/2 % 不同频率成分所对应的序号
X_m(m) =sum1_X(m)+exp(-1j*2*pi/N*m)*sum2_X(m);
X_m(m+N/2)=sum1_X(m)-exp(-1j*2*pi/N*m)*sum2_X(m);
end
P1_FFT=abs(X_m)/N;
figure(4)
plot(f1,P1_FFT);grid on;
title('FFT变换(自己编写实现)'); % 频域波形
xlabel('频率/Hz');ylabel('幅度');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 4、对比
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(5)
f3=(0:N/2-1)*fs/N; % 只画0到fs/2的频谱
plot(f3,P_DFT(1:N/2),'-r*');hold on; % 在f和fs-f出现频点
plot(f3,P_FFT(1:N/2),'-k^');hold on;
plot(f3,P1_FFT(1:N/2),'-bo');grid on;
legend('DFT变换','FFT变换(调用函数实现)','FFT变换(自己编写实现)');
仿真结果