⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vsnlms.m

📁 刚写完的VSNLMS程序
💻 M
字号:
function [input_signal, error_signal, desired_signal, filter_output, impulse, filter_current, mse, db, db_avg]=VSNLMS(filter_size, p, ss_lower, input_file, iterations)
% Function to perform the VSNLMS algorithm on an input file.
% Inputs:   Filter order, step size, stepsize upper bound, stepsize lower bound, input wav file, number of iterations.
% Outputs:  Input signal, error estimation signal (echo cancelled), desired signal (echoed signal), adaptive filter output, real impulse response
%           Estimation of impulse response, mean sqaure error, attenuation (dB), average attenuation.

% read in input wav file.
input_signal = wavread(input_file);

% generate impulse response and convolve to get echoed signal
impulse=zeros(filter_size,1);
for (i=1:5)
    impulse(((i-1)*filter_size/5)+1)=1/i;    
end
desired_signal = conv(input_signal, impulse);

% initialise variables
filter_current = zeros(filter_size,1);
input_vector = zeros(filter_size, 1);
stepsize_curr = zeros(filter_size, 1);
stepsize_prev = zeros(filter_size, 1);
gradient_curr = zeros(filter_size, 1);
gradient_prev = zeros(filter_size,1);

% perform VSNLMS algorithm for set number of iterations
for i=1:iterations
    i
    % get input sample
    input_vector(1)=input_signal(i);
    filter_output(i)=dot(filter_current, input_vector);
    error= desired_signal(i)-filter_output(i)
    gradient_curr=error*input_vector;
    % calcualte variable upper limit
    ss_upper = 1/(2*(dot(input_vector,input_vector)));
    % update stepsize vector
    stepsize_curr = stepsize_prev + p*gradient_curr.*gradient_prev;
    
    % Maintain step_size vector between upper and lower limits.
    for j=1:filter_size
        if stepsize_curr(j) > ss_upper;
            stepsize_curr(j) = ss_upper;
        end
        if stepsize_curr(j) < ss_lower
            stepsize_curr(j) = ss_lower;
        end            
    end
    % update filter tap weights 
    filter_current = filter_current + 2*diag(stepsize_curr)*gradient_curr;
    
    % shift values in input vector along ready for next iteration
    for j=filter_size:-1:2
        input_vector(j)=input_vector(j-1);    
    end
    
    %store values of error and cost function.
    error_signal(i)=error;
    cost(i)=error*error;
    
    %update variable vectors for next iteration
    gradient_prev=gradient_curr;
    stepsize_curr=stepsize_prev;
end

% Find moving average of error squared.
for i=1:iterations-100
    mse(i)=mean(cost(i:i+100));
    i
end

%find moving avarage of db attenuation (averaged to smooth output).
for i=1:iterations-2500
    db(i)=-20*log10(mean(abs(desired_signal(i:i+2500)))'./mean(abs(error_signal(i:i+2500))));
    i
end

%find total avarage db attenuation
db_avg=mean(db);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -