dsp.FrequencyDomainAdaptiveFilter

Вычислите выход, ошибки и коэффициенты, используя частотный диапазон конечной импульсной характеристики адаптивный фильтр

Описание

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

Для фильтрации сигнала с помощью частотной конечной импульсной характеристики адаптивного фильтра:

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

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

пример

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 Использование Системных объектов.

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

  • '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 | logical

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

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

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

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

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

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

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

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

Типы данных: 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

Заблокировано состояние обновления коэффициента, заданное как:

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

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

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

Типы данных: logical

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

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

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

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

Синтаксис

Описание

[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')

Figure contains an axes. The axes with title In-Phase Components contains 3 objects of type line. These objects represent Desired, Output, Error.

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

Figure contains an axes. The axes with title Quadrature Components contains 3 objects of type line. These objects represent Desired, Output, Error.

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

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

Figure contains an axes. The axes with title Received Signal Scatter Plot contains an object of type line.

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

Figure contains an axes. The axes with title Desired Signal Scatter Plot contains an object of type line.

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

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

Figure contains an axes. The axes with title Equalized Signal Scatter Plot contains an object of type line.

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

Примечание.Этот пример выполняется только в R2018a или более поздней версии.

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

Произведите длинную импульсную характеристику конечной импульсной характеристики 8 192 выборок и назначьте импульсную характеристику на dsp.FIRFilter объект, room. Этот объект моделирует импульсную характеристику комнаты. Создайте dsp.FrequencyDomainAdaptiveFilter фильтр, lmsfilt, в секционированном ограниченном режиме. Установите длину фильтра равную одной четверти длины импульсной характеристики помещения. Установите длину блока фильтра равным 128 выборкам. Установите размер шага 0,025, начальную степень 0,01, средний коэффициент 0,98, смещение 1 и коэффициент утечки 1. Инициализируйте dsp.ArrayPlot объект для просмотра коэффициентов фильтра. Инициализируйте 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 = timescope('SampleRate',fs,'TimeSpanSource','property',...
    'TimeSpan',FrameSize*NIter/fs,...
    'TimeUnits','Seconds',...
    'YLimits',[-50 0],'Title','Learning curve',...
    'YLabel','dB', ...
    'BufferLength',FrameSize*NIter,...
    'ShowGrid',true);

signalmean = dsp.MovingAverage('SpecifyWindowLength',false);

Вытекание

Сгенерируйте случайный входной сигнал, используя 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

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

Алгоритмы

расширить все

Адаптивная фильтрация частотного диапазона состоит из трех шагов - фильтрация, оценка ошибки и адаптация к весу отвода. Этот алгоритм реализует конечную импульсную характеристику фильтрацию в частотный диапазон с помощью overlap-save или метода перекрытия-суммы. Для получения дополнительной детали реализации этих двух методов см. Раздел «Алгоритмы» в dsp.FrequencyDomainFIRFilter страница объекта. Оценка ошибки и адаптация веса отвода реализованы с помощью LMS-алгоритма быстрого блока (FBLMS).

Ссылки

[1] Shynk, J.J. «Frequency-Domain and Multirate Adaptive Filtering». Журнал обработки сигналов IEEE. Том 9, № 1, 1992, стр. 14-37.

[2] Farhang-Boroujeny, B., Adaptive Filters: Theory and Applications, Chichester, England, Wiley, 1998.

[3] Стокхэм, Т. Г., младший «Высокоскоростная свертка и корреляция». Материалы Весенней совместной компьютерной конференции 1966 года, AFIPS, том 28, 1966, стр. 229-233.

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

.
Введенный в R2013b