DSP课后题的实验验证实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Stynis/article/details/80531356

题目1
编写函数 DFT_new(x,N,win)
参数x表示输入序列 N表示DFT长度 win控制窗函数类型(条件语句)
根据要求在例程基础上编写代码如下:

function Xk= DFT_NEW(xn,NN,win)
%Summary of this function goes here
%Detailed explanation goes here
if length(xn)>NN
    N=NN;
  my1_xn = rectwin(win).*xn;
  M = length(my1_xn);  
  my_xn = [my1_xn,zeros(1,NN-M)];
else
  M = length(xn);  
  N=NN;
  my_xn = [xn,zeros(1,NN-M)];
end 
for ii=0:N-1
     for kk=0:N-1
         A(ii+1,kk+1)=exp(-1j*2*pi/N*ii*kk);
     end
 end

 Xk=my_xn*A;
end

使用boxcar矩形窗,由于matlab提示该函数已被替换为rectwin,于是改为rectwin函数。
仍以课件例题为示例

%函数DFT
clc;clear all;close all;
xn = ones(1,5);
NN = 10;
Xk= DFT_NEW(xn,NN,6);
figure;
stem(0:NN-1,abs(Xk));

取窗函数长度为6,则应该得出与例程代码运行相同的图像。得到图像如下:
ex4.1
与之前运行所得图像相同。
ex4.2
根据例程,配合编写好的DFT_NEW函数,取窗口函数长度为12,输入代码如下:

%线性
clc;clear all;close all;
n=0:1:10;
x1=0.8*sin(n*pi/3)+4;
x2=[1 1 1 1 1 1 1 1 1 0 0];
y11=DFT_NEW(x1,length(n),12);
y12=DFT_NEW(x2,length(n),12);
y1=y11+y12;
figure,stem(n,abs(y1));
x=x1+x2;
y2=DFT_NEW(x,length(n),12);
figure,stem(n,abs(y2));

得到图像如下:
ex4.3
可见先进行线性运算再变换和先变换再线性运算结果相同,即验证了DFT具有线性的性质。
ex4.4
根据例程,输入代码如下:

%循环移位
clc;clear all;close all;
m=6; N=11;
n=0:1:N-1;
x=10*(0.8).^n; %n
y=fft(x);

for ii=0:N-1
%ii作为矩阵序号,需从1开始
    % 双等号表判断
    if ii+1+m==N
        x1(ii+1+m)=x(ii+1);
    else
        x1(mod(ii+1+m,N))=x(ii+1);
    end
end
y1=fft(x1);

yy=y.*exp(-1*1j*2*pi/N*(0:N-1)*m);
figure;
subplot(2,1,1);
stem(n,x);
title('x(n)');

subplot(2,1,2);
stem(n,x1);
title('x1(n)');

figure;
subplot(2,1,1);
stem(n,abs(y1));
title('X(k)');

subplot(2,1,2);
stem(n,abs(yy));
title('X1(k)');

得到图像如下:
ex4.5
左边图像表示了两序列之间为循环移位的关系,且相差6.右边图像则表明了DFT的移位性质,即:
ex4.6
ex4.7
循环卷积的定义:两个序列的N点循环卷积定义为:
ex4.8
利用MATLAB实现两个序列的循环卷积可以分三个步骤完成:
(1)初始化:确定循环点数N,测量输入2个序列的长度。
(2)循环右移函数:将序列x(n)循环右移,一共移N次(N为循环卷积的循环次数),最后将每次循环成的新序列组成一个矩阵V。
(3)相乘:将x(n)移位后组成的矩阵V与第二个序列h(n)对应相乘,即得循环卷积结果。程序如下:

clear;close all;
N=50;
x1=[6 15 -6 3 5 7 0 1];
x2=[7 1 2 9 4 3 20 6];
x2=[x2,zeros(1,7),x2,zeros(1,7),x2,zeros(1,7),x2];
xn1=length(x1);
xxn1=0:xn1-1;
xn2=length(x2);
xxn2=0:xn2-1;
subplot(3,1,1);
stem(xxn1,x1);
subplot(3,1,2);
stem(xxn2,x2);

x11=fft(x1,N);
x12=fft(x2,N);
y11=x11.*x12;
y1=ifft(y11,N);
subplot(3,1,3);
n=0:length(y1)-1;
stem(n,y1);
title('循环卷积的结果');
xlabel('n');ylabel('y1(n)');

ex4.9

猜你喜欢

转载自blog.csdn.net/Stynis/article/details/80531356