Engee 文档
Notebook

Lms滤波器参数考察:适应步长和滤波器长度对算法收敛性的影响

自适应滤波器是现代数字信号处理的关键工具,在降噪系统、回声消除、系统识别和许多其他领域中寻找应用。 最小二乘算法(Lms)由于其计算效率和易于实现,仍然是最流行的自适应滤波方法之一。

在本文中,我们将对LMS算法的两个关键参数进行系统研究。:

  1. 适应步骤(μ)-确定算法收敛的速度和稳定性
  2. 滤波器长度(L)-影响滤波器模拟系统的能力

使用Engee语言和EngeeDSP包,我们可视化这些参数对滤波器学习过程的影响,这将使我们在配置自适应系统时更好地理解它们的实际意义。

第1部分:适应步骤的影响调查

适配步骤可能是LMS算法最重要的参数。 它定义了:

-收敛率:滤波器达到最佳系数的速度有多快
-精度:过滤器能接近最优解
-Stability:选择的值是否保证算法的稳定运行

理论上,对于保证收敛,μ必须满足条件:
0<μ<2/(λ_max),其中λ_max为输入信号的自相关矩阵的最大特征值。

In [ ]:
using EngeeDSP, DSP, Random
# Инициализация воспроизводимого случайного сигнала
Random.seed!(123)
x = 0.05 * randn(1024) # Входной сигнал (белый шум)
d = filt(FIRFilter([0.5, -0.3, 0.2, 0.1, -0.05]), x) # Желаемый выход
# Создание LMS-фильтра с параметрами по умолчанию
LMS = EngeeDSP.LMSFilter()
# Диапазон исследуемых шагов адаптации
mu = [0.001, 0.01, 0.1, 1, 10, 12]

# Настройка графика с русскими подписями
plt = plot(title="Сходимость LMS-фильтра (длина=32) при различных шагах адаптации",
           xlabel="Номер отсчёта", 
           ylabel="Среднеквадратичная ошибка (сглаженная)",
           yscale=:log10, 
           ylims=(1e-5, 1e0), 
           grid=true, 
           legend=:best)

# Проведение экспериментов для разных μ
for μ in mu
    release!(LMS)
    LMS.StepSize = μ # Установка текущего шага адаптации
    setup!(LMS, x, d)
    @time y, e, w = step!(LMS, x, d)
    # Сглаживание квадрата ошибки для наглядности
    smoothed_error = DSP.filt(ones(500)/500, e.^2)
    plot!(plt, smoothed_error, label="μ=", linewidth=2)
end
display(plt)
  0.007607 seconds (301.17 k allocations: 4.597 MiB)
  0.008170 seconds (301.17 k allocations: 4.597 MiB)
  0.031941 seconds (301.19 k allocations: 4.597 MiB, 76.03% gc time)
  0.006401 seconds (301.17 k allocations: 4.597 MiB)
  0.006935 seconds (301.17 k allocations: 4.597 MiB)
  0.009097 seconds (301.17 k allocations: 4.597 MiB)

我们在图表上看到几个特征模式。:

  1. 极小µ(0.001):收敛速度极慢
  2. 最佳范围(0.01-0.1):速度和精度的平衡
  3. 大µ(1-10):快速收敛,但噪声电平增加
  4. 非常大的μ(50):算法的发散

实际的结论是,μ的选择需要在适应速度和精度之间进行折衷。 在许多应用中,0.01-0.1阶的值通常被证明是最佳的。

第2部分:滤波器长度影响的研究

滤波器L的长度确定:

-模型复杂度:有多少系数可用于近似系统
-计算负载:与L成比例增加
-学习能力:太短的过滤器将无法准确地对系统建模

L的选择应根据:

  1. 模拟系统的预期顺序
  2. 可用的计算资源
  3. 所需的建模精度
In [ ]:
using Statistics
Random.seed!(123)
n_samples = 15000
x = 0.1 * randn(n_samples)
# Создаем желаемый отклик
d = filt(FIRFilter([0.4, -0.35, 0.3, -0.25, 0.2, -0.15, 0.1, -0.05, 0.03, -0.01]), 
         [zeros(15); x])[1:n_samples]
# Инициализация фильтра
LMS = EngeeDSP.LMSFilter()
μ_values = [0.005, 0.01, 0.02]
filter_lengths = [8, 16, 32, 64, 128]

# Настройка графиков с ограничением по X
plt = plot(title="Сравнение сходимости LMS-фильтра (отсчёты 180+)",
           xlabel="Номер отсчёта (начиная с 180)", 
           ylabel="Среднеквадратичная ошибка (логарифмическая шкала)",
           yscale=:log10,
           grid=true, 
           legend=:topright,
           size=(1000, 600),
           minorgrid=true,
           xlims=(180, n_samples))  # Устанавливаем границы по X

# Эксперимент для каждой длины фильтра
for (i, L) in enumerate(filter_lengths)
    release!(LMS)
    LMS.FilterLength = L
    LMS.StepSize = μ_values[2]
    
    setup!(LMS, x, d)
    y, e, w = step!(LMS, x, d)
    
    window_size = max(50, div(10000, L))
    smoothed_error = DSP.filt(ones(window_size)/window_size, e.^2)
    final_error = mean(e[end-div(n_samples,5):end].^2)
    
    # Создаем диапазон отсчётов для отображения
    display_range = 180:n_samples
    plot!(plt, display_range, smoothed_error[display_range], 
          label="L=$L (финал: $(round(final_error, sigdigits=3)))",
          linewidth=2.5,
          color=i)
end
display(plt)

图表显示:

  1. 短滤波器(L=8):由于参数数量有限,精度不足
  2. 中等长度(16-32):精度和复杂性之间的良好平衡
  3. 长滤波器(64-128):精度略有提高,计算量显着增加

一个重要的观察结果:对于该系统(FIR滤波器阶数=5),增加L超过某个极限(≈32)不会给出显着的增益,这与理论预期相对应。

结论

总结一下,让我们考虑几点,让我们从参数的关系开始,依赖****on L:适应步骤的最佳值通常与滤波器的长度成反比。 a计算****复杂度:与LMS的O(L)成比例(与RLS的O(L2)相反)。 所进行的研究清楚地表明了选择LMS算法的正确参数的重要性。 使用Engee和专门的软件包使有效地进行此类研究成为可能,因为:

-数学运算的简单语法
-高性能
-强大的可视化工具

所获得的结果对于使用自适应滤波的工程师具有实用价值,帮助他们有意识地在现实应用中接近算法的调谐。