美文网首页
1周学FFT——第2天 DFT和IDFT的MATLAB实现

1周学FFT——第2天 DFT和IDFT的MATLAB实现

作者: 理耳兔子 | 来源:发表于2020-04-13 00:37 被阅读0次

根据定义式,可写出DFT的MATLAB代码如下[从玉良,2009,p72]:

function [f, Xk] = mydft(xn, fs, N)
    % DFT
    n = [0:1:N-1];
    k = n;
    WN= exp(-j*2*pi/N);
    nk = n' * k;            % N^2 times multiply
    Xk = xn(1:N) * WN.^nk;  % N^3 times multiply
    f = 0:fs/N:fs/N*(N-1);
% end of function

该函数的使用方法如下:

clear;
fs = 200;   % sample frequency
N  = 40;    % the point of DFT, try to change it.

% compose the input signal
d = 0:(1/fs):1;
xn = sin(2*pi*5*d) + 0.3*sin(2*pi*10*d);
subplot(2,1,1);
stem(d, xn);
title('离散时间序列x(n),(1, 5Hz)和(0.3, 10Hz)叠加,采样频率200Hz');

[f, Xk] = mydft(xn, fs, N);
Xk_amp = abs(Xk)/N*2;   % amplitude of Xk, should be divided by N/2
subplot(2,1,2);
stem(f(1:N/2), Xk_amp(1:N/2));  % display only half of N
title('离散频率序列X(k),N=40,\Delta f = fs/N=5Hz,避免栅栏效应')

运行结果为:

DFT结果

如果预先知道信号的基频及谐波频率的话,可以有针对性的设计fsN,以避免频率混叠和栅栏效应。

比如上面的例子中信号基频为5Hz,含有2次谐波(10Hz),则可令fs=200,远大于奈奎斯特频率,可避免频率混叠。同时,N=40,则细分频率\Delta f = \frac{f_s}{N}=5Hz,正好可整除基波及谐波,可避免出现栅栏效应。

如果fsN选择不合适的话,效果如下:

频率混叠和栅栏效应

IDFT的MATLAB代码如下:

function [nn, xn] = myidft(Xk, fs, N)
    % DFT
    n = [0:1:N-1];
    k = n;
    WN= exp(-j*2*pi/N);
    nk = n' * k;            % N^2 times multiply
    xn = (Xk(1:N) * WN.^(-nk))/N;  % N^3 times multiply
    nn = 0:1/fs:1/fs*(N-1);
% end of function

该函数的使用方法如下:

%% IDFT
clear;
fs = 200;   % sample frequency
N  = 40;    % the point of DFT, try to change it.

% compose signal
d = 0:(1/fs):1;
xn = sin(2*pi*5*d) + 0.3*sin(2*pi*10*d);
subplot(2,1,1);
stem(d, xn);
title('原始信号序列');

[f, Xk] = mydft(xn, fs, N);
Xk_amp = abs(Xk)/N*2;   % amplitude of Xk, should be divided by N/2

[nn, xnn] = myidft(Xk, fs, N);
subplot(2,1,2);
stem([nn, 1/5+nn, 2/5+nn, 3/5+nn, 4/5+nn],[xnn, xnn, xnn, xnn, xnn], 'r');
title('IDFT复原序列(复制5次)');

运行效果如下:

IDFT运行效果

如果此处刻意的制造栅栏效应(比如令N=100),根据栅栏后的频谱IDFT复原出来的波形与原始波形看起来没有太大区别。

习题:

  1. 编写matlab脚本程序,实现DFT和IDFT算法;
  2. 利用所编写的程序对信号x(t) = \text{sin}(2\pi t) + 2\text{sin}(4\pi t)进行DFT分析,并绘制频谱序列图,注意点数N和采样频率f_s的选择,避免出现频率混叠和栅栏效应;
  3. 利用所编写的程序对第2问的频率序列进行IDFT重构,并绘制重构之后的时间序列图。

相关文章

  • 1周学FFT——第2天 DFT和IDFT的MATLAB实现

    根据定义式,可写出DFT的MATLAB代码如下[从玉良,2009,p72]: 该函数的使用方法如下: 运行结果为:...

  • matlab实现DFT和FFT

    一、DFT(傅里叶变换) 先说一下自己的编写顺序:1、先用.m文件编写出DFT2、再将不同值的x(n)和N代入对比...

  • 基2FFT原理

    首发于个人博客 FFT前置知识 FT和DFT 傅里叶变换FT(fourier transform)用于将时域信号和...

  • 离散傅里叶变换DFT与FFT,MATLAB的FFT函数使用

    学号:17020120039 姓名:韦涛 转载自:https://blog.csdn.net/qq_3733589...

  • DFT与FFT

    回顾离散时间傅里叶级数DFS 回顾离散时间傅里叶变换DTFT DFT 要在计算机上实现DTFT,有一个问题就是所需...

  • 快速傅里叶变换和离散傅里叶变换

    快速傅里叶变换(FFT) 离散傅里叶变换(DFT) 基础理论是傅里叶变换的分离形式,和采样定理(香菜定理) 采样定...

  • 附录、DFT,DTFT,DFS,FT,FS-草稿

    DFT的最初引入就是为了使数字计算机能够帮助分析连续时间信号的频谱。DFT的快速算法——快速傅里叶变换(FFT)的...

  • 数字信号处理实验4:DFT频谱分析

    %实验4:DFT频谱分析 %设计计算机程序,产生序列并计算序列的FFT和IFFT,绘制其幅频特性和相频特性曲线; ...

  • 4.FFT(DFT)

    1.简介 这一篇说到哪里就写到哪里,因为这个问题是信号处理的基本问题,也没什么太多好讲的,而且讲这个的文章也太多了...

  • Matlab 进行FFT分析

    [TOC] 基本概念 序号和 频率成分的关系 因为0频的存在,最高频率为Fs-df即df*(N-1)FFT频率序...

网友评论

      本文标题:1周学FFT——第2天 DFT和IDFT的MATLAB实现

      本文链接:https://www.haomeiwen.com/subject/lxhwmhtx.html