Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Brush_Lecture_5.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
199.17 Кб
Скачать

Блочный алгоритм мнк в частотной области

Выходной сигнал адаптивного КИХ - фильтра - это линейная свертка входного сигнала x[k] и импульсной характеристики H[k] , где LB – длина импульсной характеристики фильтра. В курсе «Теория и обработка сигналов» было показано, вычисление свертки выполняется быстрее в частотной области за счет использования алгоритма БПФ.

Свертке в частотной области соответствует произведение преобразований Фурье, т.е. - свойство свертки ДВПФ. Такая свертка является периодической с периодом L, где L – размер ДПФ. Этот метод вычисления называют круговой (быстрой) сверткой. Благодаря БПФ вычисление свертки в частотной области требует операций умножений вместо L2. Чем больше длина L, тем быстрее вычисляется круговая свертка. Вычисление ДПФ требует блочного использования данных. Наиболее часто при этом используется метод наложения – сложения вычисления свертки (Overlap-and-Add Method).

В MATLAB для реализации блочного метода адаптивной фильтрации в частотной области служит специальная функция ha=adaptfilt.blmsfft(l,step,leakage,blocklen,coeffs,states).

Она аналогична использовавшейся выше функции

ha = adaptfilt.blms(l,step,leakage,blocklen,coeffs,states), но в отличие от неё длина blocklen + length(coeffs) должна быть равна степени два (=2M). Если выполняется данное условие длины, то будет использоваться блочная функция с вычислениями в частотной области. Кроме того, длина входного сигнала должна делиться нацело на длину блока.

Ниже приведены результаты моделирования задачи идентификации системы, аналогичные предыдущему примеру, но в данном случае используется функция 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]