分享一个最近自己实现的变步长LMS自适应滤波的matlab程序,先来一个自适应FIR的原理图吧,方便以后复习:3
自适应噪声抵消器(ANC):
y 以最小均方误差逼近 n0 时,z = d - y 也以最小均方误差逼近有用信号 s 。
emmm……这里放了五种自适应滤波方法,具体方法研究大家自行找论文出处研究吧hhh就不在这里一一贴链接啦。
1:定步长LMS算法
2:归一化最小均方误差(NLMS)算法
3:基于箕舌线函数的变步长LMS算法
4:以及基于相关特性的改进箕舌线变步长LMS算法。
(1)变步长公式:
(2)更新权系数公式:
代码如下:
%% ===============================
% 变步长LMS算法----自适应滤波
close all;clear;clc;
M=20; %%滤波器阶次
%% 噪声信号产生器
N=1000; %%信号长度和迭代次数控制
t=0:N-1;
snr = 1;
noise = 0.1*rand(1,N);
noise_pri = sqrt(10^(snr/10))*noise;
noise_ref = 1*(2*rand(1,N)-1);
%% 产生正弦信号
r = 10; % 延迟
Fs=N; %% 采样频率
fb=24/Fs; %% 信号频率1
fr=28/Fs; %% 信号频率2 干扰信号频率
s = cos(2*pi*fb*t);
p = cos(2*pi*fr*t);
n = noise_pri;
a1 = 1;
a2 = 6;
a3 = 0.5;
b1 = 0;
b2 = 6;
b3 = 0.5;
input_ref = b1*s + b2*p + b3*n ; %% 滤波器输入信号
d_pri = a1*s + a2*p + a3*n; %理想输出
% d_pri = input_ref(r:N); % 可以采用延迟做输入
x = input_ref;
figure(1);
subplot(3,1,1);plot(s);grid on;title(' 有用信号 s(n) ');
subplot(3,1,2);plot(d_pri);grid on;title(' 主输入 d(n) ');
subplot(3,1,3);plot(input_ref);grid on;title(' 参考输入 x(n)');
%% 自适应滤波
g = 100;
tz = (eig(input_ref'*input_ref))';
rho_max = max(eig(input_ref'*input_ref)); % 输入信号相关矩阵的最大特征值
mu_max = 2/rho_max; % 收敛范围极限值
for type = 1:5
for q = 1:g
% noise = 0.1*rand(1,N); % 每次加入