美文网首页
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实现

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