版权声明:本文为博主原创文章,未经博主允许不得转载。 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,则应该得出与例程代码运行相同的图像。得到图像如下:
与之前运行所得图像相同。
根据例程,配合编写好的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));
得到图像如下:
可见先进行线性运算再变换和先变换再线性运算结果相同,即验证了DFT具有线性的性质。
根据例程,输入代码如下:
%循环移位
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)');
得到图像如下:
左边图像表示了两序列之间为循环移位的关系,且相差6.右边图像则表明了DFT的移位性质,即:
循环卷积的定义:两个序列的N点循环卷积定义为:
利用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)');