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

📄 rls0.m

📁 一种改进的RLS算法
💻 M
字号:
function [input_signal, error_signal, desired_signal, filter_output, impulse, filter_prev, cost, mse, db,db_avg, fc0, fc1,fc2, fc3,fc4]=RLS(filter_size, lambda, input_file, iterations)
% Function to perform the RLS algorithm on an input file.
% Inputs:   Filter order, lambda (forgetting factor), 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, cost, mean sqaure error, attenuation (dB), average attenuation.

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

% Generate desired signal by creating impulse and convolving
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 varaibles
filter_prev = zeros(filter_size,1);
input_vector = zeros(filter_size, 1);
psi_inv_prev = eye(filter_size);
intermediate= zeros(filter_size, 1);
gain = zeros(filter_size, 1);

% Perform RLS algorithm for set number of iterations.
for i=1:iterations
    i
    input_vector(1)=input_signal(i);
    intermediate = psi_inv_prev*input_vector;
    gain = (1/(lambda+dot(input_vector, intermediate)))*intermediate;
    filter_output(i)=dot(filter_prev, input_vector);
    error= desired_signal(i)-filter_output(i)
    filter_prev = filter_prev + gain*error;
    psi_inv_prev = (1/lambda)*(psi_inv_prev - gain*((input_vector')*psi_inv_prev));
    % Shift along input vector
    for j=filter_size:-1:2
        input_vector(j)=input_vector(j-1);    
    end
    error_signal(i)=error;
    cost(i)=error*error;
    if (i==1)
        fc0=filter_prev;
    end
    if (i==2500)
        fc1=filter_prev;
    end
    if (i==5000)
        fc2=filter_prev;
    end
    if (i==7500)
        fc3=filter_prev;
    end
    if (i==10000)
        fc4=filter_prev;
    end
   
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 + -