dsp.LMSFilter

Вычислите выход, ошибку и веса адаптивного фильтра LMS

Описание

dsp.LMSFilter Система object™ реализует адаптивный фильтр конечной импульсной характеристики (FIR), который сходится входной сигнал к желаемому сигналу с помощью одного из следующих алгоритмов:

  • LMS

  • Нормированный LMS

  • Данные знака LMS

  • Ошибка знака LMS

  • Знак знака LMS

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

Фильтр адаптирует свои веса до ошибки между сигналом первичного входного параметра, и желаемый сигнал минимален. Среднее квадратичное этой ошибки (MSE) вычисляется с помощью msesim функция. Предсказанная версия MSE определяется с помощью Винера, просачиваются msepred функция. maxstep функция вычисляет максимальный размер шага адаптации, который управляет быстротой сходимости.

Для обзора адаптивной методологии фильтра и наиболее распространенных приложений адаптивные фильтры используются в, видят Обзор Адаптивных Фильтров и Приложения.

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

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

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

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

При особых условиях этот Системный объект также поддерживает генерацию кода SIMD. Для получения дополнительной информации смотрите Генерацию кода.

Создание

Описание

пример

lms = dsp.LMSFilter возвращает объект фильтра LMS, lms, это вычисляет отфильтрованный выход, ошибку фильтра и веса фильтра для данного входа и желаемого сигнала с помощью алгоритма наименьшее количество средних квадратичных (LMS).

пример

lms = dsp.LMSFilter(L) возвращает объект фильтра LMS с набором свойств Длины к L.

пример

lms = dsp.LMSFilter(Name,Value) возвращает объект фильтра LMS с каждым заданным набором свойств к заданному значению. Заключите каждое имя свойства в одинарные кавычки. Можно использовать этот синтаксис с предыдущим входным параметром.

Свойства

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

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

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

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

Метод, чтобы вычислить веса фильтра в виде одного из следующего:

  • 'LMS' – Решает уравнение Вайнера-Гопфа и находит коэффициенты фильтра для адаптивного фильтра.

  • 'Normalized LMS' – Нормированное изменение LMS-алгоритма.

  • 'Sign-Data LMS' – Коррекция к весам фильтра в каждой итерации зависит от знака входа x.

  • 'Sign-Error LMS' – Коррекция применилась к текущим весам фильтра за каждую последовательную итерацию, зависит от знака ошибки, err.

  • 'Sign-Sign LMS' – Коррекция применилась к текущим весам фильтра за каждую последовательную итерацию, зависит от обоих знак x и знак err.

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

Длина КИХ фильтрует вектор весов в виде положительного целого числа.

Пример: 64

Пример: 16

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

Метод, чтобы задать размер шага адаптации в виде одного из следующего:

  • 'Property'Свойство StepSize задает размер каждого шага адаптации.

  • 'Input port' – Задайте размер шага адаптации как одни из входных параметров к объекту.

Фактор размера шага адаптации в виде неотрицательного скаляра. Для сходимости нормированного метода LMS размер шага должен быть больше 0 и меньше чем 2.

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

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

Зависимости

Это свойство применяется, когда вы устанавливаете StepSizeSource на 'Property'.

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

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

Пример: 0.5

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

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

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

Пример: 0

Пример: [1 3 1 2 7 8 9 0 2 2 8 2]

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

Отметьте, чтобы адаптировать веса фильтра в виде одного из следующего:

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

  • true – Вход управления адаптацией предоставляется объекту, когда вы вызываете его алгоритм. Если значение этого входа является ненулевым, объект постоянно обновляет веса фильтра. Если значение этого входа является нулем, веса фильтра остаются в своем текущем значении.

Отметьте, чтобы сбросить веса фильтра в виде одного из следующего:

  • false – Объект не сбрасывает веса.

  • true – Вход управления сбросом предоставляется объекту, когда вы вызываете его алгоритм. Эта установка включает свойство WeightsResetCondition. Объект сбрасывает веса фильтра на основе значений WeightsResetCondition свойство и вход сброса предоставляются объектному алгоритму.

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

  • 'Non-zero' – Инициировал операцию сброса на каждой выборке, когда вход сброса не является нулем.

  • 'Rising edge' – Инициировал операцию сброса, когда вход сброса выполняет одно из следующих действий:

    • Повышения от отрицательной величины или до положительного значения или до нуля.

    • Повышения от нуля до положительного значения, где повышение не является продолжением повышения от отрицательной величины, чтобы обнулить.

  • 'Falling edge' – Инициировал операцию сброса, когда вход сброса выполняет одно из следующих действий:

    • Падения от положительного значения до отрицательной величины или нуля.

    • Падения от нуля до отрицательной величины, где падение не является продолжением падения от положительного значения, чтобы обнулить.

  • 'Either edge' – Инициировал операцию сброса, когда вход сброса является возрастающим ребром или падающим ребром.

Объект сбрасывает веса фильтра на основе значения этого свойства и входа r сброса если к объектному алгоритму.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство WeightsResetInputPort на true.

Метод, чтобы вывести адаптированные веса фильтра в виде одного из следующего:

  • 'Last' (значение по умолчанию) — Объект возвращает вектор-столбец весов, соответствующих последней выборке системы координат данных. Длина вектора весов является значением, данным свойством Length.

  • 'All' — Объект возвращает FrameLength-by-Length матрица весов. Матрица соответствует полной истории выборки выборкой весов для всех выборок FrameLength входных значений. Каждая строка в матрице соответствует набору весов фильтра LMS, вычисленных для соответствующей входной выборки.

  • 'None' — Эта установка отключает веса выход.

Свойства фиксированной точки

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

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

  • 'Wrap' – Объект переносит результат своих операций фиксированной точки.

  • 'Saturate' – Объект насыщает результат своих операций фиксированной точки.

Для получения дополнительной информации о действиях переполнения смотрите режим переполнения для операций фиксированной точки.

Размер слова размера шага и дробные настройки длины в виде одного из следующего:

  • 'Same word length as first input' – Объект задает размер слова размера шага, чтобы совпасть с тем из первого входа. Дробная длина вычисляется, чтобы получить самую лучшую точность.

  • 'Custom' – Тип данных размера шага задан как пользовательский числовой тип через свойство CustomStepSizeDataType.

Для получения дополнительной информации о типе данных размера шага этот объект использование смотрите раздел Fixed Point.

Word и дробные длины размера шага в виде числового типа автосо знаком с размером слова 16 и дробная длина 15.

Пример: numerictype ([], 32)

Зависимости

Это свойство применяется при следующих условиях:

  • Набор свойств StepSizeSource к 'Property' и StepSizeDataType устанавливают на 'Custom'.

  • StepSizeSource набор свойств к 'Input port'.

Размер слова фактора утечки и дробные настройки длины в виде одного из следующего:

  • 'Same word length as first input' – Объект задает размер слова фактора утечки, чтобы совпасть с тем из первого входа. Дробная длина вычисляется, чтобы получить самую лучшую точность.

  • 'Custom' – Тип данных фактора утечки задан как пользовательский числовой тип через свойство CustomLeakageFactorDataType.

Для получения дополнительной информации о типе данных фактора утечки этот объект использование смотрите раздел Fixed Point.

Word и дробные продолжительности фактора утечки в виде числового типа автосо знаком с размером слова 16 и дробная длина 15.

Пример: numerictype ([], 32)

Зависимости

Это свойство применяется, когда вы устанавливаете свойство LeakageFactorDataType на 'Custom'.

Размер слова весов и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных весов фильтра, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных весов фильтра задан как пользовательский числовой тип через свойство CustomWeightsDataType.

Для получения дополнительной информации о типе данных весов фильтра этот объект использование смотрите раздел Fixed Point.

Word и дробные длины весов фильтра в виде числового типа автосо знаком с размером слова 16 и дробная длина 15.

Пример: numerictype ([], 32,20)

Зависимости

Это свойство применяется, когда вы устанавливаете свойство WeightsDataType на 'Custom'.

Размер слова энергетического продукта и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных энергетического продукта, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных энергетического продукта задан как пользовательский числовой тип через свойство CustomEnergyProductDataType.

Для получения дополнительной информации о типе данных энергетического продукта этот объект использование смотрите раздел Fixed Point.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство Method на 'Normalized LMS'.

Word и дробные длины энергетического продукта в виде числового типа автосо знаком с размером слова 32 и дробная длина 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство Method на 'Normalized LMS' и свойство EnergyProductDataType к 'Custom'.

Энергетический размер слова аккумулятора и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных энергетического аккумулятора, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных энергетического аккумулятора задан как пользовательский числовой тип через свойство CustomEnergyAccumulatorDataType.

Для получения дополнительной информации об энергетическом типе данных аккумулятора этот объект использование смотрите раздел Fixed Point.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство Method на 'Normalized LMS'.

Word и дробные длины энергетического аккумулятора в виде числового типа автосо знаком с размером слова 32 и дробная длина 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство Method на 'Normalized LMS' и свойство EnergyAccumulatorDataType к 'Custom'.

Размер слова продукта свертки и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных продукта свертки, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных продукта свертки задан как пользовательский числовой тип через свойство CustomConvolutionProductDataType.

Для получения дополнительной информации о типе данных продукта свертки этот объект использование смотрите раздел Fixed Point.

Word и дробные длины продукта свертки в виде числового типа автосо знаком с размером слова 32 и дробная длина 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство ConvolutionProductDataType на 'Custom'.

Размер слова аккумулятора свертки и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных аккумулятора свертки, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных аккумулятора свертки задан как пользовательский числовой тип через свойство CustomConvolutionAccumulatorDataType.

Для получения дополнительной информации о типе данных аккумулятора свертки этот объект использование смотрите раздел Fixed Point.

Word и дробные длины аккумулятора свертки в виде числового типа автосо знаком с размером слова 32 и дробная длина 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство ConvolutionAccumulatorDataType на 'Custom'.

Ошибочный размер слова продукта размера шага и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных ошибочного продукта размера шага, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных ошибочного продукта размера шага задан как пользовательский числовой тип через свойство CustomStepSizeErrorProductDataType.

Для получения дополнительной информации об ошибочном типе данных продукта размера шага этот объект использование смотрите раздел Fixed Point.

Word и дробные длины ошибочного продукта размера шага в виде числового типа автосо знаком с размером слова 32 и дробная длина 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство StepSizeErrorProductDataType на 'Custom'.

Word и дробные настройки длины весов фильтра обновляют продукт в виде одного из следующего:

  • 'Same as first input' – Объект указывает, что тип данных весов фильтра обновляет продукт, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных весов фильтра обновляется, продукт задан как пользовательский числовой тип через свойство CustomWeightsUpdateProductDataType.

Для получения дополнительной информации о фильтре веса обновляют тип данных продукта этот объект использование, видят раздел Fixed Point.

Word и дробные длины весов фильтра обновляют продукт в виде числового типа автосо знаком с размером слова 32 и дробной длиной 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство WeightsUpdateProductDataType на 'Custom'.

Размер слова частного и дробные настройки длины в виде одного из следующего:

  • 'Same as first input' – Объект задает тип данных частного, чтобы совпасть с тем из первого входа.

  • 'Custom' – Тип данных частного задан как пользовательский числовой тип через свойство CustomQuotientDataType.

Для получения дополнительной информации о типе данных частного этот объект использование смотрите раздел Fixed Point.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство Method на 'Normalized LMS'.

Word и дробные длины весов фильтра обновляют продукт в виде числового типа автосо знаком с размером слова 32 и дробной длиной 20.

Зависимости

Это свойство применяется, когда вы устанавливаете свойство Method на 'Normalized LMS' и свойство QuotientDataType к 'Custom'.

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

Описание

[y,err,wts] = lms(x,d) фильтрует входной сигнал, x, использование d как желаемый сигнал, и возвращает отфильтрованный выходной параметр в y, ошибка фильтра в err, и предполагаемые веса фильтра в wts. Объект фильтра LMS оценивает, что веса фильтра должны были минимизировать ошибку между выходным сигналом и желаемым сигналом.

[y,err] = lms(x,d) фильтрует входной сигнал, x, использование d как желаемый сигнал, и возвращает отфильтрованный выходной параметр в y и ошибка фильтра в err когда свойство WeightsOutput установлено в 'None'.

[___] = lms(x,d,mu) фильтрует входной сигнал, x, использование d как желаемый сигнал и mu как размер шага, когда свойство StepSizeSource установлено в 'Input port'. Эти входные параметры могут использоваться с любым из предыдущих наборов выходных параметров.

[___] = lms(x,d,a) фильтрует входной сигнал, x, использование d как желаемый сигнал и a как управление адаптацией, когда свойство AdaptInputPort установлено в true. Когда a является ненулевым, Системный объект постоянно обновляет веса фильтра. Когда a нуль, веса фильтра остаются постоянными.

[___] = lms(x,d,r) фильтрует входной сигнал, x, использование d как желаемый сигнал и r как сброс сигнализируют, когда свойство WeightsResetInputPort установлено в true. Свойство WeightsResetCondition может использоваться, чтобы установить триггерное условие сброса. Если событие сброса происходит, Системный объект сбрасывает веса фильтра к их начальным значениям.

[y,err,wts] = lms(x,d,mu,a,r) фильтрует входной сигнал, x, использование d как желаемый сигнал, mu как размер шага, a как управление адаптацией и r как сигнал сброса, и возвращает отфильтрованный выходной параметр в y, ошибка фильтра в err, и адаптированные веса фильтра в wts.

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

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

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

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

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

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

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

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

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

Фактор размера шага адаптации в виде скаляра, неотрицательного числового значения. Для сходимости нормированного метода LMS размер шага должен быть больше 0 и меньше чем 2. Тип данных входа размера шага должен совпадать с типом данных x и d. Если тип данных является фиксированной точкой, тип данных должен быть подписан.

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

Зависимости

Этот вход требуется, когда свойство StepSizeSource установлено в 'Input port'.

Типы данных: single | double | int8 | int16 | int32 | int64 | fi

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

Зависимости

Этот вход требуется, когда свойство AdaptInputPort установлено в true.

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

Сбросьте сигнал, который сбрасывает веса фильтра на основе значений свойства WeightsResetCondition.

Зависимости

Этот вход требуется, когда свойство WeightsResetInputPort установлено в true.

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

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

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

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

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

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

Типы данных: single | double | int8 | int16 | int32 | int64 | fi

Адаптивные веса фильтра, возвращенные как скаляр или вектор-столбец длины, заданы значением в Длине.

Типы данных: single | double | int8 | int16 | int32 | int64 | fi

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

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

release(obj)

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

maxstepМаксимальный размер шага для адаптивной сходимости фильтра LMS
msepredПредсказанная среднеквадратическая ошибка для адаптивного фильтра LMS
msesimПредполагаемая среднеквадратическая ошибка для адаптивных фильтров
stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

свернуть все

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

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

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

Создайте dsp.FIRFilter Система object™, который представляет неизвестную систему. Передайте сигнал, x, к КИХ-фильтру. Выход неизвестной системы является желаемым сигналом, d, который является суммой выхода неизвестной системы (КИХ-фильтр) и аддитивный шумовой сигнал, n.

num = fir1(31,0.5);
fir = dsp.FIRFilter('Numerator',num);  
iir = dsp.IIRFilter('Numerator',sqrt(0.75),...
        'Denominator',[1 -0.5]);
x = iir(sign(randn(2000,25))); 
n = 0.1*randn(size(x));           
d = fir(x) + n; 

Фильтр LMS

Создайте dsp.LMSFilter Системный объект, чтобы создать фильтр, который адаптируется, чтобы вывести желаемый сигнал. Установите длину адаптивного фильтра к 32 касаниям, размера шага к 0,008, и фактор децимации для анализа и симуляции к 5. Переменная simmse представляет симулированный MSE между выходом неизвестной системы, d, и выход адаптивного фильтра. Переменная mse дает соответствующее ожидаемое значение.

l = 32;
mu = 0.008;
m  = 5;

lms = dsp.LMSFilter('Length',l,'StepSize',mu);
[mmse,emse,meanW,mse,traceK] = msepred(lms,x,d,m);
[simmse,meanWsim,Wsim,traceKsim] = msesim(lms,x,d,m);

Постройте результаты MSE

Сравните значения симулированного MSE, предсказал MSE, минимальный MSE и итоговый MSE. Итоговое значение MSE дано суммой минимального MSE и избыточного MSE.

nn = m:m:size(x,1);
semilogy(nn,simmse,[0 size(x,1)],[(emse+mmse)...
    (emse+mmse)],nn,mse,[0 size(x,1)],[mmse mmse])
title('Mean Squared Error Performance')
axis([0 size(x,1) 0.001 10])
legend('MSE (Sim.)','Final MSE','MSE','Min. MSE')
xlabel('Time Index')
ylabel('Squared Error Value')

Предсказанный MSE следует за той же траекторией как симулированный MSE. Обе этих траектории сходятся с установившимся (итоговым) MSE.

Постройте содействующие траектории

meanWsim среднее значение симулированных коэффициентов, данных msesim. meanW среднее значение предсказанных коэффициентов, данных msepred.

Сравните симулированные и предсказанные средние значения коэффициентов фильтра LMS 12,13,14, и 15.

plot(nn,meanWsim(:,12),'b',nn,meanW(:,12),'r',nn,...
meanWsim(:,13:15),'b',nn,meanW(:,13:15),'r')
PlotTitle ={'Average Coefficient Trajectories for';...
            'W(12), W(13), W(14), and W(15)'}
PlotTitle = 2x1 cell
    {'Average Coefficient Trajectories for'}
    {'W(12), W(13), W(14), and W(15)'      }

title(PlotTitle)
legend('Simulation','Theory')
xlabel('Time Index')
ylabel('Coefficient Value')

В устойчивом состоянии оба сходятся траектории.

Сумма содействующих ошибок в квадрате

Сравните сумму содействующих ошибок в квадрате, данных msepred и msesim. Эти значения даны трассировкой содействующей ковариационной матрицы.

semilogy(nn,traceKsim,nn,traceK,'r')
title('Sum-of-Squared Coefficient Errors')
axis([0 size(x,1) 0.0001 1])
legend('Simulation','Theory')
xlabel('Time Index')
ylabel('Squared Error Value')

maxstep функция вычисляет максимальный размер шага адаптивного фильтра. Этот размер шага сохраняет стабильность фильтра в максимальной возможной быстроте сходимости. Создайте сигнал первичного входного параметра, x, путем передачи случайного сигнала со знаком БИХ-фильтру. x сигнала содержит 50 систем координат 2 000 выборок каждая система координат. Создайте фильтр LMS с 32 касаниями и размером шага 0,1.

x = zeros(2000,50);
IIRFilter = dsp.IIRFilter('Numerator',sqrt(0.75),'Denominator',[1 -0.5]);
for k = 1:size(x,2)   
  x(:,k) = IIRFilter(sign(randn(size(x,1),1))); 
end
mu = 0.1;     
LMSFilter = dsp.LMSFilter('Length',32,'StepSize',mu);

Вычислите максимальный размер шага адаптации и максимальный размер шага в среднеквадратическом смысле с помощью maxstep функция.

[mumax,mumaxmse] = maxstep(LMSFilter,x)
mumax = 0.0625
mumaxmse = 0.0536

Система идентификации является процессом идентификации коэффициентов неизвестной системы с помощью адаптивного фильтра. Общий обзор процесса, как показывают, в System Identification – Используя Адаптивный Фильтр Идентифицирует Неизвестную Систему. Основные включенные компоненты:

  • Адаптивный алгоритм фильтра. В этом примере, набор Method свойство dsp.LMSFilter к 'LMS' выбрать адаптивный алгоритм фильтра LMS.

  • Неизвестная система или процесс, чтобы адаптироваться к. В этом примере фильтр спроектирован fircband неизвестная система.

  • Соответствующие входные данные, чтобы осуществить процесс адаптации. Для типовой модели LMS это желаемый сигнал d(k) и входной сигнал x(k).

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

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

Неизвестная система

Создайте dsp.FIRFilter объект, который представляет систему, которая будет идентифицирована. Используйте fircband функционируйте, чтобы спроектировать коэффициенты фильтра. Спроектированный фильтр является фильтром lowpass, ограниченным к 0,2 пульсациям в полосе задерживания.

filt = dsp.FIRFilter;
filt.Numerator = fircband(12,[0 0.4 0.5 1],[1 1 0 0],[1 0.2],... 
{'w' 'c'});

Передайте x сигнала к КИХ-фильтру. Желаемый d сигнала сумма выхода неизвестной системы (КИХ-фильтр), и аддитивный шум сигнализируют о n.

x = 0.1*randn(250,1);
n = 0.01*randn(250,1);
d = filt(x) + n;

Адаптивный фильтр

С неизвестным спроектированным фильтром и желаемый сигнал на месте, создайте и примените адаптивный объект фильтра LMS, чтобы идентифицировать неизвестный фильтр.

Подготовка адаптивного объекта фильтра требует начальных значений для оценок коэффициентов фильтра и размера шага LMS (mu). Можно начать с некоторого набора ненулевых значений как оценки для коэффициентов фильтра. Этот пример использует нули для 13 начальных весов фильтра. Установите InitialConditions свойство dsp.LMSFilter к желаемым начальным значениям весов фильтра. Для размера шага, 0.8 хороший компромисс между тем, чтобы быть достаточно большим, чтобы сходиться хорошо в 250 итерациях (250 входных точек выборки) и достаточно маленький, чтобы создать точную оценку неизвестного фильтра.

Создайте dsp.LMSFilter объект представлять адаптивный фильтр, который использует адаптивный алгоритм LMS. Установите длину адаптивного фильтра к 13 касаниям и размера шага к 0,8.

mu = 0.8;
lms = dsp.LMSFilter(13,'StepSize',mu)
lms = 
  dsp.LMSFilter with properties:

                   Method: 'LMS'
                   Length: 13
           StepSizeSource: 'Property'
                 StepSize: 0.8000
            LeakageFactor: 1
        InitialConditions: 0
           AdaptInputPort: false
    WeightsResetInputPort: false
            WeightsOutput: 'Last'

  Show all properties

Передайте сигнал первичного входного параметра x и желаемый d сигнала к фильтру LMS. Запустите адаптивный фильтр, чтобы определить неизвестную систему. Выход y из адаптивного фильтра сигнал, сходившийся к желаемому сигналу d, таким образом, минимизирующему ошибку e между двумя сигналами.

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

[y,e,w] = lms(x,d);
plot(1:250, [d,y,e])
title('System Identification of an FIR filter')
legend('Desired','Output','Error')
xlabel('Time index')
ylabel('Signal value')

Сравните веса

Вектор весов w представляет коэффициенты фильтра LMS, который адаптируется, чтобы напомнить неизвестную систему (КИХ-фильтр). Чтобы подтвердить сходимость, сравните числитель КИХ-фильтра и предполагаемые веса адаптивного фильтра.

Предполагаемые веса фильтра тесно не совпадают с фактическими весами фильтра, подтверждая результаты, замеченные в предыдущем графике сигнала.

stem([(filt.Numerator).' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual filter weights','Estimated filter weights',...
       'Location','NorthEast')

Изменение размера шага

Как эксперимент, измените размер шага в 0,2. Повторение примера с mu = 0.2 результаты в следующей диаграмме стебель-листья. Фильтры не сходятся, и предполагаемые веса не являются хорошим approxmations фактического веса.

mu = 0.2;
lms = dsp.LMSFilter(13,'StepSize',mu);
[~,~,w] = lms(x,d);
stem([(filt.Numerator).' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual filter weights','Estimated filter weights',...
       'Location','NorthEast')

Увеличьте число выборок данных

Увеличьте формат кадра желаемого сигнала. Даже при том, что это увеличивает включенный расчет, LMS-алгоритм теперь имеет больше данных, которые могут использоваться для адаптации. С 1 000 выборок данных сигнала и размером шага 0,2, коэффициенты выравниваются ближе, чем прежде, указывая на улучшенную сходимость.

release(filt);
x = 0.1*randn(1000,1);
n = 0.01*randn(1000,1);
d = filt(x) + n;
[y,e,w] = lms(x,d);
stem([(filt.Numerator).' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual filter weights','Estimated filter weights',...
       'Location','NorthEast')

Увеличьте число выборок данных далее путем введения данных через итерации. Запустите алгоритм на 4 000 выборок данных, переданных LMS-алгоритму в пакетах 1 000 выборок более чем 4 итерации.

Сравните веса фильтра. Веса фильтра LMS совпадают с весами КИХ-фильтра очень тесно, указывая на хорошую сходимость.

release(filt);
n = 0.01*randn(1000,1);
for index = 1:4
  x = 0.1*randn(1000,1);
  d = filt(x) + n;
  [y,e,w] = lms(x,d);
end
stem([(filt.Numerator).' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual filter weights','Estimated filter weights',...
       'Location','NorthEast')

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

plot(1:1000, [d,y,e])
title('System Identification of an FIR filter')
legend('Desired','Output','Error')
xlabel('Time index')
ylabel('Signal value')

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

Для примера с помощью подхода LMS смотрите System Identification КИХ-Фильтра Используя LMS-алгоритм.

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

Неизвестная система

Создайте dsp.FIRFilter объект, который представляет систему, которая будет идентифицирована. Используйте fircband функционируйте, чтобы спроектировать коэффициенты фильтра. Спроектированный фильтр является фильтром lowpass, ограниченным к 0,2 пульсациям в полосе задерживания.

filt = dsp.FIRFilter;
filt.Numerator = fircband(12,[0 0.4 0.5 1],[1 1 0 0],[1 0.2],... 
{'w' 'c'});

Передайте x сигнала к КИХ-фильтру. Желаемый d сигнала сумма выхода неизвестной системы (КИХ-фильтр), и аддитивный шум сигнализируют о n.

x = 0.1*randn(1000,1);
n = 0.001*randn(1000,1);
d = filt(x) + n;

Адаптивный фильтр

Чтобы использовать нормированное изменение LMS-алгоритма, установите Method свойство на dsp.LMSFilter к 'Normalized LMS'. Установите длину адаптивного фильтра к 13 касаниям и размера шага к 0,2.

mu = 0.2;
lms = dsp.LMSFilter(13,'StepSize',mu,'Method',...
   'Normalized LMS');

Передайте сигнал первичного входного параметра x и желаемый d сигнала к фильтру LMS.

[y,e,w] = lms(x,d);

Выход y из адаптивного фильтра сигнал, сходившийся к желаемому сигналу d, таким образом, минимизирующему ошибку e между двумя сигналами.

plot(1:1000, [d,y,e])
title('System Identification by Normalized LMS Algorithm')
legend('Desired','Output','Error')
xlabel('Time index')
ylabel('Signal value')

Сравните адаптированный фильтр с неизвестной системой

Вектор весов w представляет коэффициенты фильтра LMS, который адаптируется, чтобы напомнить неизвестную систему (КИХ-фильтр). Чтобы подтвердить сходимость, сравните числитель КИХ-фильтра и предполагаемые веса адаптивного фильтра.

stem([(filt.Numerator).' w])
title('System Identification by Normalized LMS Algorithm')
legend('Actual filter weights','Estimated filter weights',...
       'Location','NorthEast')

Адаптивный фильтр адаптирует свои коэффициенты фильтра, чтобы совпадать с коэффициентами неизвестной системы. Цель состоит в том, чтобы минимизировать сигнал ошибки между выходом неизвестной системы и выходом адаптивного фильтра. Когда эти два выходных параметров сходятся и соответствуют тесно для того же входа, коэффициенты, как говорят, соответствуют тесно. Адаптивный фильтр в этом состоянии напоминает неизвестную систему. Этот пример сравнивает уровень, на котором эта сходимость происходит для нормированного LMS (NLMS) алгоритм и LMS-алгоритм без нормализации.

Неизвестная система

Создайте dsp.FIRFilter это представляет неизвестную систему. Передайте x сигнала как вход к неизвестной системе. Желаемый d сигнала сумма выхода неизвестной системы (КИХ-фильтр), и аддитивный шум сигнализируют о n.

filt = dsp.FIRFilter;
filt.Numerator = fircband(12,[0 0.4 0.5 1],[1 1 0 0],[1 0.2],... 
{'w' 'c'});
x = 0.1*randn(1000,1);
n = 0.001*randn(1000,1);
d = filt(x) + n;

Адаптивный фильтр

Создайте два dsp.LMSFilter объекты, с одним набором к LMS-алгоритму и другим набором к нормированному LMS-алгоритму. Выберите размер шага адаптации 0,2 и установите длину адаптивного фильтра к 13 касаниям.

mu = 0.2;
lms_nonnormalized = dsp.LMSFilter(13,'StepSize',mu,...
    'Method','LMS');
lms_normalized = dsp.LMSFilter(13,'StepSize',mu,...
    'Method','Normalized LMS');

Передайте сигнал первичного входного параметра x и желаемый d сигнала обоим изменения LMS-алгоритма. Переменные e1 и e2 представляйте ошибку между желаемым сигналом и выходом нормированных и ненормированных фильтров, respecitvely.

[~,e1,~] = lms_normalized(x,d);
[~,e2,~] = lms_nonnormalized(x,d);

Постройте сигналы ошибки для обоих изменений. Сигнал ошибки для варианта NLMS сходится, чтобы обнулить намного быстрее, чем сигнал ошибки для варианта LMS. Нормированная версия адаптируется в гораздо меньшем количестве итераций к результату, почти столь же хорошему как ненормированная версия.

plot([e1,e2]);
title('Comparing the LMS and NLMS Conversion Performance');
legend('NLMS derived filter weights', ...
       'LMS derived filter weights','Location', 'NorthEast');
xlabel('Time index')
ylabel('Signal value')

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

Неизвестная система и фильтр LMS обрабатывают тот же входной сигнал, x, и произведите выходные параметры d и y, соответственно. Если коэффициенты адаптивного фильтра совпадают с коэффициентами неизвестной системы, ошибки, e, в действительности представляет аддитивный шум.

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

Создайте dsp.FIRFilter Системный объект, чтобы представлять неизвестную систему. Создайте dsp.LMSFilter объект и набор длина к 11 касаниям и размер шага к 0,05. Создайте синусоиду, чтобы представлять шум, добавленный к неизвестной системе. Просмотрите сигналы в осциллографе времени.

FrameSize = 100;
NIter = 10;
lmsfilt2 = dsp.LMSFilter('Length',11,'Method','Normalized LMS', ...
    'StepSize',0.05);
firfilt2 = dsp.FIRFilter('Numerator', fir1(10,[.5, .75]));
sinewave = dsp.SineWave('Frequency',0.01, ...
    'SampleRate',1,'SamplesPerFrame',FrameSize);
scope = timescope('TimeUnits','Seconds',...
    'YLimits',[-3 3],'BufferLength',2*FrameSize*NIter, ...
    'ShowLegend',true,'ChannelNames', ...
    {'Noisy signal', 'Error signal'});

Создайте случайный входной сигнал, x и передайте сигнал КИХ-фильтру. Добавьте синусоиду в выход КИХ-фильтра, чтобы сгенерировать сигнал с шумом, d. Сигналом, d является выход неизвестной системы. Передайте сигнал с шумом и сигнал первичного входного параметра к фильтру LMS. Просмотрите сигнал с шумом и сигнал ошибки в осциллографе времени.

for k = 1:NIter
    x = randn(FrameSize,1);
    d = firfilt2(x) + sinewave();
    [y,e,w] = lmsfilt2(x,d);
    scope([d,e])
end
release(scope)

Сигнал ошибки, e, синусоидальный шум, добавленный к неизвестной системе. Минимизация сигнала ошибки минимизирует шум, добавленный к системе.

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

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

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

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

В векторной форме LMS-алгоритм данных знака:

w(k+1)=w(k)+μe(k)sgn(x(k)),

где

sgn(x(k))={1,x(k)>00,x(k)=0-1,x(k)<0

с вектором w содержание весов применилось к коэффициентам фильтра и вектору x содержа входные данные. Вектор e ошибка между желаемым сигналом и отфильтрованным сигналом. Цель алгоритма SDLMS состоит в том, чтобы минимизировать эту ошибку. Размер шага представлен μ.

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

0<μ<1N{InputSignalPower},

где N количество выборок в сигнале. Кроме того, задайте μ как степень двойки для эффективного вычисления.

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

Серия больших входных значений, вместе с процессом квантования может привести к ошибке при росте вне всех границ. Ограничьте тенденцию алгоритма данных знака выйти из-под контроля путем выбора размера небольшого шага (μ1) и устанавливание начальных условий для алгоритма к ненулевым положительным и отрицательным величинам.

В этом примере подавления помех, набор Method свойство dsp.LMSFilter к 'Sign-Data LMS'. Этот пример требует двух наборов входных данных:

Для сигнала используйте синусоиду. Обратите внимание на то, что signal вектор-столбец 1 000 элементов.

signal = sin(2*pi*0.055*(0:1000-1)');

Теперь добавьте коррелируемый белый шум в signal. Чтобы гарантировать, что шум коррелируется, передайте шум через КИХ lowpass, фильтруют и затем добавляют отфильтрованный шум в сигнал.

noise = randn(1000,1);
filt = dsp.FIRFilter;
filt.Numerator = fir1(11,0.4);
fnoise = filt(noise);
d = signal + fnoise;

fnoise коррелированый шум и d теперь желаемый вход к алгоритму данных знака.

Подготовить dsp.LMSFilter объект для обработки, установленный начальные условия весов фильтра и mu Неродной размер). Как отмечено ранее в этом разделе, значения вы устанавливаете для coeffs и mu определите, может ли адаптивный фильтр удалить шум из пути прохождения сигнала.

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

В данном примере начните с коэффициентов, используемых в шумовом фильтре (filt.Numerator), и измените их немного, таким образом, алгоритм должен адаптироваться.

coeffs = (filt.Numerator).'-0.01; % Set the filter initial conditions.
mu = 0.05; % Set the step size for algorithm updating.

С необходимыми входными параметрами для dsp.LMSFilter подготовленный, создайте объект фильтра LMS, запустите адаптацию и просмотрите результаты.

lms = dsp.LMSFilter(12,'Method','Sign-Data LMS',...
   'StepSize',mu,'InitialConditions',coeffs);
[~,e] = lms(noise,d);
L = 200;
plot(0:L-1,signal(1:L),0:L-1,e(1:L));
title('Noise Cancellation by the Sign-Data Algorithm');
legend('Actual signal','Result of noise cancellation',...
       'Location','NorthEast');
xlabel('Time index')
ylabel('Signal values')

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

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

Изменение начальных условий веса (InitialConditions) и mu Неродной размер), или даже lowpass фильтрует вас, раньше создавал коррелированый шум, может заставить подавление помех перестать работать.

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

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

В векторной форме LMS-алгоритм ошибки знака:

w(k+1)=w(k)+μsgn(e(k))(x(k)),

где

sgn(e(k))={1,e(k)>00,e(k)=0-1,e(k)<0

с вектором w содержание весов применилось к коэффициентам фильтра и вектору x содержа входные данные. Вектор e ошибка между желаемым сигналом и отфильтрованным сигналом. Цель алгоритма SELMS состоит в том, чтобы минимизировать эту ошибку.

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

0<μ<1N{InputSignalPower}

где N количество выборок в сигнале. Кроме того, задайте μ как степень двойки для эффективного расчета.

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

Серия больших ошибочных значений, вместе с процессом квантования может привести к ошибке при росте вне всех границ. Ограничьте тенденцию алгоритма ошибки знака стать нестабильными путем выбора размера небольшого шага (μ1) и устанавливание начальных условий для алгоритма к ненулевым положительным и отрицательным величинам.

В этом примере подавления помех, набор Method свойство dsp.LMSFilter к 'Sign-Error LMS'. Этот пример требует двух наборов входных данных:

Для сигнала используйте синусоиду. Обратите внимание на то, что signal вектор-столбец 1 000 элементов.

signal = sin(2*pi*0.055*(0:1000-1)');

Теперь добавьте коррелируемый белый шум в signal. Чтобы гарантировать, что шум коррелируется, передайте шум через КИХ lowpass, фильтруют и затем добавляют отфильтрованный шум в сигнал.

noise = randn(1000,1);
filt = dsp.FIRFilter;
filt.Numerator = fir1(11,0.4);
fnoise = filt(noise);
d = signal + fnoise;

fnoise коррелированый шум и d теперь желаемый вход к алгоритму ошибки знака.

Подготовить dsp.LMSFilter объект для обработки, установленный начальные условия весов фильтра (InitialConditions) и mu Неродной размер). Как отмечено ранее в этом разделе, значения вы устанавливаете для coeffs и mu определите, может ли адаптивный фильтр удалить шум из пути прохождения сигнала.

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

В данном примере начните с коэффициентов, используемых в шумовом фильтре (filt.Numerator) и измените их немного, таким образом, алгоритм должен адаптироваться.

coeffs = (filt.Numerator).'-0.01; % Set the filter initial conditions.
mu = 0.05; % Set the step size for algorithm updating.

С необходимыми входными параметрами для dsp.LMSFilter подготовленный, запустите адаптацию и просмотрите результаты.

lms = dsp.LMSFilter(12,'Method','Sign-Error LMS',...
   'StepSize',mu,'InitialConditions',coeffs);
[~,e] = lms(noise,d);
L = 200;
plot(0:199,signal(1:200),0:199,e(1:200));
title('Noise cancellation performance by the sign-error LMS algorithm');
legend('Actual signal','Error after noise reduction',...
       'Location','NorthEast')
xlabel('Time index')
ylabel('Signal value')

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

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

Изменение начальных условий веса (InitialConditions) и mu Неродной размер), или даже lowpass фильтрует вас, раньше создавал коррелированый шум, может заставить подавление помех перестать работать и алгоритм, чтобы стать бесполезным.

LMS-алгоритм знака знака (SSLMS) заменяет вычисление среднеквадратичной погрешности при помощи знака входных данных изменить коэффициенты фильтра. Когда ошибка положительна, новые коэффициенты являются предыдущими коэффициентами плюс ошибка, умноженная на размер шага μ. Если ошибка отрицательна, новые коэффициенты являются предыдущими коэффициентами минус ошибка, умноженная на μ — обратите внимание на изменения знака. Когда вход является нулем, новые коэффициенты совпадают с предыдущим набором.

В сущности алгоритм квантует и ошибку и вход путем применения оператора знака к ним.

В векторной форме LMS-алгоритм знака знака:

w(k+1)=w(k)+μsgn(e(k))sgn(x(k)),

где

sgn(z(k))={1,z(k)>00,z(k)=0-1,z(k)<0

z(k)=e(k)sgn(x(k))

Вектор w содержит веса, применился к коэффициентам фильтра и вектору x содержит входные данные. Вектор e ошибка между желаемым сигналом и отфильтрованным сигналом. Цель алгоритма SSLMS состоит в том, чтобы минимизировать эту ошибку.

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

0<μ<1N{InputSignalPower}

где N количество выборок в сигнале. Кроме того, задайте μ как степень двойки для эффективного расчета

Примечание:

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

Серия больших ошибочных значений, вместе с процессом квантования может привести к ошибке при росте вне всех границ. Ограничьте тенденцию алгоритма знака знака стать нестабильными путем выбора размера небольшого шага (μ1) и устанавливание начальных условий для алгоритма к ненулевым положительным и отрицательным величинам.

В этом примере подавления помех, набор Method свойство dsp.LMSFilter к 'Sign-Sign LMS'. Этот пример требует двух наборов входных данных:

Для сигнала используйте синусоиду. Обратите внимание на то, что signal вектор-столбец 1 000 элементов.

signal = sin(2*pi*0.055*(0:1000-1)');

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

noise = randn(1000,1);
filt = dsp.FIRFilter;
filt.Numerator = fir1(11,0.4);
fnoise = filt(noise);
d = signal + fnoise;

fnoise коррелированый шум и d теперь желаемый вход к алгоритму знака знака.

Подготовить dsp.LMSFilter объект для обработки, установленный начальные условия весов фильтра (InitialConditions) и mu Неродной размер). Как отмечено ранее в этом разделе, значения вы устанавливаете для coeffs и mu определите, может ли адаптивный фильтр удалить шум из пути прохождения сигнала. В System Identification КИХ-Фильтра Используя LMS-алгоритм вы создали фильтр по умолчанию, который устанавливает коэффициенты фильтра на нули. Обычно тот подход не работает на алгоритм знака знака.

Чем ближе вы устанавливаете свои начальные коэффициенты фильтра на ожидаемые значения, тем более вероятно случается так, что алгоритм остается хорошего поведения и сходится к решению для фильтра, которое удаляет шум эффективно. В данном примере вы начинаете с коэффициентов, используемых в шумовом фильтре (filt.Numerator), и измените их немного, таким образом, алгоритм должен адаптироваться.

coeffs = (filt.Numerator).' -0.01; % Set the filter initial conditions.
mu = 0.05;

С необходимыми входными параметрами для dsp.LMSFilter подготовленный, запустите адаптацию и просмотрите результаты.

lms = dsp.LMSFilter(12,'Method','Sign-Sign LMS',...
   'StepSize',mu,'InitialConditions',coeffs);
[~,e] = lms(noise,d);
L = 200;
plot(0:199,signal(1:200),0:199,e(1:200));
title('Noise cancellation performance by the sign-sign LMS algorithm');
legend('Actual signal','Error after noise reduction',...
       'Location','NorthEast')
xlabel('Time index')
ylabel('Signal value')

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

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

Изменение начальных условий веса (InitialConditions) и mu (StepSize), или даже lowpass фильтрует вас, раньше создавал коррелированый шум, может заставить подавление помех перестать работать и алгоритм, чтобы стать бесполезным.

Примечание: Этот пример запускается только в R2017a или позже. Если вы используете релиз ранее, чем R2017a, объект не выводит полную историю выборки выборкой весов фильтра. Если вы используете релиз ранее, чем R2016b, заменяете каждый вызов функции с эквивалентным step синтаксис. Например, myObject(x) становится step(myObject,x).

Инициализируйте dsp.LMSFilter Системный объект и набор WeightsOutput свойство к 'All'. Эта установка позволяет фильтру LMS вывести матрицу весов с размерностями [FrameLength Length], соответствие полной истории выборки выборкой весов для всего FrameLength выборки входных значений.

FrameSize = 15000;
lmsfilt3 = dsp.LMSFilter('Length',63,'Method','LMS', ...
    'StepSize',0.001,'LeakageFactor',0.99999, ...
    'WeightsOutput','All'); % full Weights history

w_actual = fir1(64,[0.5 0.75]);
firfilt3 = dsp.FIRFilter('Numerator',w_actual);
sinewave = dsp.SineWave('Frequency',0.01, ...
    'SampleRate',1,'SamplesPerFrame',FrameSize);

scope = timescope('TimeUnits','Seconds', ...
    'YLimits',[-0.25 0.75],'BufferLength',2*FrameSize, ...
    'ShowLegend',true,'ChannelNames', ...
    {'Coeff 33 Estimate','Coeff 34 Estimate','Coeff 35 Estimate', ...
    'Coeff 33 Actual','Coeff 34 Actual','Coeff 35 Actual'});

Запустите одну систему координат и выведите полную адаптивную историю весов, w.

x = randn(FrameSize,1);       % Input signal
d = firfilt3(x) + sinewave(); % Noise + Signal
[~,~,w] = lmsfilt3(x,d);

Каждая строка в w набор весов, оцененных для соответствующей входной выборки. Каждый столбец в w дает полную историю определенного веса. Постройте фактический вес и целую историю 33-го, 34-го, и 35-го веса. В графике вы видите, что предполагаемый вес, выход в конечном счете сходится с фактическим весом как адаптивный фильтр, получает входные выборки и продолжает адаптироваться.

idxBeg = 33;
idxEnd = 35;
scope([w(:,idxBeg:idxEnd), repmat(w_actual(idxBeg:idxEnd),FrameSize,1)])

Алгоритмы

Алгоритм фильтра LMS задан следующими уравнениями.

y(n)=wT(n1)u(n)e(n)=d(n)y(n)w(n)=αw(n1)+f(u(n),e(n),μ)

Различные адаптивные алгоритмы фильтра LMS, доступные в этом Системном объекте, заданы как:

  • LMS – Решает уравнение Вайнера-Гопфа и находит коэффициенты фильтра для адаптивного фильтра.

    f(u(n),e(n),μ)=μe(n)u*(n)

  • Нормированный LMS – Нормированное изменение LMS-алгоритма.

    f(u(n),e(n),μ)=μe(n)u(n)ε+uH(n)u(n)

    В Нормированном LMS, чтобы преодолеть потенциальную числовую нестабильность в обновлении весов, маленькая положительная константа, ε, была добавлена в знаменателе. Для входа с плавающей точкой с двойной точностью ε является 2.2204460492503131e-016. Для входа с плавающей точкой с одинарной точностью ε является 1.192092896e-07. Для входа фиксированной точки ε 0.

  • Sign-Data LMS – Коррекция к весам фильтра в каждой итерации зависит от знака входа u (n).

    f(u(n),e(n),μ)=μe(n)знак(u(n))

    где u (n) действителен.

  • Sign-Error LMS – Коррекция применилась к текущим весам фильтра за каждую последовательную итерацию, зависит от знака ошибки, e (n).

    f(u(n),e(n),μ)=μзнак(e(n))u*(n)

  • Sign-Sign LMS – Коррекция применилась к текущим весам фильтра за каждую последовательную итерацию, зависит и от знака u (n) и от знака e (n).

    f(u(n),e(n),μ)=μзнак(e(n))знак(u(n))

    где u (n) действителен.

Переменные следующие:

ПеременнаяОписание

n

Индекс текущего времени

u (n)

Вектор из буферизированных входных выборок на шаге n

u* (n)

Сопряженное комплексное число вектора из буферизированных входных выборок на шаге n

w (n)

Вектор из веса фильтра оценивает на шаге n

y(n)

Отфильтрованный выход на шаге n

e(n)

Ошибка расчета на шаге n

d(n)

Желаемый ответ на шаге n

µ

Размер шага адаптации

α

Фактор утечки (0 <α ≤ 1)

ε

Константа, которая корректирует любую потенциальную числовую нестабильность, которая происходит во время обновления весов.

Ссылки

[1] Hayes, M.H. Статистическая цифровая обработка сигналов и моделирование. Нью-Йорк: John Wiley & Sons, 1996.

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

Представленный в R2012a