Q3.24 写一个MATLAB程序,用一个N点复数离散傅里叶计算两个长度为N的实数序列的N点离散傅里叶变换,,并将结果同直接使用两个N点离散傅里叶变换得到的结果进行比较。
clf; N=256;
nn = [0:N-1];
ntime = [-N/2:N/2-1]; g = (0.75).^abs(ntime); h = (-0.9).^ntime; GF = fft(g); HF = fft(h); x = g + i*h; XF = fft(x);
XFstar = conj(XF);
XFstarmod = [XFstar(1) fliplr(XFstar(2:N))]; GF2 = 0.5*(XF + XFstarmod); HF2 = -i*0.5*(XF - XFstarmod); abs(max(GF-GF2)) abs(max(HF-HF2)) figure(1);clf;
subplot(2,2,1);grid;
plot(nn,real(GF));grid;
title('Two N-point DFT''s'); xlabel('Frequency index k'); ylabel('Re\\{G[k]\\}'); subplot(2,2,2);
plot(nn,imag(GF));grid;
title('Two N-point DFT''s'); xlabel('Frequency index k'); ylabel('Im\\{G[k]\\}'); subplot(2,2,3);grid;
plot(nn,real(GF2));grid;
title('Single N-point DFT'); xlabel('Frequency index k'); ylabel('Re\\{G[k]\\}'); subplot(2,2,4);
plot(nn,imag(GF2));grid;
title('Single N-point DFT'); xlabel('Frequency index k'); ylabel('Im\\{G[k]\\}'); figure(2);clf;
subplot(2,2,1);grid; plot(nn,real(HF));grid;
title('Two N-point DFT''s'); xlabel('Freq index k'); ylabel('Re\\{H[k]\\}'); subplot(2,2,2);
plot(nn,imag(HF));grid;
title('Two N-point DFT''s'); xlabel('Freq index k'); ylabel('Im\\{H[k]\\}'); subplot(2,2,3);grid;
plot(nn,real(HF2));grid;
title('Single N-point DFT'); xlabel('Freq index k'); ylabel('Re\\{H[k]\\}'); subplot(2,2,4);
plot(nn,imag(HF2));grid;
title('Single N-point DFT'); xlabel('Freq index k'); ylabel('Im\\{H[k]\\}');
10Two N-point DFT's2-15x 10Two N-point DFT'sRe{G[k]}0-5-100100200Frequency index kSingle N-point DFT300Im{G[k]}510-10-9100200Frequency index k300101x 10Single N-point DFTRe{G[k]}0-5-100100200Frequency index k300Im{G[k]}50.50-0.5-10100200Frequency index k300
86x 10Two N-point DFT's46x 10Two N-point DFT'sRe{H[k]}42006Im{H[k]}100200Freq index k300620-2-406100200Freq index k3008x 10Single N-point DFT4x 10Single N-point DFTRe{H[k]}4200100200Freq index k300Im{H[k]}620-2-40100200Freq index k300
Q3.26 在函数circshift中,命令rem的作用是什么? 答:rem(x,y)是用y对x求余数函数。
Q3.27 解释函数circshift怎样实现圆周移位运算。
答:在输入序列x由M的位置开始被循环移位。如果M> 0,则circshift删除从矢量x最左边开始的M个元素和它们附加在右侧的剩余元素,以获得循环移位序列。如果如果M<0,则circshift首先通过x的长度来弥补M,即序列x最右
边的长度的M样品从x中删除和所附在其余的M个样本的右侧,以获得循环移位序列。
Q3.28 在函数circshift中,运算符~=的作用是什么? 答:~=是不等于的意思。
Q3.29 解释函数circonv怎样实现圆周卷积运算。 答:输入是两个长度都为L的向量x1和x2,它是非常有用的定期延长X2的函数。让x2p成为x2延长无限长的周期的序列。从概念上讲,在定点时间上通过时序交换后的x2p的长度L交换x2p序列和x2tr等于1的元素。然后元素1至L的输出向量y是通过取x1和获得的长度为L的sh矢量之间的内积得到通过循环右移的时间反转向量x2tr。对于输出样本Y[n]的1≤N≤L时,右循环移位的量为n-1个位置上。
Q3.36 运行程序P3.9并验证离散傅里叶变换的圆周卷积性质。 g1=[1 2 3 4 5 6];g2=[1 -2 3 3 -2 1]; ycir=circonv(g1,g2);
disp('圆周卷积的结果=');disp(ycir) G1=fft(g1);G2=fft(g2); yc=real(ifft(G1.*G2));
disp('离散傅里叶变换乘积的离散傅里叶逆变换的结果=');disp(yc) function y=circonv(x1,x2) L1=length(x1);L2=length(x2);
if L1~=L2,error('长度不相等的序列'),end y=zeros(1,L1);
x2tr=[x2(1) x2(L2:-1:2)]; for k=1:L1
sh=circshift(x2tr,1-k); h=x1.*sh; y(k)=sum(h); end
圆周卷积的结果=
12 12 12 12 12 12
离散傅里叶变换乘积的离散傅里叶逆变换的结果= 12 28 14 0 16 14
Q3.38 运行程序P3.10并验证线性卷积可通过圆周卷积得到。 Linear convolution via circular convolution = 2 6 10 15 21 15 7 9 5 Direct linear convolution = 2 6 10 15 21 15 7 9 5
使用圆周卷积确实有可能得到线性卷积
Q3.40 编写一个MATLAB程序,对两个序列做离散傅里叶变换,已生成他们的线性卷积。用此程序验证Q3.38和Q3.39的结果 编写的MATLAB程序:
g1 = [1 2 3 4 5]; g2 = [2 2 0 1 1];
g1e = [g1 zeros(1,length(g2)-1)]; g2e = [g2 zeros(1,length(g1)-1)]; G1EF = fft(g1e); G2EF = fft(g2e);
ylin = real(ifft(G1EF.*G2EF));
disp('Linear convolution via DFT = '); disp(ylin);
Linear convolution via DFT =
2.0000 6.0000 10.0000 15.0000 21.0000 15.0000 7.0000 9.0000 5.0000
Q3.46 使用程序P3.1在单位圆上求下面的z变换:
2?5z?1?9z?2?5z?3?3z?4 G(z)= ?1?2?3?45?45z?2z?z?z
使用函数zplane可以很容易地得到有理Z变换G(z)的极零点图,该函数有两种形式,若Z变换用式(3.32)所示的有理函数的形式给出,使用的命令是zplane(num,den), 其中num和den是按z^-1的升幂排列的G(z)的分子和分母多项式系数的行向量,另外,若给出G(z)的零点和极点,将用到的命令是zplane(zeros,poles),其中zeros和poles都是列向量,在由matlab产生的极零点图中,几点的位置用符号x表示,而零点的位置符号用o表示。
得到结果如图: