zoukankan      html  css  js  c++  java
  • 《DSP using MATLAB》Problem 5.19

    代码:

    function [X1k, X2k] = real2dft(x1, x2, N)
        %% ---------------------------------------------------------------------
    	%%    DFT of two Real-Valued N-Point sequence x1(n) and x2(n)
    	%% ---------------------------------------------------------------------
    	%% [X1, X2] = real2dft(x1, x2, N)
    	%%      X1k = n-point DFT of x1
    	%%      X2k = n-point DFT of x2
    	%%       x1 = sequence of length <= N
    	%%       x2 = sequence of length <= N
    	%%       N  = length of DFT
    	
    	% ----------------------------------------
    	%    if length of x1 and x2 < N, 
    	%       then padding zeros
    	% ----------------------------------------
    	if ( length(x1) < N)
    		x1 = [x1 zeros(1, N-length(x1))];
        end
    
    	if ( length(x2) < N)
    		x2 = [x2 zeros(1, N-length(x2))];
        end
    
    	x = x1 + j * x2;
    	
    	N = length(x); k = 0:(N-1); 
     
        Xk_DFT = dft(x, N);
        Xk_DFT_fold = Xk_DFT(mod_1(-k,N)+1);
    
        Xk_CCS = 0.5*(Xk_DFT + conj(Xk_DFT_fold));
        Xk_CCA = 0.5*(Xk_DFT - conj(Xk_DFT_fold));
    
    	X1k = Xk_CCS;
    	X2k = Xk_CCA;
    

      

    %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    %%            Output Info about this m-file
    fprintf('
    ***********************************************************
    ');
    fprintf('        <DSP using MATLAB> Problem 5.19 
    
    ');
    
    banner();
    %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    % ---------------------------------------------------------------------------------
    %          X(k) is N-point DFTs of N-point Complex-valued sequence x(n)             
    %               x(n) = xR(n) + j xI(n)
    %            xR(n) and xI(n) are real and image parts of x(n);  
    %            DFT[xR]=Xccs(k)   DFT[j*xI]=Xcca(k)
    %            
    %            Xccs = 0.5*[X(k)+ X*((-k))]      Xcca = 0.5*[X(k) - X*((-k))]
    %                                             
    % ---------------------------------------------------------------------------------
     n = [0:39]; 
    x1 = cos(0.1*pi*n);                 % N=40 real-valued sequence
    x2 = sin(0.2*pi*n);                 % N=40 real-valued sequence
    
    x = x1 + j * x2;
     
    N = length(x); k = 0:(N-1); 
     
        Xk_DFT = dft(x, N);
        Xk_DFT_fold = Xk_DFT(mod_1(-k,N)+1);
        
        magXk_DFT = abs( [ Xk_DFT ] );                                    % DFT magnitude
        angXk_DFT = angle( [Xk_DFT] )/pi;                                 % DFT angle
       realXk_DFT = real(Xk_DFT); 
       imagXk_DFT = imag(Xk_DFT);
        
        magXk_DFT_fold = abs( [ Xk_DFT_fold ] );                                    % DFT magnitude
        angXk_DFT_fold = angle( [Xk_DFT_fold] )/pi;                                 % DFT angle
       realXk_DFT_fold = real(Xk_DFT_fold); 
       imagXk_DFT_fold = imag(Xk_DFT_fold);
    
    % --------------------------------------------------------
    %        Calculater one N-point DFT to get
    %                two N-point DFT 
    % --------------------------------------------------------
    [X1k_DFT, X2k_DFT] = real2dft(x1, x2, N);
    
    
        magX1k_DFT = abs( [ X1k_DFT ] );                                    % DFT magnitude
        angX1k_DFT = angle( [X1k_DFT] )/pi;                                 % DFT angle
       realX1k_DFT = real(X1k_DFT); 
       imagX1k_DFT = imag(X1k_DFT);
        
        magX2k_DFT = abs( [ X2k_DFT ] );                                    % DFT magnitude
        angX2k_DFT = angle( [X2k_DFT] )/pi;                                 % DFT angle
       realX2k_DFT = real(X2k_DFT); 
       imagX2k_DFT = imag(X2k_DFT);
    
    
    % -------------------------------------------------------
    %         Get DFT of xR and xI directorly
    % -------------------------------------------------------
    XRk_DFT = dft(x1, N);
    XIk_DFT = dft(j*x2, N);
    
        magXRk_DFT = abs( [ XRk_DFT ] );                                    % DFT magnitude
        angXRk_DFT = angle( [XRk_DFT] )/pi;                                 % DFT angle
       realXRk_DFT = real(XRk_DFT); 
       imagXRk_DFT = imag(XRk_DFT);
        
        magXIk_DFT = abs( [ XIk_DFT ] );                                    % DFT magnitude
        angXIk_DFT = angle( [XIk_DFT] )/pi;                                 % DFT angle
       realXIk_DFT = real(XIk_DFT); 
       imagXIk_DFT = imag(XIk_DFT);
    
    
    figure('NumberTitle', 'off', 'Name', 'P5.19  xR(n) and xI(n)')
    set(gcf,'Color','white'); 
    subplot(2,1,1); stem(n, x1); 
    xlabel('n'); ylabel('x1');
    title('real part of x(n), cos(0.1pin), N=40');  grid on;
    subplot(2,1,2); stem(n, x2); 
    xlabel('n'); ylabel('x2');
    title('imag part of x(n), sin(0.2pin), N=40');  grid on;
    
    
    
    figure('NumberTitle', 'off', 'Name', 'P5.19 X(k), DFT of x(n)')
    set(gcf,'Color','white'); 
    subplot(2,2,1); stem(k, magXk_DFT); 
    xlabel('k'); ylabel('magnitude(k)');
    title('magnitude DFT of x(n), N=40');  grid on;
    subplot(2,2,3); stem(k, angXk_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('angle(k)');
    title('angle DFT of x(n), N=40');  grid on;
    subplot(2,2,2); stem(k, realXk_DFT); 
    xlabel('k'); ylabel('real (k)');
    title('real DFT of x(n), N=40');  grid on;
    subplot(2,2,4); stem(k, imagXk_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('imag (k)');
    title('imag DFT of x(n), N=40');  grid on;
    
    
    
    figure('NumberTitle', 'off', 'Name', 'P5.19 X((-k))_N')
    set(gcf,'Color','white'); 
    subplot(2,2,1); stem(k, magXk_DFT_fold); 
    xlabel('k'); ylabel('magnitude(k)');
    title('magnitude X((-k)), N=40');  grid on;
    subplot(2,2,3); stem(k, angXk_DFT_fold);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('angle(k)');
    title('angle X((-k)), N=40');  grid on;
    subplot(2,2,2); stem(k, realXk_DFT_fold); 
    xlabel('k'); ylabel('real (k)');
    title('real X((-k)), N=40');  grid on;
    subplot(2,2,4); stem(k, imagXk_DFT_fold);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('imag (k)');
    title('imag X((-k)), N=40');  grid on;
    
    
      
    
    figure('NumberTitle', 'off', 'Name', 'P5.19 X1(k) by real2dft')
    set(gcf,'Color','white'); 
    subplot(2,2,1); stem(k, magX1k_DFT); 
    xlabel('k'); ylabel('magnitude(k)');
    title('magnitude, N=40');  grid on;
    subplot(2,2,3); stem(k, angX1k_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('angle(k)');
    title('angle, N=40');  grid on;
    subplot(2,2,2); stem(k, realX1k_DFT); 
    xlabel('k'); ylabel('real (k)');
    title('real, N=40');  grid on;
    subplot(2,2,4); stem(k, imagX1k_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('imag (k)');
    title('imag, N=40');  grid on;
    
    figure('NumberTitle', 'off', 'Name', 'P5.19 X2(k) by real2dft')
    set(gcf,'Color','white'); 
    subplot(2,2,1); stem(k, magX2k_DFT); 
    xlabel('k'); ylabel('magnitude(k)');
    title('magnitude, N=40');  grid on;
    subplot(2,2,3); stem(k, angX2k_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('angle(k)');
    title('angle, N=40');  grid on;
    subplot(2,2,2); stem(k, realX2k_DFT); 
    xlabel('k'); ylabel('real (k)');
    title('real, N=40');  grid on;
    subplot(2,2,4); stem(k, imagX2k_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('imag (k)');
    title('imag, N=40');  grid on;
    
    
    figure('NumberTitle', 'off', 'Name', 'P5.19 XR(k) by direct')
    set(gcf,'Color','white'); 
    subplot(2,2,1); stem(k, magXRk_DFT); 
    xlabel('k'); ylabel('magnitude(k)');
    title('magnitude, N=40');  grid on;
    subplot(2,2,3); stem(k, angXRk_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('angle(k)');
    title('angle, N=40');  grid on;
    subplot(2,2,2); stem(k, realXRk_DFT); 
    xlabel('k'); ylabel('real (k)');
    title('real, N=40');  grid on;
    subplot(2,2,4); stem(k, imagXRk_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('imag (k)');
    title('imag, N=40');  grid on;
    
    
    figure('NumberTitle', 'off', 'Name', 'P5.19 XI(k) by direct')
    set(gcf,'Color','white'); 
    subplot(2,2,1); stem(k, magXIk_DFT); 
    xlabel('k'); ylabel('magnitude(k)');
    title('magnitude, N=40');  grid on;
    subplot(2,2,3); stem(k, angXIk_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('angle(k)');
    title('angle, N=40');  grid on;
    subplot(2,2,2); stem(k, realXIk_DFT); 
    xlabel('k'); ylabel('real (k)');
    title('real, N=40');  grid on;
    subplot(2,2,4); stem(k, imagXIk_DFT);  
    %axis([-N/2, N/2, -0.5, 50.5]);
    xlabel('k'); ylabel('imag (k)');
    title('imag, N=40');  grid on;
    

      运行结果:

           复数序列的实部和虚部

            复数序列的DFT,X(k)

            X((-k))

            直接计算实部和虚部的DFT,XR(k)和XI(k)

            利用函数real2dft计算实部和虚部对应的DFT,Xccs(k)和Xcca(k)

              结论:

              如果X(k)是N点复数序列x(n)的N点DFT,x(n)=xR(n)+jxI(n),那么有

              DFT[xR]=Xccs(k)   DFT[j*xI]=Xcca(k)

              实部序列的DFT是复数序列的DFT的共轭圆周对称分量

              虚部序列的DFT是复数序列的DFT的共轭圆周反对称分量。

    牢记: 1、如果你决定做某事,那就动手去做;不要受任何人、任何事的干扰。2、这个世界并不完美,但依然值得我们去为之奋斗。
  • 相关阅读:
    js监听对象属性的改变
    js中的垃圾回收机制
    防抖和节流
    Ajax的浏览器缓存问题及解决方法
    Java多线程系列---“基础篇”07之 线程休眠
    Java多线程系列---“基础篇”06之 线程让步
    Java多线程系列---“基础篇”05之 线程等待与唤醒
    Java多线程系列---“基础篇”04之 synchronized关键字
    Java多线程系列---“基础篇”03之 Thread中start()和run()的区别
    Java多线程系列---“基础篇”02之 常用的实现多线程的两种方式
  • 原文地址:https://www.cnblogs.com/ky027wh-sx/p/9417231.html
Copyright © 2011-2022 走看看