【技术专辑】基于最小均方算法的自适应增益控制

基于最小均方算法的自适应增益控制

________________________________________

这里有一个很酷的技巧,除非你使用的是你所购买的微处理器,只是分数的一小部分 - 你可能甚至想要计算一下这些微控制器的每个单元的数量。微控制器,但你不能,因为它是如此便宜,甚至不能做分裂。这种划分方法是对最小均方算法的自适应增益控制的介绍,我认为这将揭示迭代过程如何计算所需增益的工作方式。看一下下面的Matlab代码,它将收敛到你想要分割的正确值(不使用除法运算符)。

 

                    DivideBy = 5;

mu = .1;

DivideByFactor = 1;

ref = 1;

num_iter = 20

for n = 1:num_iter

y(n) = DivideBy * DivideByFactor;

y_mag = abs(y(n));

err(n) = ref - y_mag;

DivideByFactor_time(n) = DivideByFactor ;

DivideByFactor = DivideByFactor +mu*err(n);

end

 

而已!在没有除法运算符的情况下划分12行代码。该算法源自自适应或自动增益控制算法(AGC),该算法用于在系统输出处保持一定幅度,而不管系统输入处的幅度如何变化。例如,在音频系统中,如果信号变得太大,AGC可能会降低音量,如果信号变得太小,AGC可能会增加音量。

 

在数字域中,系统图如图1所示。尝试精神上遵循上述算法的每次迭代如何在循环周围移动样本。

 

【技术专辑】基于最小均方算法的自适应增益控制

图1

 

AGC使用最小均方(LMS)算法来更新权重,在此实现中称为DivideByFactor。该算法试图做的是最小化输出(y(n))和我们设置为1的参考之间的误差。参考信号设置为1,一旦算法收敛,DivideBy * DivideByFactor = 1。整本书可以写在LMS算法的主题上,所以我会保持简短。循环的下部分支可写为:

 

【技术专辑】基于最小均方算法的自适应增益控制

 

这条线基本上朝着最小化错误项的数字迈出了一小步:

 

【技术专辑】基于最小均方算法的自适应增益控制

 

从DivideByFactor(我们最初在迭代循环之前设置为1)处取消错误的一步μ。 通过足够的步骤,这完美地收敛到1 / DivideBy,在此过程中将误差项最小化为零。 Mu只在一定范围内稳定,超出了本文的范围,但如果您想进一步研究,我将在下面提供参考。 您可以通过更改代码中的μ参数来测试系统如何使用不同的μ值进行操作。 通过使μ更小,您可以看到需要更多迭代才能收敛到DivideByFactor。 如果你使μ太大,你会看到DivideByFactor发散并不断增加(不好)。 

 

您可以通过包含以下代码来观察DivideByFactor收敛到所需的值,该代码针对每次迭代绘制DivideByFactor_time项:

 

                    plot([1:num_iter], DivideByFactor_time)

hold on

plot([1:num_iter], 1/DivideBy, 'color' , 'r')

axis([0 num_iter -0.05 1])

grid on

  

【技术专辑】基于最小均方算法的自适应增益控制

                

在这个例子中,我将DivideBy设置为10,并针对每次迭代绘制DivideByFactor_time。 我们期望它收敛到0.10(红色虚线),我们看到经过几次迭代后,它很好地收敛到所需的值。 如果我们将μ设置为非常小的原始值的1/10,我们可以看到值需要更长的时间才能收敛到所需的值

 

【技术专辑】基于最小均方算法的自适应增益控制

 

尝试自己将μ改变为大的值并注意会发生什么(您可能需要扩展x轴和y轴以观察其行为)。 同时尝试绘制err(n)对迭代,以观察它收敛到0!

 

就是这样 - 基于自动增益控制的迭代分割算法。如果您没有Matlab,请尝试在Octave  中运行它,这是开源的,几乎与Matlab语言完全相同(减去一些功能)。如果您不想下载Octave,请尝试将上面的代码移植到您喜欢的语言中,并将其包含在下面的评论中,供其他人使用!请注意,如果您没有获得正确的值,您可能需要增加迭代次数!

  • 【技术专辑】基于最小均方算法的自适应增益控制已关闭评论
    A+
发布日期:2019年03月04日  所属分类:参考设计