《数字信号处理》Matlab实验报告
实验一
班级:2011211114班内序号:27姓名:周园学号:2011210413实验一:实现重叠相加和重叠保留算法,完成线性卷积的分段计算(可任意指定及);1、对算法的概括性说明 对如图1所示的线性非移变离散系统而言,可由线性卷积表示其时域上的输入输出关系,即y(n)=x(n)*h(n)
图1线性非移变离散系统为方便讨论,令图1所示离散系统为FIR滤波器,即h(n)为一有限长的因果序列,长度为M。(1)重叠相加法将输入序列x(n)进行分割,每段长度为N,且有N≥M,如图2所示。每一段都可以和有限时宽单位取样响应作卷积,再将过滤后的各段重叠相加。具体算法实现原理如图3所示,建立缓存序列,每次输入N点序列,通过计算x(n)和h(n) 的循环卷积实现线性卷积运算,将缓存的M-1点序列和卷积结果相加,并输出前N点作为计算结果,同时缓存后M-1点,如此循环,直至所有分段计算完毕,则输出序列y(n)为最终计算结果。
图2序列x(n)的连续分段
图3 重叠相加算法(2)重叠保留法与重叠相加法有所不同,重叠保留法是通过对输出序列y(n)进行分段后导出的一种线性卷积的计算方法。按图4所示的方式对序列y(n)进行分段,每段长度为N。
图4序列y(n)的连续分段每个输入段和前一段有? M ‐ 1 个重叠点。此时只需要将发生重叠的前? M ‐1 个点舍去,保留重叠的部分并输出,则可获得序列? y(n) 。算法如图5所示。
图5 重叠保留法2、流程图及源代码(1)源代码
function [ y ] = circular_conv( x1, x2, L ) % 利用循环卷积计算线性卷积
X1k = fft(x1,L); %x1 做L 点FFT X2k = fft(x2,L); %x1 做L 点FFT Yk = X1k.*X2k; %频域相乘 y = ifft(Yk); %FFT 反变换得循环卷积结果 end
function [ y ] = overlap_add( x, h, N ) %重叠相加法实现
M = length(h); %获得h(n)的长度 if N < M % 为N 选择合适的值保证运算正确 N = M+1; end L = M+N-1; %循环卷积与线性卷积结果相同时需要进行运算的最少点数Lx = length(x); %获得x(n)的长度 T = ceil(Lx/N); %确定分段数T t = zeros(1,M-1); %初始化序列t(n) x = [x,zeros(1, (T+1)*N-Lx)]; %不足的分段补零 y = zeros(1, (T+1)*N); %生成输出序列y(n), 长度足够长 for i = 0:1:T xi = i*N+1; x_seg = x(xi:xi+N-1); % 选择低点数计算时的分段x(n) y_seg = circular_conv(x_seg, h, L); %调用循环卷积计算线性卷积 y_seg(1:M-1) = y_seg(1:M-1)+t(1:M-1);% 完成重叠相加 t(1:M-1) = y_seg(N+1:L); % 重新对t(n)赋值为保留的后M-1 点 y(xi:xi+N-1) = y_seg(1:N); % 直接输出前N 个点 end y=y(1:Lx+M-1); %取出最终的输出序列 end
function [ y ] = overlap_save( x, h, N ) %重叠保留法实现 Lx = length(x); %获得x(n)的长度 M = length(h); %获得h(n)的长度 if N < M % 为N 选择合适的值保证运算正确 N = M+1; end L = N+M-1; %为降低点数,取M+N-1 点循环卷积即可 t = zeros(1,M-1); %初始化序列t(n) 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)]; %确定每个低点数卷积的分段x(n) t = x_seg(N+1:N+M-1); % 为t(n)重新赋值为后M-1 个点的值 y_seg = circular_conv(x_seg,h,L); % 循环卷积计算线性卷积 y(xi: