
При создании и моделировании адаптивного
фильтра необходимо также выбирать
длину фильтра, т.е. число коэффициентов
фильтра. Напомним, что длина КИХ –
фильтра Lи его порядокNсвязаны простым
выражениемN = L-1.
Длина (порядок) фильтра влияет на ошибку
фильтра в установившемся состоянии
(steady state
error) и на его скорость
сходимости (convergence
speed). При выборе
длины фильтра следует учитывать
следующие факторы:
Увеличение длины N
требует увеличения объема вычислений,
например, для МНК – фильтра согласно
соотношению2N+1 операций на одну
итерацию,
Увеличение длины (порядка) фильтра
может уменьшать ошибку в установившемся
режиме, но если длина фильтра слишком
велика, то ошибка, как правило,
возрастает,
Чрезмерно малая длина фильтра может
даже уменьшить скорость сходимости.
Таким образом, факторы, влияющие на
выбор длины (порядка) фильтра, являются
противоречивыми и в конкретной задаче
следует пользоваться известным методом
«проб и ошибок», прибегая к экспериментальной
проверке.
Эти общие рекомендации ниже
проиллюстрированы на использованной
выше модели адаптивной идентификации
системы при некоторой модификации
программы из Приложения 2.
Первые результаты соответствуют случаю,
когда неизвестная система имеет 32
коэффициента, а адаптивный фильтр –
16 коэффициентов.
Выбор длины фильтра
Во втором случае длина адаптивного
фильтра L = 32.
В последнем варианте длина фильтра L
= 128.
Как следует из результатов, наименьшая
ошибка получается при L= 32, т.е. для
длины имеется рациональный оптимум.
Он подбирается опытным путем.
Приложение
1. Скрипт – файл модели МНК – фильтра
k=(1:1000)';
s=sin(0.08*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=15;
%
число коэффициентов фильтра
W0=zeros(N,1); mu=0.1; [W,dhat,e]=fir_lms(mu,W0,x,d);
fwin=firwiener(N-1,x,d);
%
% реализация фильтра Винера
ywin=filter(fwin,1,x);
%
фильтрация фильтром Винера
ewin=d-ywin;
%
получение оценки полезного сигнала
ф_ром Винера
%
построение
графиков
сигналов figure 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),e(899:end)); xlim([900,1000])
legend('Фильтр
Винера','Фильтр
МНК')
xlabel('Индекс
времени (к)'),
ylabel('Уровень
сигнала')
figure,
stem(0:N-1,W(:,1000))
legend('Финальные
коэффициенты фильтра')
figure,
plot(W(5,1:500))
Видно, что по сравнению с предыдущим
случаем
ошибка фильтра уменьшилась на 0,05.
Приложение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; %
длина адаптивного фильтра
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);
title('
Кривая обучения МНК, число реализаций
K = 50');
xlim([0
size(x,1)])
%legend('Измеренная
MSE');
xlabel('индекс
времени');
ylabel('значение
квадратичной ошибки');
subplot(2,1,2);
semilogy(nn,traceKsim);
title('Теоретическая
кривая обучения');
axis([0 size(x,1) 0.0001 1]);
xlabel('индекс
времени');
ylabel('значение
квадратичной ошибки');
Приложение
3. Скрипт
– файл модели компенсации широкополосного
шума
Fs=8000;T=1/Fs;
%
частота отсчетов
t=0:T:0.1;
%
время
s=sin(2*pi*500*t);
%
полезный гармонический сигнал 500 Гц
n=randn(1,
length(t)); %
шум
d=s+n;
%
сигнал с шумом на опорном входе
%
задержанный на 7 отсчетов сигнал на
основном входе
x=filter([0
0 0 0 0 0 0 1], 1, d);
N=21;
%
число коэффициентов адаптивного
фильтра
W0=zeros(N,1);
%
Инициализация коэффициентов
mu=0.001;
%
размер шага сходимости
[W,dhat,e]=fir_lms(mu,W0,x,d);
%
функция
fir_lms
%
построение графиков сигналов
subplot(311),plot(t,s)
legend('Сигнал') ylim([
-2 2]) subplot(312),plot(t,d)
ylabel('Уровень
сигнала')
legend('Сигнал
с шумом') subplot(313),plot(t,
dhat); %xlim([900,1000])
legend('Сигнал
на выходе фильтра МНК')
xlabel('Время,
с'),