算法代码如下
clc
clear all
close all
[x1,fs1]=audioread('handel.wav');
[d1,fs2]=audioread('handel_echo.wav');
x=x1';
d=d1';
p=25; % 重用次数
n=20; % 滤波器阶数
z=max(size(x));
wA=zeros(1,n)'; % 滤波器权系数初始化
size(wA);
Y=zeros(1,z)';
h=waitbar(0,'计算进度');
steps = (z-p+1);
for k=p+n-1:z
% 输入向量矩阵
for i=1:n
for j=1:p
Xnp(i,j)=x(k-p-n+i+j);
end
end
Y(k-p+1:k)=Xnp'*wA; % n时刻,前p个输出组成的输出参考向量
D=d(k-p+1:k)'; % n时刻,前p个期望输出信号组成参考向量
E=D-Y(k-p+1:k); % 后验误差,在让E=0(实际上应该是尽量小?)的前提下让wA(n+1)尽量接近wA(n)
W(:,k)=wA;
% 得到递推公式如下,加入收敛步长m(0-2之间),折中收敛速度与稳定性的矛盾,通过效果图可以看出,APA的收敛速度非常慢
m=0.0001;
wA=wA+m*Xnp*pinv(Xnp'*Xnp)*E; % 更新滤波器权系数
waitbar(k/steps);
end
close(h);
figure
plot(W(1,:))
legend('W(1,:)学习曲线')
figure
subplot(3,1,1);
plot(x);
title('原始语音信号');
hold on;
subplot(3,1,2);
plot(d);
title('被噪声污染的目标信号');
hold on;
subplot(3,1,3)
plot(Y);
title('合成回声输出信号');
matlab仿真效果如下(20000点左右实现了收敛)