
Если сигналы нестационарны, то
корреляционные функции R иPменяются во времени, поэтому значения
коэффициентовHopt
необходимо пересчитывать по
мере поступления отсчетов, т.е. в
промежутке между поступлениями очередных
отсчетов, что требует применения
процессора с высокой вычислительной
мощностью, и на практике во многих
случаях может оказаться невозможным.
Поэтому для вычисления передаточной
функции оптимального фильтра на практике
не используют обращение матрицы, а
применяют различные итеративные
(последовательные) вычислительные
процедуры, сходящиеся к оптимальному
фильтру.
Рассмотрим задачу моделирования
фильтра Винера в среде MATLAB на базе
рассмотренной выше схемы (см. рис. в
начале лекции) и алгоритма фильтра
Винера.
Полезный сигнал в этом случае представляет
собой сумму двух дискретных гармоник
s=sin(2*pi*0.01*k)+sin(2*pi*0.005*k).Аддитивный шум для этого входа (n1на вышеприведенной схеме) формируется
как выход КИХ - фильтра с передаточной
функцией
На другой
вход фильтра (шум x[k]на
схеме) подается шум, формируемый из
белого шума КИХ - фильтром 3-го порядка
с передаточной функцией
Моделирование фильтра Винера в MATLAB
проводится специальной функцией
B=FIRWIENER(N,X,Y),
которая вычисляет системную функцию
КИХ - фильтра Винера порядкаNдля
сигналаXна опорном
входе, задаваемого вектором X и сигнала
на основном входе, определяемого
вектором Y.
Модель фильтра Винера в matlab
,
на вход которого поступает белый шум,
генерируемый функциейrandn(1,N).
.
Скрипт – файл
k=(1:300)';
%
формирование полезного сигнала
s=sin(2*pi*0.01*k)+sin(2*pi*0.005*k);
%
Получение некоррелированного шума
n1=0.8*randn(300,1);
f1=[1,
0.5];%
Фильтр для шума
n=filter(1,f1,n1);
%
Коррелированный шум на основном входе
d=s+n;
%
сумма сигнал и шума
%
фильтр для шума на основном входе
f2=[1,
-0.8, 0.4, -0.2];
x=filter(f2,1,n1);
%
шум на опорном входе
L=2;
%
порядок фильтра
fw=firwiener(L-1,x,
d);%
синтез (расчет) фильтра Винера
yw=filter(fw,1,x);%
винеровская фильтрация шума
ew=d-yw;
%
Винеровская оценка полезного сигнала
%построение
графиков figure plot(k(1:end),[ew(1:end),s(1:end),d(1:end)]);
legend('фильтр
Винера','Полезный
сигнал',
'Cигнал
с шумом')
title('L
= 2')
xlabel('Индекс
времени k')
ylabel('Амплитуда')
Моделирование проведено
для трех значений порядка фильтра L
= 2, L
= 5. При увеличении порядка фильтра как
L3
возрастает его вычислительная сложность.
Ниже приведен ещё один пример
моделирования фильтра Винера для
полезного сигнала в виде прямоугольного
импульсного сигнала. Модели шумов –
прежние.
Скрипт – файл
k=(1:500)';
%
формирование полезного сигнала
s2=square(.06*k,50);
%
Получение некоррелированного шума
n1=0.6*randn(500,1);
f1=[1,
0.7];%
Фильтр для шума
n=filter(1,f1,n1);
%
Коррелированный шум на основном входе
d=s2+n;
%
сумма сигнал и шума
%
фильтр для шума на основном входе
f2=[1,
-0.8, 0.4, -0.2];
x=filter(f2,1,n1);
%
сигнал на опорном входе
L=3;
%
порядок фильтра
fw=firwiener(L-1,x,
d);%
расчет фильтра Винера
yw=filter(fw,1,x);%
винеровская фильтрация шума
ew=d-yw;
%
Винеровская оценка полезного сигнала
%построение
графиков figure plot(k(300:end),[ew(300:end),s2(300:end),d(300:end)]);
legend('фильтр
Винера','Полезный
сигнал',
'Cигнал
с шумом')
xlabel('Индекс
времени k'),
ylabel('Амплитуда')
Порядок фильтра =3
Порядок фильтра = 8