大三课设的选题是2017年电子设计大赛国赛的E题:自适应滤波器,其中比较关键的数据处理部分使用了LMS算法。总体的方案参考了这套方案,可以百度搜得到。时隔一年,现在对算法部分做一个总结。因为没有大数据处理和信号处理的基础,以下都是个人查找文献和书籍做的一些笔记。具体C语言算法的实现参考以下几篇博客:
正弦干扰的自适应噪声消除
传统方法:使用调整干扰频率的固定陷波器(带通、带阻滤波器),这要求我们必须知道干扰的精确频率,所要求的带通频率非常陡峭。
基本输入:由携带信息的信号和互不干扰的正弦干扰组成;
参考输入:相关形式的正弦干扰;
自适应滤波器:采用基于LMS算法进行抽头权值自适应的FIR滤波器,使用参考输入,对包含在基本输入端的正弦信号进行估计,从基本输入中减去自适应滤波器输出。
重要特征:
- 消除器像自适应陷波器一样工作,其零值点由正弦干扰的角频率$\omega_0$决定。消除器是可调的,其调陷频率随$\omega_0$而变。
- 通过选择足够小的$\mu$,可使得消除器频率响应的陷波在正弦干扰处很陡峭。
假设 输入数据是实数,则
对于基本输入
$s(n)$:承载信息的信号
$A_0$:正弦干扰的幅度
$\omega_0$:归一化角频率
$\phi_0$:相位
参考输入
使用实数的LMS算法,则抽头权的更新基于如下:
$M$:FIR滤波器的长度
$\mu$:步长因子常数
假设LMS算法中输入数据和其他信号的抽样周期取为单位时间,用正弦激励作为感兴趣的输入,重建自适应滤波器框图。
可将正弦输入$u(n)$、FIR滤波器和LMS算法的权值更新方程组合为一个单一(开环)的系统。
输入为$e(n)$、输出为$y(n)$的自适应系统随时间变化。
由于$z=e^{j\omega}$和$z_0=e^{j\omega_0}$,如令自适应系统的激励为$e(n)=z^n$,则输出$y(n)$包含三个分量:其一正比于$z^n$,其二正比于$z^n(z_0^{2n})^*$,其三正比于$z^n(z_0^{2n})$。
第一个分量代表转移函数为$G(z)$的时变系统。
其中$\phi_i=\phi-\omega_0i$。
输入$u(n-i)$与估计误差$e(n)$相乘,对$u(n-i)e(n)$做$z$变换并用$z[·]$表示。
$E(ze^{-j\omega_0})$是围绕单位圆逆时针旋转$\omega_0$角度后$e(n)$的$z$变换;
$E(ze^{j\omega_0})$是围绕单位圆顺时针旋转$\omega_0$后的变换。
对$\omega_i(n+1)=\omega_i(n)+\mu u(n-i)e(n)$进行$z$变换
$\omega_i(z)$是$\omega_i(n)$的$z$变换。
$z$变换得