
- •Разновидности (варианты) мнк (краткий обзор)
- •Нормализованный алгоритм мнк
- •Знаковые алгоритмы мнк (Simplified lms Algorithms)
- •Алгоритм знака ошибки (The Sign Algorithm)
- •Алгоритм двойного знака (The Sign-Sign Algorithm)
- •Блочный алгоритм мнк (Blockwise Computation Algorithm)
- •Блочный алгоритм мнк в частотной области
Выходной сигнал адаптивного КИХ -
фильтра - это линейная свертка входного
сигнала x[k]
и импульсной характеристики H[k]
Свертке
В MATLAB для реализации
блочного метода адаптивной фильтрации
в частотной области служит специальная
функция
ha=adaptfilt.blmsfft(l,step,leakage,blocklen,coeffs,states). Она
аналогична использовавшейся
выше функции
ha
= adaptfilt.blms(l,step,leakage,blocklen,coeffs,states), но
в отличие
от неё
длина blocklen + length(coeffs)
должна быть
равна степени
два (=2M).
Если выполняется данное условие
длины, то будет использоваться блочная
функция с вычислениями в частотной
области. Кроме того, длина входного
сигнала должна делиться нацело на длину
блока.
Блочный алгоритм мнк в частотной области
,
где LB – длина импульсной
характеристики фильтра. В курсе «Теория
и обработка сигналов» было показано,
вычисление свертки выполняется быстрее
в частотной области за счет использования
алгоритма БПФ.
в частотной области соответствует
произведение преобразований Фурье,
т.е.
- свойство свертки ДВПФ. Такая свертка
является периодической
с периодом L,
где L
– размер ДПФ. Этот метод вычисления
называют круговой
(быстрой)
сверткой. Благодаря БПФ вычисление
свертки в частотной области требует
операций умножений вместо L2.
Чем больше длина L,
тем быстрее вычисляется круговая
свертка. Вычисление ДПФ требует блочного
использования данных. Наиболее часто
при этом используется метод наложения
– сложения вычисления свертки
(Overlap-and-Add
Method).
Ниже приведены результаты моделирования
задачи идентификации системы, аналогичные
предыдущему примеру, но в данном случае
используется функция adaptfilt.blmsfft(),
длина входного сигнала фильтра выбрана
равной 512 отсчетов и длина блока данных
- 16 отсчетов.
Приложение 1
%
адаптивная фильтрация - алгоритмы МНК
и нормализованный МНК
k=(1:1000)';
s=sin(0.1*pi*k);
%
полезный гармонический сигнал
f1=[1,
0.6]; %
БИХ - фильтр для получения шума на
опорном входе
n=0.8*randn(1000,1);
n1=filter(1,f1,n);
%
шум на опорном (желаемом) входе
d=s+n1;
%
сигнал с шумом на опорном входе
f2=[1,
-0.5, 0.6, -0.2]; %
КИХ - фильтр для шума на основном входе
x=filter(f2,
1, n); %
шум на основном входе
N=10;
%
число коэффициентов адаптивного
фильтра
Hlms=adaptfilt.lms(N);
%
конструирование адаптивного фильтра
Hnlms=adaptfilt.nlms(N);
%
определение максимального размера
шага
[mumaxlms,mumaxmselms]
= maxstep(Hlms,x);
Hlms.StepSize
= mumaxmselms/20; %
установка размера шага
[mumaxnlms,mumaxmsenlms]
= maxstep(Hnlms);
hnlms.StepSize
= mumaxmsenlms/20;
fwin=firwiener(N-1,x,d);
%
реализация фильтра Винера
ywin=filter(fwin,1,x);
%
фильтрация фильтром Винера
ewin=d-ywin;
%
получение оценки полезного сигнала
ф_ром Винера
Hlms
= adaptfilt.lms(N,Hlms.StepSize); %
получение фильтра МНК
[ylms,elms]
= filter(Hlms,x,d);%
Фильтрация стандартным МНК
Hnlms
= adaptfilt.nlms(N,hnlms.StepSize); %
получение нормализованного фильтра
[ynlms,enlms]
= filter(Hnlms,x,d); %
фильтрация нормированным МНК
%
построение
графиков
сигналов
subplot(211)
plot(k(900:end),d(900:end),k(900:end),s(900:end))
legend('Сигнал
с
шумом','Сигнал')
subplot(212)
plot(k(900:end),
ewin(900:end),k(899:end),elms(899:end),k(899:end),enlms(899:end) );
xlim([900,1000])
legend('Фильтр
Винера','Фильтр
МНК',
'Фильтр
НМНК')
xlabel('Индекс
времени (к)'),
ylabel('Уровень
сигнала')
Приложение
2.
%
Моделирование задачи идентификации
%
КИХ - системы
K
= 50; %
Число усредняемых реализаций
x
= zeros(2000,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; %
длина адаптивного фильтра
mu1
= 0.005; %
размер шага сходимости
mu2
= 0.9;
M
= 10; %
коэффициент прореживания отсчетов
h1
= adaptfilt.lms(L,mu1);
h2
= adaptfilt.nlms(L,mu2);
[mse1,meanH1,Hsim1,traceKsim1]
= msesim(h1,x,d,M);
[mse2,meanH2,Hsim2,traceKsim2]
= msesim(h2,x,d,M);
nn
= M:M:size(x,1);
subplot(1,2,1);
semilogy(nn,mse1);
title('
Кривая
обучения
МНК
');
xlim([0
size(x,1)])
%legend('Измеренная
MSE');
xlabel('индекс
времени');
ylabel('значение
средней квадратичной ошибки');
subplot(1,2,2);
semilogy(nn,mse2);
title('
Кривая обучения нормированного МНК
');
xlim([0
size(x,1)])
xlabel('индекс
времени');
ylabel('значение
средней квадратичной ошибки');
Приложение
3
K
= 20; %
Число усредняемых реализаций
x
= zeros(2000,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; %
длина адаптивного фильтра
M
= 10; %
коэффициент прореживания отсчетов
mu
= 0.005; %
значение шага сходимости
h0
= adaptfilt.lms(L,mu);
[mse0,meanH0,Hsim0,traceKsim0]
= msesim(h0,x,d,M);
h1
= adaptfilt.se(32,mu);
[mse1,meanH1,Hsim1,traceKsim1]
= msesim(h1,x,d,M);
h2
= adaptfilt.sd(32,mu);
[mse2,meanH2,Hsim2,traceKsim2]
= msesim(h2,x,d,M);
h3
= adaptfilt.ss(32,mu);
[mse3,meanH3,Hsim3,traceKsim3]
= msesim(h3,x,d,M);
nn
= M:M:size(x,1);
subplot(4,1,1),
semilogy(nn,mse0);
legend('
кривая
обучения
МНК
');
axis([0 size(x,1) 0.0001 1]);
ylabel('СКО');
subplot(4,1,2),
semilogy(nn,mse1);
legend('
кривая обучения алгоритма знака ошибки
');
axis([0 size(x,1) 0.0001 1]);
ylabel('СКО');
subplot(4,1,3),
semilogy(nn,mse2);
legend('
кривая обучения алгоритма знака сигнала
');
axis([0 size(x,1) 0.0001 1]);
ylabel('
СКО');
subplot(4,1,4),
semilogy(nn,mse3);
legend('
кривая обучения алгоритма двойного
знака ');
axis([0 size(x,1) 0.0001 1]);
xlabel('индекс
времени'),
ylabel('СКО');
Приложение 4.
%
Задача идентификации КИХ - фильтра 15 -
го порядка
x
= randn(1,500); %
Входной сигнал фильтра
b
= fir1(15,0.5); %
КИХ - фильтр для идентификации
no
= 0.1*randn(1,500); %
Дополнительный шум
d
= filter(b,1,x)+no; %
Желаемый сигнал
mu
= 0.008; %
Шаг сходимости
n
= 10; %
Размер блока
ha
= adaptfilt.blms(16,mu,1,n); %
конструирование фильтра
[y,e]
= filter(ha,x,d); %
фильтрация
subplot(3,1,1);
plot(1:500,[d;y;e]);
title('
Идентификация системы');
legend('Желаемый
сигнал','Выходной','Ошибка');
xlabel('Индекс
времени');
ylabel('Значения
сигнала');
subplot(3,1,2);
stem(b);
legend('Исходный
фильтр');
subplot(3,1,3);
stem([ha.coefficients]);
legend('Коэффициенты
адаптивного
фильтра');
xlabel('Номер
коэффициента');
ylabel('Значение
коэффициента');
grid
on;