北邮Matlab实验报告
- 格式:doc
- 大小:651.16 KB
- 文档页数:11
《数字信号处理》Matlab 实验
信通十三班 黄嘉慧 2012210389
一.实现重叠相加和重叠保留算法,完成线性卷积的分段计算(可任意指定()x n 及()h n );试验报告包括:
1、 对算法的概括性说明;
重叠相加法是将待过滤的信号分割成长为N 的若干段,每一段都可以和有限时宽单位取样响应作卷积,再将过滤后的各段重叠相加。建立缓存序列,每次输入N 点序列,通过 计算x(n)和h(n) 的循环卷积实现线性卷积运算,将缓存的M ‐1 点序列和卷积结果相加,并 输出前N 点作为计算结果,同时缓存后M ‐1 点,如此循环,直至所有分段计算完毕,则输出序列y(n)为最终计算结果。重叠保留法相当于将想xl(n)和h(n)作循环卷积,然后找出循环卷中相当于线性的部分。在这种情况下,将序列 y(n)分为长N 的若干段,每个输入段和前一段有 M ‐1 个重叠点。此时只需要将发生重叠的前 M ‐1 个点舍去,保留重叠的部分并输出,则可获得序列 y(n)。
2、 源代码及流程图;
流程图: 重叠相加法:
否
源代码:function%循环卷积
X1k = fft(x1,L);
X2k = fft(x2,L);
Yk = X1k.*X2k;
y = ifft(Yk);
function [y]=overlaplus(x,h,N)%重叠相加法
lenx=length(x);
M=length(h);
L=N+(M-1);
x=[x,zeros(1,L-1)];
K=floor(lenx/N);
for k=0:K
xk=x(k*N+1:k*N+N);
Y(k+1,:)= circular_conv(xk,h,L);
end
tn=zeros(1,M-1);
for k=0:K
Y(k+1,1:M-1)= Y(k+1,1:M-1)+tn;
tn=Y(k+1,N+1:L);
end
Y=Y(:,2:N+1)';
y=(Y(:))';
结果:
> x=[1 2 3 4 5 6 7];
h=[2 3 4 5 6 72 4 56 ];
y=overlaplus(x,h,10)
y =
7.0000 16.0000 30.0000 50.0000 142.0000 238.0000 374.0000 500.0000 615.0000 718.0000
否
源代码:function y = overlapsave(x,h,N)%重叠保留法
Lx = length(x);
M = length(h);
if N N = M+1; end L = N+M-1; t = zeros(1,M-1); T = ceil(Lx/N); x = [x,zeros(1, (T+1)*N-Lx)]; y = zeros(1, (T+1)*N); for i=0:1:T xi = i*N+1; x_seg = [t,x(xi:xi+N-1)]; t = x_seg(N+1:N+M-1); y_seg = circular_conv(x_seg,h,L); y(xi:xi+N-1)=y_seg(M:N+M-1); end 结果: x=[1 2 3 4 5 6 7]; h=[2 3 4 5 6 72 4 56 ]; y=overlaplus(x,h,10) y = 7.0000 16.0000 30.0000 50.0000 142.0000 238.0000 374.0000 500.0000 615.0000 718.0000 3、 结合教材3.5.1节作运算量分析; 若有限长因果序列x(n)和h(n)的长度分别为N 和M ,计算其线性卷积y(n),需MN 次乘法运算,(M ‐1)(N ‐1)次加法运算。如果利用循环卷积方法,按基2 时域抽选法实现L 点FFT 和IFFT 。可以看出:(1)当M 、N 取值较大且相近时,可实现对线性卷积的快速计算;(2)当M 、N 有较大差异时,线性卷积和循环卷积运算量相当,此时若希望降低线性卷积计算开销,需采用重叠相加法或重叠保留法。重叠保留法和相加运行效率与分段长度关性较强。分段数和卷积运算的序列长度为非线性关系,在实际应用中,重叠保留和相加主要用于实施信号处理,在保证实时性的要求下,输入序列的分段不能太长。 4.总结实验过程中出现的问题以及解决问题的具体措施。 利用自定义函数解决代码重复使用的问题,避免多次输入同样代码。构造分段补零不会实现,通过上网查资料后获得实现相关功能的代码 二.周期序列的谱分析 利用DFT 分析模拟信号()()cos 16a x t t π=之频谱;试验要求: 1、 设定采样周期T 并说明原因; 根据奈奎斯特取样条件,fs>=2f=2*8=16Hz ,所以取fs=20Hz ,T=1/f=0.05s 。 2、 若令()cos(16)x n nT π=,确定该序列之周期N 并说明原因; 2*pi/0.8pi=5/2 则N=5 3、 绘制10个周期内()x n 的取值情况; T = 1/20; t = 0:T:5-T; N = 5; figure(1); xn = cos(16*pi*t); stem(0:10*N-1, xn(1:10*N)); title('10 个周期内x(n)的取值情况'); ylabel('x(n)'); xlabel('n'); 4、 令1()x n 表示()x n 的主值序列,绘制1(())DFT x n ,解释取值情况; figure(2); x1n = xn(1:N); stem(0:N-1, x1n); title('x(n)的主值序列'); ylabel('x1(n)'); xlabel('n'); figure(3); Xk = fft(x1n, N); stem(0:N-1, abs(Xk)); title('|DFT(x1(n))|'); ylabel('X1(k)'); xlabel('k');