重叠相加法(卷积)
只适用于卷积算法或者计算原理与卷积一样的,比如分母为1的滤波算法。
MATLAB 实验代码:
clear all;
b=[1,2,3,4,5,4,3,2,1];
a=1;
x=[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0];
lenb=length(b);
N=10; %每段输入x的长度
Lenx = length(x); %系数个数
len_h = lenb - 1; %重叠部分的长度
L = N + len_h; %每段输出y的长度
T = ceil(Lenx / N); %分段数
disp(T);
ovlp = zeros(1,len_h); %重叠部分的初始化
y = zeros(1, T*N + len_h); %输出初始化
for i=0:1:T-1
pos = i*N + 1;
xi = [x(pos:pos+N-1),zeros(1,len_h)]; %由于输出y个数和输入是一样的,所以必须补齐每段输入x的长度
yi = filter(b,a,xi);
yi(1:len_h) = yi(1:len_h) + ovlp; %每段输出y的前叠加长度个数据要加上上一段输出y的重叠部分数据
ovlp = yi(N+1:L);
y(pos:pos+N-1) = yi(1:N); %每段输出y只取yi前面的N个点,因为输入只有N个点,相互对应
end
y = y(1:Lenx+len_h)';
C语言代码示例:
int Len_ovlp =98; //假设的重叠部分长度 double Overlap[98] = {0};
double LPF_OUT[100] = {0}; //最后要取得的输出值的初始化,这里假设输入为100个
double xi[198] = {0};
double yi[198] = {0};
for(i=0;i
xi[i] = DC[i];
}
yi = filter(b,a,xi);
for(i=0;i
yi[i] = yi[i] + Overlap[i];
Overlap[i] = yi[i+100];
}
for(i=0;i
LPF_OUT[i] = yi[i];
}