仿射投影自适应滤波(APA)算法及matlab实现

算法代码如下

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点左右实现了收敛)


猜你喜欢

转载自blog.csdn.net/ljl86400/article/details/80540886