计算一长一短两个序列的线性卷积时,如果直接使用 FFT 以及 IFFT 进行快速变换,则需要在较短的序列后面补很多个零,增加了计算量。因此在此种情况下,一般采用重叠相加法和重叠保留法来计算,可以有效减少计算量,具体原理此处不涉及,只提供这两种方法的matlab程序,供参考。
overlap_add 重叠相加法的程序
overlap_save 重叠保留法的程序
lin_conv 用 FFT 和 IFFT 快速计算线性卷积的程序,被以上两个程序调用
建议:将这三段程序保存成分开的三个 .m 文件
%% 重叠相加法,重叠保留法实现长短序列的线性卷积
function y=overlap_add(x,h,M,choice)
% x为较长的输入序列,h为较短的系统函数,M为分段大小
% choice为'add'或'save',选择重叠相加法或重叠保留法
%---------前期处理-------------------
N=length(h); % 序列h(n)的长度
Lx=length(x); % 序列x(n)的长度
if N>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)
%-------------核心算法--------------------
for i=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) ; % 最终输出序列
end