归一化最小均方 - C实现

时间:2014-01-29 10:58:33

标签: c matlab math signal-processing

我正在寻找在C中实现归一化最小均方(NLMS)。我的问题在于权重更新(我认为)因为我在标准MATLAB库中运行它。这是MATLAB代码(可行):

function [e,w,y]=nlmsFunc(mu,M,u,d,a);
% Normalized LMS
% Call:
% [e,w]=nlms(mu,M,u,d,a);
%
% Input arguments:
% mu = step size, dim 1x1
% M = filter length, dim 1x1
% u = input signal, dim Nx1
% d = desired signal, dim Nx1
% a = constant, dim 1x1
%
% Output arguments:
% e = estimation error, dim Nx1
% w = final filter coefficients, dim Mx1
%intial value 0

w=zeros(M,1); %This is a vertical column

%input signal length
N=length(u);
%make sure that u and d are colon vectors
u=u(:);
d=d(:);
%NLMS
for n=M:N %Start at M (Filter Length) and Loop to N (Length of Sample)
uvec=u(n:-1:n-M+1); %Array, start at n, decrement to n-m+1
e(n)=d(n)-w'*uvec;
w=w+mu/(a+uvec'*uvec)*uvec*conj(e(n));
y(n) = w'*uvec; %In ALE, this will be the narrowband noise.
end

我的问题是把它翻译成C,这就是我到目前为止所做的:

float mu = 0.05; //Set up mu
    int a = 1; //Constant

    int inputSigSize = numSamples;
    float outputYSignal[inputSigSize];
    float desiredSignal[inputSigSize];
    float error[inputSigSize];


    float inputSignal[inputSigSize];

    //Initialise Weights to Zero
    if (weights[0] == 0) {

        for (int k = 0; k<=filterLength; k++) {
            weights[k]=0;
        }
    }

    float X[filterLength+1];
    float Y = 0;
    float E = 0;

    //Start NLMS Loop
    for (int t = 0; t<numSamples; t++) {

        X[0] = inputSignal[t];

        for (int i = 0; i<=filterLength; i++) {
            Y += (weights[i]*X[i]);
        }

        E = desiredSignal[t] - Y;

        for (int i = filterLength; i>=0; i--) {
            weights[i] = weights[i] + (mu*E*X[i]);

            if (i!=0) {
                X[i]=X[i-1];
            }
        }

        outputYSignal[t] = Y;
        error[t] = E;
    }
    //END NLMS Loop

我感觉这是我处理体重更新的方式。

1 个答案:

答案 0 :(得分:0)

您似乎已经忘记了输入方差对mu的归一化。

另请注意,您的过滤技术与参考代码不匹配:系数权重[j]应乘以输入样本X [FilterLength - j]。输入数组在uvec中反转(保持抽头(不是我们期望的抽头+ 1)样本。)

在原始代码中,如果方差为0(FilterLength + 1次点击的常量输入),它们似乎会添加一个小常量,但我认为只需检查之前的方差,就可以得到更准确的结果。 / p>

避免移动这样的数据:for循环中的X [i] = X [i-1]。