您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > Matlab重叠保留法、重叠保留法--程序
计算一长一短两个序列的线性卷积时,如果直接使用FFT以及IFFT进行快速变换,则需要在较短的序列后面补很多个零,增加了计算量。因此在此种情况下,一般采用重叠相加法和重叠保留法来计算,可以有效减少计算量,具体原理此处不涉及,只提供这两种方法的matlab程序,供参考。overlap_add重叠相加法的程序overlap_save重叠保留法的程序lin_conv用FFT和IFFT快速计算线性卷积的程序,被以上两个程序调用建议:将这三段程序保存成分开的三个.m文件%%重叠相加法,重叠保留法实现长短序列的线性卷积functiony=overlap_add(x,h,M,choice)%x为较长的输入序列,h为较短的系统函数,M为分段大小%choice为'add'或'save',选择重叠相加法或重叠保留法%---------前期处理-------------------N=length(h);%序列h(n)的长度Lx=length(x);%序列x(n)的长度ifNM%算法要求N=MM=N+1;endL=M+N-1;%用每段循环卷积计算线性卷积所需点数T=ceil(Lx/M);%分段数,ceil向上取整t=zeros(1,N-1);%缓存序列初始化x=[x,zeros(1,(T+1)*M-Lx)];%最后一个不足M的分段补零y=zeros(1,(T+1)*M);%生成输出序列y(n)%-------------核心算法--------------------fori=0:Txi=i*M+1;x_seg=x(xi:xi+M-1);%低点数计算时的分段x(n)y_seg=lin_conv(x_seg,h,L);%计算i分段和h的循环线性卷积y_seg(1:N-1)=y_seg(1:N-1)+t(1:N-1);%与前一段卷积的后N-1位重叠相加t(1:N-1)=y_seg(M+1:L);%缓存序列更新y(xi:xi+M-1)=y_seg(1:M);%每卷积一段输出M个点endy=y(1:Lx+N-1);%最终输出序列end%%重叠保留法实现长短序列的线性卷积functiony=overlap_save(x,h,M)%x为较长的输入序列,h为较短的系统函数,M为分段大小%choice为'add'或'save',选择重叠相加法或重叠保留法%---------前期处理-------------------N=length(h);%序列h(n)的长度Lx=length(x);%序列x(n)的长度ifNM%算法要求N=MM=N+1;endL=M+N-1;%用每段循环卷积计算线性卷积所需点数T=ceil(Lx/M);%分段数,ceil向上取整t=zeros(1,N-1);%缓存序列初始化x=[x,zeros(1,(T+1)*M-Lx)];%最后一个不足M的分段补零y=zeros(1,(T+1)*M);%生成输出序列y(n)%-------------核心算法--------------------fori=0:T;xi=i*M+1;x_seg=[t,x(xi:xi+M-1)];%低点数计算时的分段x(n)t=x_seg(M+1:M+N-1);%缓存序列更新y_seg=lin_conv(x_seg,h,L);%线性卷积y(xi:xi+M-1)=y_seg(N:M+N-1);%每卷积一段输出M个点endy=y(1:Lx+N-1);%最终输出序列end%%利用FFT循环卷积计算线性卷积的函数functiony=lin_conv(x1,x2,L)%利用FFT循环卷积计算线性卷积y1=fft(x1,L);y2=fft(x2,L);Yk=y1.*y2;y=ifft(Yk);end
本文标题:Matlab重叠保留法、重叠保留法--程序
链接地址:https://www.777doc.com/doc-1572041 .html