Matlab重叠保留法、重叠保留法--程序文档格式.docx
《Matlab重叠保留法、重叠保留法--程序文档格式.docx》由会员分享,可在线阅读,更多相关《Matlab重叠保留法、重叠保留法--程序文档格式.docx(3页珍藏版)》请在冰豆网上搜索。
functiony=overlap_add(x,h,M,choice)
%x为较长的输入序列,h为较短的系统函数,M为分段大小
%choice为'
add'
或'
save'
选择重叠相加法或重叠保留法
%---------前期处理-------------------
N=length(h);
%序列h(n)的长度
Lx=length(x);
%序列x(n)的长度
ifN>
M%算法要求N<
=M
M=N+1;
end
L=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=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个点
end
y=y(1:
Lx+N-1);
%最终输出序列
%%重叠保留法实现长短序列的线性卷积
functiony=overlap_save(x,h,M)
fori=0:
T;
x_seg=[t,x(xi:
xi+M-1)];
%低点数计算时的分段x(n)
t=x_seg(M+1:
M+N-1);
%缓存序列更新
%线性卷积
xi+M-1)=y_seg(N:
%每卷积一段输出M个点
end
%%利用FFT循环卷积计算线性卷积的函数
functiony=lin_conv(x1,x2,L)
%利用FFT循环卷积计算线性卷积
y1=fft(x1,L);
y2=fft(x2,L);
Yk=y1.*y2;
y=ifft(Yk);