dsp. FrequencyDomainAdaptiveFilter

Вычислите вывод, ошибку и коэффициенты с помощью КИХ частотного диапазона адаптивный фильтр

Описание

Система dsp.FrequencyDomainAdaptiveFilter object™ реализует адаптивный конечный импульсный ответ (FIR), просачиваются частотный диапазон с помощью быстрого алгоритма наименее средних квадратов (LMS) блока. Длина и свойства BlockLength задают длину фильтра, и длина блока оценивает использование алгоритма. Свойство FFTCoefficients содержит дискретное преобразование Фурье текущих коэффициентов фильтра. Объект предлагает ограниченные и неограниченные версии алгоритма с разделенными и нережимами разделения. Для получения дополнительной информации см. Алгоритмы.

Отфильтровать сигнал с помощью КИХ частотного диапазона адаптивный фильтр:

  1. Создайте объект dsp.FrequencyDomainAdaptiveFilter и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

fdaf = dsp.FrequencyDomainAdaptiveFilter
fdaf = dsp.FrequencyDomainAdaptiveFilter(len)
fdaf = dsp.FrequencyDomainAdaptiveFilter(___,Name,Value)

Описание

пример

fdaf = dsp.FrequencyDomainAdaptiveFilter возвращает КИХ частотного диапазона адаптивный Системный объект фильтра, fdaf. Этот Системный объект используется, чтобы вычислить отфильтрованный вывод и ошибку фильтра для данного входа и желаемого сигнала.

пример

fdaf = dsp.FrequencyDomainAdaptiveFilter(len) возвращает КИХ частотного диапазона адаптивный объект фильтра с набором свойств Length к len.

пример

fdaf = dsp.FrequencyDomainAdaptiveFilter(___,Name,Value) возвращает КИХ частотного диапазона адаптивный объект фильтра с каждым заданным набором свойств к заданному значению. Заключите каждое имя свойства в кавычки. Можно использовать этот синтаксис с любыми предыдущими комбинациями входных аргументов.

Пример: fdaf = dsp.FrequencyDomainAdaptiveFilter('Length',32,'StepSize',0.1) моделирует частотный диапазон адаптивный фильтр с длиной 32 касаний и размером шага 0,1.

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и функция release разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Метод раньше вычислял коэффициенты фильтра, заданные как:

  • 'Constrained FDAF' – Налагает ограничение градиента на веса касания фильтра.

  • 'Unconstrained FDAF' – Никакое ограничение градиента не наложено на веса касания фильтра.

  • 'Partitioned constrained FDAF' – Делит импульсный ответ фильтра, чтобы уменьшать задержку.

  • 'Partitioned unconstrained FDAF' – Делит импульсный ответ фильтра, чтобы уменьшать задержку. Никакое ограничение градиента не наложено на веса касания фильтра.

Для получения дополнительной информации см. Алгоритмы.

Длина КИХ фильтрует содействующий вектор, заданный как положительный, скаляр с целочисленным знаком.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Длина блока для содействующих обновлений, заданных как положительный, скаляр с целочисленным знаком. Адаптивный фильтр обрабатывает входные данные и желаемый сигнал как блок выборок длины, установленной этим свойством. Для получения дополнительной информации о том, как эти данные обрабатываются фильтром, см. Алгоритмы. Длина входного вектора должна быть делимой значением свойства BlockLength. Значение по умолчанию свойства BlockLength установлено в значение свойства Length.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Фактор размера шага адаптации, заданный как действительный скаляр в области значений (0,1]. Используя небольшой шаг размер гарантирует небольшую установившуюся ошибку. Однако размер небольшого шага уменьшает получившуюся быстроту сходимости адаптивного фильтра. Увеличение размера шага улучшает быстроту сходимости, за счет увеличенной установившейся среднеквадратической ошибки. Когда значением размера шага является 1, алгоритм обеспечивает оптимальный компромисс между быстротой сходимости и установившейся среднеквадратической ошибкой.

Настраиваемый: да

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический

Фактор утечки, используемый при реализации текучего адаптивного фильтра, заданного как скалярное числовое значение в области значений [0,1]. Когда значение - меньше чем 1, Системный объект реализует текучий адаптивный алгоритм. Когда значение равняется 1, объект не обеспечивает утечки в методе адаптации.

Настраиваемый: да

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический

Усреднение фактора раньше вычисляло экспоненциально оконные степени входного сигнала БПФ для содействующих обновлений, заданных как действительный скаляр в области значений (0,1].

Настраиваемый: да

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический

Сместите для условий нормализации в содействующих обновлениях, заданных как неотрицательное действительное скалярное значение. Это значение свойства используется, чтобы избежать деления на нуль или деления очень небольшими числами, если какая-либо из степеней входного сигнала БПФ становится очень маленькой.

Настраиваемый: да

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Начальная общая ценность всех степеней входного сигнала БПФ, заданных в виде положительного числа.

Если вы изменяете это значение, если объект заблокирован, изменение вступает в силу только после того, как вы сбрасываете объект.

Настраиваемый: да

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Начальные коэффициенты временного интервала адаптивного фильтра, заданного как скаляр или вектор длины, равняются значению свойства Length. Адаптивный объект фильтра использует эти коэффициенты, чтобы вычислить начальные коэффициенты фильтра частотного диапазона.

Если вы изменяете это значение, если объект заблокирован, изменение вступает в силу только после того, как вы сбрасываете объект.

Настраиваемый: да

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Заблокированное состояние содействующих обновлений, заданных как:

  • ложь Объект постоянно обновляет коэффициенты фильтра.

  • tRUE Коэффициенты фильтра не становятся обновленными, и их значения остаются в текущем значении.

Настраиваемый: да

Типы данных: логический

Это свойство доступно только для чтения.

Текущее дискретное преобразование Фурье коэффициентов фильтра, возвращенных как вектор - строка. Для 'Constrained FDAF' и алгоритмов 'Unconstrained FDAF', длина этого вектора равна сумме значения Length и значения BlockLength. Это свойство инициализируется к значениям БПФ свойства InitialCoefficients. Чтобы получить дискретное преобразование Фурье коэффициентов фильтра, вызовите объект и получите доступ к свойству FFTCoefficients объекта.

Типы данных: single | double
Поддержка комплексного числа: Да

Использование

Синтаксис

[y,err] = fdaf(x,d)

Описание

[y,err] = fdaf(x,d) фильтрует входной сигнал, x, с помощью d в качестве желаемого сигнала, и возвращает отфильтрованный выходной параметр в y и ошибку фильтра в err. Системный объект оценивает, что веса фильтра должны были минимизировать ошибку между выходным сигналом и желаемым сигналом. БПФ этих весов фильтра может быть получен путем доступа к свойству FFTCoefficients после вызова объектного алгоритма.

Входные параметры

развернуть все

Сигнал, который будет отфильтрован КИХ частотного диапазона адаптивный фильтр. Вход, x, и желаемый сигнал, d, должен иметь тот же размер и тип данных. Длина входного вектора должна быть делимой значением свойства BlockLength.

Вход, x, может быть сигналом переменного размера, пока длина кадра является кратной BlockLength. Можно изменить число элементов в вектор-столбце, даже когда объект заблокирован. Системный объект блокирует, когда вы вызываете объект запустить его алгоритм.

Типы данных: single | double
Поддержка комплексного числа: Да

Частотный диапазон адаптивный фильтр адаптирует свои веса фильтра, чтобы минимизировать ошибку, err, и сходиться входной сигнал, x, к желаемому сигналу, d, максимально тесно.

Входной сигнал и желаемый сигнал должны иметь тот же размер и тип данных. Длина желаемого сигнального вектора должна быть делимой значением свойства BlockLength.

Входной сигнал может быть сигналом переменного размера, пока длина кадра является кратной BlockLength. Можно изменить число элементов в вектор-столбце, даже когда объект заблокирован. Системный объект блокирует, когда вы вызываете объект запустить его алгоритм.

Типы данных: single | double
Поддержка комплексного числа: Да

Выходные аргументы

развернуть все

Фильтрованный выходной параметр, возвращенный как вектор-столбец. Объект адаптирует свои веса фильтра, чтобы сходиться входной сигнал, x, чтобы совпадать с желаемым сигналом, d. Фильтр выводит сходившийся сигнал.

Типы данных: single | double
Поддержка комплексного числа: Да

Различие между выходным сигналом и желаемым сигналом, возвращенным как вектор-столбец. Цель адаптивного фильтра состоит в том, чтобы минимизировать эту ошибку. Объект адаптирует свои веса, чтобы сходиться к оптимальным весам фильтра, которые производят выходной сигнал, который совпадает с желаемым сигналом максимально тесно. Для получения дополнительной информации о том, как err вычисляется, см. [2].

Типы данных: single | double
Поддержка комплексного числа: Да

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

развернуть все

Передайте сигнал квадратурного манипулирования сдвига фазы (QPSK) через шумный канал передачи. Минимизируйте шум в полученном сигнале с помощью частотного диапазона адаптивный фильтр.

Примечание: Если вы используете R2016a или более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом шага. Например, obj(x) становится step(obj,x).

Сигнал QPSK, s, передается через шумный канал. Числитель и коэффициенты знаменателя канала содержатся в векторах b и a, соответственно. Полученный сигнал, r, полученный в конце канала передачи содержит переданный сигнал QPSK и шум, добавленный к каналу, n. Адаптивный фильтр используется, чтобы извлечь сигнал QPSK от полученного шумного входа. Желаемый сигнал, d, является задержанной версией сигнала QPSK.

D = 16;
b  = exp(1i*pi/4)*[-0.7 1];
a  = [1 -0.7];
ntr = 1024;
s  = sign(randn(1,ntr+D)) + 1i*sign(randn(1,ntr+D));
n  = 0.1*(randn(1,ntr+D) + 1i*randn(1,ntr+D));
r  = filter(b,a,s) + n;
x  = r(1+D:ntr+D);
d  = s(1:ntr);

Создайте объект dsp.FrequencyDomainAdaptiveFilter смоделировать частотный диапазон адаптивный фильтр длины 32 касания и размер шага 0,1. Адаптивный фильтр принимает задержанную версию полученного сигнала и желаемого сигнала как входные параметры. Вывод адаптивного фильтра сравнивается с желаемым сигналом. Ошибка между двумя сигналами представляет шум, добавленный к каналу передачи. Адаптивный фильтр обновляет свои коэффициенты, пока эта ошибка не становится минимальной. Чтобы получить дискретное преобразование Фурье коэффициентов фильтра, вызовите объект fdaf и получите доступ к свойству FFTCoefficients этого объекта.

mu  = 0.1;
fdaf = dsp.FrequencyDomainAdaptiveFilter('Length',32,'StepSize',mu);
[y,e] = fdaf(x,d);
fftCoeffs = fdaf.FFTCoefficients
fftCoeffs = 1×64 complex

   0.6802 - 0.6847i  -0.2485 - 0.9427i  -0.9675 - 0.2123i  -0.5605 + 0.8002i   0.5748 + 0.7593i   0.8541 - 0.3917i  -0.2526 - 0.9022i  -0.9298 + 0.1255i   0.0181 + 0.9366i   0.9207 + 0.0511i   0.1063 - 0.8972i  -0.8919 - 0.1829i  -0.2668 + 0.9113i   0.9215 + 0.3186i   0.3417 - 0.8859i  -0.8285 - 0.3760i  -0.4317 + 0.8200i   0.8741 + 0.4765i   0.4874 - 0.9075i  -0.8517 - 0.4774i  -0.4709 + 0.7632i   0.7468 + 0.4833i   0.5193 - 0.7995i  -0.8218 - 0.5649i  -0.5908 + 0.7768i   0.7316 + 0.5866i   0.5806 - 0.7270i  -0.7148 - 0.5998i  -0.6287 + 0.6702i   0.6575 + 0.6379i   0.6332 - 0.7153i  -0.7659 - 0.6424i  -0.6678 + 0.7294i   0.6536 + 0.6891i   0.7006 - 0.6333i  -0.6594 - 0.7117i  -0.7207 + 0.6517i   0.6031 + 0.7239i   0.7362 - 0.5776i  -0.5869 - 0.7682i  -0.7975 + 0.5789i   0.5449 + 0.7992i   0.7909 - 0.5343i  -0.5512 - 0.8070i  -0.8392 + 0.5338i   0.4605 + 0.8493i   0.8358 - 0.3921i  -0.3751 - 0.8388i  -0.8739 + 0.3785i   0.3625 + 0.9048i

Постройте Синфазное и Квадратурные компоненты желаемого, выведите, и сигналы ошибки.

plot(1:ntr,real([d;y;e]))
legend('Desired','Output','Error')
title('In-Phase Components')
xlabel('Time Index'); ylabel('signal value')

plot(1:ntr,imag([d;y;e]))
legend('Desired','Output','Error')
title('Quadrature Components')
xlabel('Time Index')
ylabel('signal value')

Создайте графики рассеивания полученного сигнала и желаемого сигнала.

plot(x(ntr-100:ntr),'.')
axis([-3 3 -3 3])
title('Received Signal Scatter Plot')
axis('square')
xlabel('Real[x]')
ylabel('Imag[x]') 
grid on

plot(d(ntr-100:ntr),'.')
axis([-3 3 -3 3])
title('Desired Signal Scatter Plot')
axis('square')
xlabel('Real[y]')
ylabel('Imag[y]')
grid on

Адаптивный фильтр компенсирует полученный сигнал устранить шум. Постройте график рассеивания компенсируемого сигнала.

plot(y(ntr-100:ntr),'.')
axis([-3 3 -3 3])
title('Equalized Signal Scatter Plot')
axis('square')
xlabel('Real[y]')
ylabel('Imag[y]')
grid on

Используйте частотный диапазон адаптивный фильтр, чтобы оценить коэффициенты длинного КИХ-фильтра. КИХ-фильтр моделирует импульсный ответ комнаты. Используйте режим разделения в частотном диапазоне адаптивный фильтр, чтобы уменьшать задержку фильтра.

Примечание: Этот пример запускается только в R2018a или позже.

Инициализация

Сгенерируйте долгий КИХ-импульсный ответ 8 192 выборок и присвойте импульсный ответ на объект dsp.FIRFilter, room. Это объектные модели импульсный ответ комнаты. Создайте фильтр dsp.FrequencyDomainAdaptiveFilter, lmsfilt, в разделенном ограниченном режиме. Установите длину фильтра к одной четверти продолжительность импульсного ответа комнаты. Установите длину блока фильтра к 128 выборкам. Установите размер шага на 0,025, начальную степень к 0,01, насчитав фактор к 0,98, сместите к 1, и фактор утечки к 1. Инициализируйте объект dsp.ArrayPlot просмотреть коэффициенты фильтра. Инициализируйте объект dsp.TimeScope показать среднеквадратическую ошибку между фильтром вывод и желаемым сигналом.

fs = 16e3;
m = 8192;
[b,a] = cheby2(4,20,[0.1 0.7]);
impulseResponseGenerator = dsp.IIRFilter(...
    'Numerator', [zeros(1,6) b], ...
    'Denominator', a);
roomImpulseResponse = impulseResponseGenerator( ...
    (log(0.99*rand(1,m)+0.01).*sign(randn(1,m)).*exp(-0.002*(1:m)))');
roomImpulseResponse = roomImpulseResponse/norm(roomImpulseResponse);
room = dsp.FIRFilter('Numerator',roomImpulseResponse');

lmsfilt = dsp.FrequencyDomainAdaptiveFilter(...
    'Method','Partitioned constrained FDAF',...
    'Length',m/4, ...
    'BlockLength',128,...
    'StepSize',0.025, ...
    'InitialPower',0.01, ...
    'AveragingFactor',0.98,...
    'Offset',1,...
    'LeakageFactor',1);

FrameSize = lmsfilt.BlockLength; NIter = 2000;

AP = dsp.ArrayPlot('YLimits',[-0.2 .2],'ShowLegend',true, ...
    'Position',[0 0 560 420],'ChannelNames', ...
    {'Actual Coefficients','Estimated Coefficients'});

TS = dsp.TimeScope('SampleRate',fs,'TimeSpan',FrameSize*NIter/fs,...
    'TimeUnits','Seconds',...
    'YLimits',[-50 0],'Title','Learning curve',...
    'YLabel','dB', ...
    'BufferLength',FrameSize*NIter,...
    'ShowGrid',true);

signalmean = dsp.Mean('RunningMean',true);

Потоковая передача

Сгенерируйте случайный входной сигнал с помощью функции randn. Формат кадра входа совпадает с длиной блока адаптивного фильтра. Желаемый сигнал является суммой вывода КИХ-фильтра (комната) и белый Гауссов шумовой сигнал. Передайте входной сигнал и желаемый сигнал к адаптивному фильтру. Вычислите адаптивный фильтр вывод и ошибка между выводом и желаемым сигналом.

Оцените коэффициенты временного интервала адаптивного фильтра путем взятия ОБПФ содействующего вектора частотного диапазона, возвращенного свойством lmsfilt.FFTCoefficients. Сравните предполагаемые коэффициенты с фактическими коэффициентами, присвоенными КИХ-фильтру (комната). Если адаптивный фильтр сходился свой вывод к желаемому сигналу и минимизировал сигнал ошибки, предполагаемое содействующее соответствие тесно с фактическими коэффициентами. Это означает, что адаптивный фильтр успешно адаптировал себя, чтобы смоделировать импульсный ответ КИХ-фильтра (комната).

for k = 1:NIter
    x = randn(FrameSize,1);
    d = room(x) + 0.01*randn(FrameSize,1);
    [y,e] = lmsfilt(x,d);
    FFTCoeffs = lmsfilt.FFTCoefficients;
    w = ifft(FFTCoeffs,[],2,'symmetric');
    w = w(:,1:FrameSize) + w(:,FrameSize+1:end);
    w = reshape(w.',1,m/4);
    AP([roomImpulseResponse(1:m/4),w.']);
    TS(10*log10(signalmean(abs(e).^2)));
end

Когда фильтр адаптируется со временем, вы видите в осциллографе времени, что среднеквадратическая ошибка становится минимальной. Одновременно, предполагаемые коэффициенты совпадают с фактическими коэффициентами тесно в графике массивов.

Алгоритмы

развернуть все

Частотный диапазон адаптивная фильтрация состоит из трех шагов - фильтрация, оценка погрешности и адаптация веса касания. Этот алгоритм реализует КИХ, просачивающегося, частотный диапазон с помощью сохранения перекрытие или перекрытия - добавляет метод. Для получения дополнительной информации реализации этих двух методов смотрите раздел Algorithms на странице объекта dsp.FrequencyDomainFIRFilter. Оценка погрешности и адаптация веса касания реализованы с помощью быстрого LMS-алгоритма блока (FBLMS).

Ссылки

[1] Shynk, J.J. "Частотный диапазон и Многоскоростная Адаптивная Фильтрация". Журнал Обработки сигналов IEEE. Издание 9, Номер 1, 1992, стр 14–37.

[2] Farhang-Boroujeny, B., адаптивные фильтры: теория и приложения, Чичестер, Англия, Вайли, 1998.

[3] Stockham, T. G. "Скоростная Свертка младшая и Корреляция". Продолжения 1 966 Компьютерных Конференций по Соединению Spring, AFIPS, Издания 28, 1966, стр 229–233.

Расширенные возможности

Введенный в R2013b