
В среде MATLABимеется ряд
демонстраций, связанных с адаптивными
фильтрами. Среди них
- rlsdemo.mdl . Эта демонстрация создана
в среде пакетаSignal
Processing Blocksetи
иллюстрирует использование рекурсивного
алгоритма наименьших квадратов (RLS)
для компенсации шума во входном сигнале.
Структурная схема: базовым элементом
здесь является блок RLS Filter с его входами
и параметрами. На входInputфункции подается основной (reference)
сигнал, на вход желаемого сигналаDesired- смесь сигнала с
шумом. Адаптивный фильтр с алгоритмом
РНК на основе подстройки коэффициентов
фильтра формирует выходной сигнал,
компенсирующий шум в полезном сигнале.
Демонстрация matlab алгоритма рмнк: rlsdemo.Mdl
Пример установки параметров блока RLS
Filter (открытие - двойной clickпо блоку).
Приложение 1
%%
Адаптивное подавление шума с помощью
функции adaptfilt.rls
%
Для компенсации шума в гармоническом
сигнале
%
используется стандартный метод РНК
%
Формирование и вывод графика гармонического
сигнала signal
= sin(2*pi*0.055*(0:500-1)'); subplot(411) plot(0:length(signal)-1,signal); grid;
title('Полезный
гармонический сигнал');
%
Формирование и вывод графика шума
nvar
= 1.5; %
Дисперсия шума
noise
= randn(500,1)*nvar; %
Генерирование белого шума subplot(412) plot(0:499,noise);
legend('Шум');
grid;
%
Формирование шума с помощью КИХ - фильтра
nfilt
= fir1(31,0.5); %
Получение фильтра 31-го порядка
fnoise
= filter(nfilt,1,noise); %
Фильтрация белого шума
d
= signal+fnoise; %
Получение "желаемого" сигнала:
сигнал + шум subplot(413) plot(0:length(d)-1,d);
grid;
legend('Желаемый
вход: сигнал + шум ');
%
Инициализация параметров адаптивного
РНК- фильтра
M
=32; %
Число коэффициентов фильтра
lam
= 0.98; %
Коэффициент забывания
delta
= 0.1; %
Константа инициализации
w0
= zeros(M,1); %
Нулевой начальный вектор коэффициентов
P0
= (1/delta)*eye(M,M); %
Инициализация обратной АКФ матрицы
Zi
= zeros(M-1,1); %
Нулевое начальное состояние фильтра
%
Конструирование адаптивного РНК -
фильтра
Hadapt
= adaptfilt.rls(M,lam,P0,w0,Zi);
Hadapt.PersistentMemory
= false;
%
Фильтрация адаптивным фильтром [y,e]
= filter(Hadapt,noise,d);
%
Вывод графиков исходного "чистого
сигнала" и результата фильтрации subplot(414) plot(0:499,signal(1:500),0:499,e(1:500));
grid;
axis([0
500 -4 4]);
title('Исходный
сигнал и сигнал ошибки');
legend('Исходный
сигнал','Сигнал
ошибки');
Приложение 2.
%
Моделирование задачи идентификации
%
КИХ - системы
K
= 20; %
Число усредняемых реализаций
x
= zeros(1000,K);
d
= x; %
Инициализация переменных
h
= fir1(31,0.5); %
КИХ - система для идентификации
%
Это оконный фильтр 31-го порядка с
частотой среза 0,5
x
= filter(1,[1 -0.5],sign(randn(size(x))));
n
= 0.1*randn(size(x)); %
случайный
шум
d
= filter(h,1,x)+n; %
желаемый
сигнал
L
=32; %
длина адаптивного фильтра
mu
= 0.005; %
размер шага сходимости
M
= 5; %
коэффициент прореживания отсчетов
h
= adaptfilt.lms(L,mu);
%
Вычисление кривой обучения фильтра
МНК
[mse,meanH,Hsim,traceKsim]
= msesim(h,x,d,M);
nn
= M:M:size(x,1);
subplot(2,1,1);
semilogy(nn,mse);
grid
title('
Кривая обучения МНК, число реализаций
K = 20');
xlim([0
size(x,1)])
%
Инициализация фильтра РНК
M
=32; %
Число коэффициентов фильтра
lam
= 0.98; %
Коэффициент взвешивания
delta
= 0.1; %
Константа инициализации
w0
= zeros(M,1); %
Нулевой начальный вектор коэффициентов
P0
= (1/delta)*eye(M,M); %
Инициализация обратной АКФ матрицы
Zi
= zeros(M-1,1); %
Нулевое начальне состояние фильтра
%
Конструирование адаптивного РНК -
фильтра
Hrls
= adaptfilt.rls(M,lam,P0,w0,Zi);
%
Вычисление кривой обучения фильтра
РНК
[mse1,meanH1,Hsim1,traceKsim1]
= msesim(Hrls,x,d,1);
%nn1
= M:M:size(x,1);
nn1
= 1:1:size(x,1);
subplot(2,1,2);
semilogy(nn1,mse1);
grid
title('
Кривая
обучения
РНК,
число
реализаций
K = 20');
xlim([0
size(x,1)])
Приложение 3.
%
Моделирование задачи идентификации
%
КИХ - системы
K
= 10; %
Число усредняемых реализаций
x = zeros(300,K);
d
= x; %
Инициализация переменных
h
= fir1(15,0.7); %
КИХ - система для идентификации
%
Это оконный фильтр 15-го порядка с
частотой среза 0,7
x
= filter(1,[1 -0.5],sign(randn(size(x))));
n
= 0.1*randn(size(x)); %
случайный
шум
d
= filter(h,1,x)+n; %
желаемый
сигнал
%
Инициализация фильтра РНК
M
=16; %
Число коэффициентов фильтра
lam
= 0.98; %
Коэффициент взвешивания
delta
= 0.1; %
Константа инициализации
w0
= zeros(M,1); %
Нулевой начальный вектор коэффициентов
P0
= (1/delta)*eye(M,M); %
Инициализация обратной АКФ матрицы
Zi
= zeros(M-1,1); %
Нулевое начальное состояние фильтра
%
Конструирование адаптивного РНК -
фильтра
Hrls =
adaptfilt.rls(M,lam,P0,w0,Zi);
%
Вычисление кривой обучения фильтра
РНК
[mse1,meanH1,Hsim1,traceKsim1]
= msesim(Hrls,x,d,1);
nn1
= 1:1:size(x,1);
subplot(2,1,1);
semilogy(nn1,mse1);
title('
Кривая обучения РНК, число реализаций
K = 10');
xlim([0 size(x,1)])
G0
= sqrt(.1)*eye(16); %
Инициализация корреляционной матрицы
lam
= 0.99; %
Qr RLS коэффициент забывания
Hqr =
adaptfilt.qrdrls(M,lam,G0);
%[y,e]
= filter(h,x,d);
[mse2,meanH2,Hsim2,traceKsim2]
= msesim(Hqr,x,d,1);
nn1 = 1:1:size(x,1);
subplot(2,1,2);
semilogy(nn1,mse1);
title('
Кривая обучения QR - РНК, число реализаций
K = 10');
xlim([0 size(x,1)])