课题题目:基于 Sigmoid 函数的变步长 LMS 自适应滤波算法改进
课题内容及要求:变步长 LMS 自适应滤波算法因其计算简单 、易于实现等特点在众多领域得到了广泛应用 。 在变步长 LMS 自适应滤波算法中,步长调整模型是影响算法性能的关键因素 。课题通过深入分析步长调整原则及存在问题,研究构建基于 Sigmoid 函数的步长调整模型,并以此为基础设计变步长 LMS 算法,通过实验验证其有效性。
课题时间: 2024 年 12 月 至 2025 年 5 月 具体安排: 2024-2025 (1)学期安排:查阅文献资料,了解课题相关技术研究现状等,完成开题报告并上传。 2024 2025 (2)学期安排: (1)1-4 周 进一步查阅资料,深入学习变步长 LMS 自适应滤波算法的有关知识,初步实现常规算法的仿真实验。 (2)5-7 周 分析变步长 LMS 自适应滤波算法中步长调整原则,针对常规算法中步长调整模型所存在的问题,重点研究基于 Sigmoid 函数的步长调整模型,并设计相应的变步长 LMS 算法, 进行实验分析验证其性能。撰写论文初稿。 (3)8-11 周 进一步完善,完成论文定稿,完成送检查重、评阅,制作 PPT ,并准备答辩。 (4)12-13 周 论文修改完善,完成终稿并提交。
常规算法的仿真
滤波:y (n ) = w T (n )x (n )
输出误差:e (n ) = d (n ) − y (n )
额外误差(EMSE):ξ (n ) = e (n ) − t (n ) (t (n ) 为外部噪声信号)
权系数更新:w (n + 1) = w (n ) + μ (n )e (n )x (n )
步长调正函数:
变步长 LMS 算法的思想:在算法收敛阶段采用大的迭代步长以获得较快的收敛速度,待算法达到稳态后以较小的迭代步长来减小稳态误差。
SVSLMS 算法仿真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.4 ; 0.2 ]; N = 1000 ; trials = 200 ; alpha = 0.5 ; beta = 0.8 ; noise_var = 0.04 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; mu = beta * (1 /(1 + exp (-alpha*abs (e(n)))) - 0.5 ); w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;
G-SVSLMS 算法仿真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.4 ; 0.2 ]; N = 1000 ; trials = 200 ; alpha = 300 ; beta = 0.2 ; noise_var = 0.04 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; mu = beta * (1 -exp (-alpha*(abs (e(n)))^2 )); w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;
G-SVSLMS 算法改进仿真
α (n ) = η |e (n )e (n −1)|m
β (n ) = p β (n − 1) + q e 2 (n )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.4 ; 0.2 ]; N = 1000 ; trials = 200 ; eta = 100 ; m = 0.5 ; p = 0.95 ; q = 0.02 ; noise_var = 0.04 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); beta = zeros (N,1 ); alpha = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; if n > 1 alpha(n) = eta * abs (e(n) * e(n-1 ))^m; else alpha(n) = 0 ; end if n > 1 beta (n) = p * beta (n-1 ) + q * e(n)^2 ; else beta (n) = q * e(n)^2 ; end mu = beta (n) * (1 - exp (-alpha(n) * abs (e(n))^2 )); w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;
SVSLMS 算法改进仿真 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.4 ; 0.2 ]; N = 1000 ; trials = 200 ; alpha = 3000 ; beta = 0.2 ; noise_var = 0.04 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; mu = beta * (1 /(1 + exp (-alpha*(abs (e(n)))^3 )) - 0.5 ); w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;
SVSLMS 算法改进仿真 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.4 ; 0.2 ]; N = 1000 ; trials = 200 ; alpha = 3.5 ; beta = 0.028 ; gamma = 2 ; h = 2 ; noise_var = 0.04 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; if n == L mu = beta * (1 - (h + 2 ) / (h + exp (alpha * abs (e(n))^gamma ))); else mu = beta * (1 - (h + 2 ) / (h + exp (-alpha * abs (e(n-1 ))^gamma ) + exp (alpha * abs (e(n))^gamma ))); end w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;
SVSLMS 算法改进仿真 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.4 ; 0.2 ]; N = 1000 ; trials = 200 ; alpha = 3 ; beta = 0.5 ; noise_var = 0.04 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; mu = beta * ( 1 /4 - exp (-alpha * abs (e(n))) / ( (1 + exp (-alpha * abs (e(n))))^2 ) ); w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;
改进算法
α (n ) = α 0 (1 − e − γ |e (n ) )
β (n ) = β m a x − (β m a x − β m i n )e − η |e (n )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 clear; clc; close all; L = 2 ; true _coef1 = [0.8 ; 0.5 ];true _coef2 = [0.8 ; 0.5 ]; N = 1000 ; trials = 200 ; noise_var = 0.04 ; alpha0 = 1.5 ; beta_min = 0.1 ; beta_max = 0.8 ; gamma = 2 ; eta = 10 ; mu_avg = zeros (N,1 ); e_avg = zeros (N,1 ); for trial = 1 :trials x = randn (N,1 ); v = sqrt (noise_var)*randn (N,1 ); w = zeros (L,1 ); d = zeros (N,1 ); e = zeros (N,1 ); mu_history = zeros (N,1 ); for n = L:N if n < 500 true _coef = true _coef1; else true _coef = true _coef2; end x_vec = x(n:-1 :n-L+1 ); d(n) = true _coef' * x_vec + v(n); end for n = L:N-1 x_vec = x(n:-1 :n-L+1 ); y = w' * x_vec; e(n) = d(n) - y; alpha_n = alpha0 * (1 - exp (-gamma *abs (e(n)))); beta_n = beta_max - (beta_max - beta_min)*exp (-eta*abs (e(n))); mu = beta_n * (1 /(1 + exp (-alpha_n*abs (e(n)))) - 0.5 ); w = w + mu * e(n) * x_vec; mu_history(n) = mu; end mu_avg = mu_avg + mu_history; e_avg = e_avg + abs (e);end mu_avg = mu_avg / trials; e_avg = e_avg / trials;figure ; subplot(2 ,1 ,1 );plot (mu_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('步长均值' ); title('步长变化曲线' ); grid on; subplot(2 ,1 ,2 ); semilogy(e_avg, 'LineWidth' ,1.5 ); xlabel('迭代次数' ); ylabel('|误差|均值' ); title('误差收敛曲线' ); grid on;