rls,lms自适应滤波器matlab代码,c语言代码,参数可自行修改,帮助加深算法理解

自适应滤波器这玩意儿就像个智能橡皮擦,能实时擦除信号里的噪声。今天咱们用代码实操LMS和RLS这两个经典算法,手把手教你改参数看效果。准备好你的MATLAB和C编译器,咱们直接上硬货。

先看LMS这个老实人算法,代码简单得就像小学数学题。MATLAB版核心就四行:

function [y, e, w] = lms_filter(x, d, order, mu)
    w = zeros(order,1);
    for n = 1:length(x)-order
        x_win = x(n:n+order-1);
        y(n) = w' * x_win;
        e(n) = d(n) - y(n);
        w = w + mu * e(n) * x_win; % 这步就是灵魂
    end
end

那个mu参数(0.01左右)就像老司机的油门,调大了容易翻车(发散),调小了收敛慢。C语言版更刺激:

void lms_update(float *w, float x[], float error, float mu, int order) {
    for(int i=0; i<order; i++){
        w[i] += mu * error * x[i]; // 指针操作要当心越界
    }
}

注意这里用指针直接操作内存,比MATLAB快了不止一个量级,特别适合嵌入式系统。建议把阶数order从8开始试,感受下收敛速度变化。

rls,lms自适应滤波器matlab代码,c语言代码,参数可自行修改,帮助加深算法理解

轮到RLS这个学霸出场,MATLAB实现需要点矩阵运算功底:

function [y, e, w] = rls_filter(x, d, order, lambda)
    delta = 1e-4;
    P = delta^-1 * eye(order);
    w = zeros(order,1);
    for n = 1:length(x)-order
        x_win = x(n:n+order-1);
        y(n) = w' * x_win;
        e(n) = d(n) - y(n);
        k = (P * x_win) / (lambda + x_win'*P*x_win); % 核心方程
        w = w + k * e(n);
        P = (P - k*x_win'*P)/lambda;
    end
end

lambda(0.99~1)是遗忘因子,控制历史数据的记忆时长。C语言实现时要注意避免矩阵求逆:

void rls_update(float *w, float x[], float error, float *P, float lambda, int order) {
    float denom = 0.0f;
    for(int i=0; i<order; i++){
        for(int j=0; j<order; j++){
            denom += x[i] * P[i*order+j] * x[j];
        }
    }
    denom += lambda;
    
    for(int i=0; i<order; i++){
        float k_num = 0.0f;
        for(int j=0; j<order; j++){
            k_num += P[i*order+j] * x[j];
        }
        w[i] += (k_num / denom) * error; // 手动实现矩阵运算
    }
}

这段代码用了最笨的二维数组存储逆相关矩阵,实际工程中会用Cholesky分解优化。改order参数时注意,RLS的计算量是order的平方级增长,别随便调太大。

跑代码时建议先拿正弦波+白噪声测试,观察误差曲线。LMS的误差是平滑下降,RLS则是断崖式下跌——这就是用内存换速度的典型表现。遇到发散别慌,先把步长或lambda参数砍半试试。滤波器阶数别超过信号周期的1/3,否则容易过拟合。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐