自动化本科毕业设计记录

课题题目:基于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) = wT(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
%% [25]覃景繁,欧阳景正. 一种新的变步长LMS自适应滤波算法[J]. 数据采集与处理,1997,12(3):171-174.
clear; clc; close all;

%% 参数设置
L = 2; % 滤波器阶数
true_coef1 = [0.8; 0.5];% 初始真实系数
true_coef2 = [0.4; 0.2];% 500点后系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数
alpha = 0.5; % Sigmoid参数
beta = 0.8; % 步长缩放因子
noise_var = 0.04; % 噪声方差

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成信号
x = randn(N,1); % 方差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

% LMS算法执行
for n = L:N-1
% 当前输入向量
x_vec = x(n:-1:n-L+1);

% 滤波器输出
y = w' * x_vec;

% 误差计算
e(n) = d(n) - y;

% Sigmoid变步长计算
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
%%[26]高鹰,谢胜利. 一种变步长LMS自适应滤波算法及分析[J]. 电子学报,2001,29(8):1094-1097.
clear; clc; close all;

%% 参数设置
L = 2; % 滤波器阶数
true_coef1 = [0.8; 0.5];% 初始真实系数
true_coef2 = [0.4; 0.2];% 500点后系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数
alpha = 300; % Sigmoid参数
beta = 0.2; % 步长缩放因子
noise_var = 0.04; % 噪声方差

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成信号
x = randn(N,1); % 方差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

% LMS算法执行
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) + qe2(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
%%[27]胡异丁,王凤森,杨敏,等. 一种改进变步长LMS自适应滤波算法[J]. 计算机仿真,2020,37(7):291-295.
clear; clc; close all;

%% 参数设置
L = 2; % 滤波器阶数
true_coef1 = [0.8; 0.5];% 初始真实系数
true_coef2 = [0.4; 0.2];% 500点后系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数
eta = 100; % 参数η
m = 0.5; % 参数m
p = 0.95; % 参数p
q = 0.02; % 参数q
noise_var = 0.04; % 噪声方差

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成信号
x = randn(N,1); % 方差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

% LMS算法执行
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
%%[28]罗小东,贾振红,王强. 一种新的变步长LMS自适应滤波算法[J]. 电子学报,2006,34(6):1123-1126.
clear; clc; close all;

%% 参数设置
L = 2; % 滤波器阶数
true_coef1 = [0.8; 0.5];% 初始真实系数
true_coef2 = [0.4; 0.2];% 500点后系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数
alpha = 3000; % Sigmoid参数
beta = 0.2; % 步长缩放因子
noise_var = 0.04; % 噪声方差

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成信号
x = randn(N,1); % 方差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

% LMS算法执行
for n = L:N-1
% 当前输入向量
x_vec = x(n:-1:n-L+1);

% 滤波器输出
y = w' * x_vec;

% 误差计算
e(n) = d(n) - y;

% Sigmoid变步长计算
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
%% [29]陈泳,田金鹏,刘燕平. 一种新的变步长LMS自适应滤波算法[J]. 电子测量技术,2015,38(4):27-31.

clear; clc; close all;

%% 参数设置
L = 2; % 滤波器阶数
true_coef1 = [0.8; 0.5];% 初始真实系数
true_coef2 = [0.4; 0.2];% 500点后切换的真实系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数

% 新的变步长参数
alpha = 3.5; % Sigmoid相关系数
beta = 0.028; % 步长缩放因子
gamma = 2; % 指数参数
h = 2; % 常数参数

noise_var = 0.04; % 噪声方差

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成测试信号
x = randn(N,1); % 高斯白噪声,方差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
% 系统切换检测:前500点采用true_coef1,之后使用true_coef2
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

% LMS算法执行
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
% 第一点时无e(n-1),只使用e(n)
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
%% [30]仝喜峰,陈卫松,钱隆彦,等. 一种非线性变步长LMS自适应滤波算法[J]. 无线电通信技术,2019,45(4):391-396.

clear; clc; close all;

%% 参数设置
L = 2; % 滤波器阶数
true_coef1 = [0.8; 0.5];% 初始真实系数
true_coef2 = [0.4; 0.2];% 500点后系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数

% 更新后的变步长参数
alpha = 3; % 用于新公式的参数
beta = 0.5; % 步长缩放因子

noise_var = 0.04; % 噪声方差

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成信号
x = randn(N,1); % 方差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
% 系统切换检测(前500点使用true_coef1,之后使用true_coef2)
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

% LMS算法执行
for n = L:N-1
% 当前输入向量
x_vec = x(n:-1:n-L+1);

% 滤波器输出
y = w' * x_vec;

% 误差计算
e(n) = d(n) - y;

% 使用新的变步长公式:
% mu(n) = β * [ 1/4 - exp(-α|e(n)|) / (1 + exp(-α|e(n)|))^2 ]
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) = βmax − (βmax − βmin)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];% 500点后系数
N = 1000; % 采样点数
trials = 200; % 独立实验次数
noise_var = 0.04; % 噪声方差

% 新增:动态调整相关参数常数
alpha0 = 1.5; % alpha(n)的最大基准值
beta_min = 0.1; % beta(n)下限
beta_max = 0.8; % beta(n)上限
gamma = 2; % alpha(n)指数调节因子
eta = 10; % beta(n)指数调节因子

%% 预分配存储空间
mu_avg = zeros(N,1); % 平均步长
e_avg = zeros(N,1); % 平均误差

%% 主循环(200次独立实验)
for trial = 1:trials
% 生成信号
x = randn(N,1); % 方差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

% 改进的变步长LMS算法
for n = L:N-1
x_vec = x(n:-1:n-L+1);
y = w' * x_vec;
e(n) = d(n) - y;

% 动态调节alphabeta
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;

自动化本科毕业设计记录
https://striver98.github.io/2025/02/17/自动化本科毕业设计记录/
作者
Wang Zhixuan
发布于
2025217
许可协议