DFT,DTFT,FFT的区别与联系

离散时间傅里叶变换(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;                         % 原信号是18列的矩阵
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变换(自己编写实现)');         


仿真结果
在这里插入图片描述

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值