dsp.LMSFilter

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

Описание

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

  • LMS

  • Нормированная LMS

  • Sign-Data LMS

  • Sign-Error LMS

  • Sign-Sign LMS

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

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

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

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

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

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

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

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

Создание

Описание

пример

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

пример

lms = dsp.LMSFilter(L) возвращает объект фильтра LMS с набором свойств Length в 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 предоставляется алгоритму объекта.

Зависимости

Это свойство применяется, когда вы задаете значение свойства WeightsResetInportPort true.

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

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

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

  • 'None' - Этот параметр отключает выход весов.

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

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

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

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

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

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

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

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

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

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

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

Пример: численный тип ([], 32)

Зависимости

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

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

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

  • 'Custom' - Тип данных коэффициента утечки задается как пользовательский числовой тип с помощью свойства CustomLeakageFactorDataType.

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

Длина слова и дроби коэффициента утечки, заданная как автоматический числовой тип с размером слова 16 и длиной дроби 15.

Пример: численный тип ([], 32)

Зависимости

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

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

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

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

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

Длина слова и дроби весов фильтра, заданная как автоматический числовой тип с размером слова 16 и длиной дроби 15.

Пример: численный тип ([], 32,20)

Зависимости

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

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

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

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

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

Зависимости

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

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

Зависимости

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

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

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

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

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

Зависимости

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

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

Зависимости

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

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

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

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

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

Длина слова и дроби продукта свертки, заданная как автоматический числовой тип с размером слова 32 и длиной дроби 20.

Зависимости

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

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

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

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

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

Длина слова и дроби аккумулятора свертки, заданная как автоматический числовой тип с размером слова 32 и длиной дроби 20.

Зависимости

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

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

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

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

Зависимости

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

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

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

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

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

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

Зависимости

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

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

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

  • 'Custom' - Частный тип данных задается как пользовательский числовой тип с помощью свойства CustomQuotientDataType.

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

Зависимости

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

Длины слова и дроби весов фильтра обновляют продукт, заданный как автоматический числовой тип с размером слова 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 как управление адаптацией, когда для свойства AdaptInportPort задано значение true. Когда a является ненулевым, системный объект постоянно обновляет веса фильтров. Когда a равен нулю, веса фильтров остаются постоянными.

[___] = lms(x,d,r) фильтрует входной сигнал, x, использование d как необходимый сигнал и r как сигнал сброса, когда для свойства WeightsResetInportPort задано значение 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

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

Зависимости

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

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

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

Зависимости

Этот вход требуется, когда для свойства WeightsResetInportPort задано значение 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

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

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

Figure contains an axes. The axes with title Mean Squared Error Performance contains 4 objects of type line. These objects represent MSE (Sim.), Final MSE, MSE, Min. MSE.

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

Постройте график траекторий коэффициентов

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

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

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

Figure contains an axes. The axes with title Average Coefficient Trajectories for W(12), W(13), W(14), and W(15) contains 8 objects of type line. These objects represent Simulation, Theory.

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

Сумма квадратов ошибок коэффициента

Сравните сумму квадратов ошибок коэффициента, заданную как 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')

Figure contains an axes. The axes with title Sum-of-Squared Coefficient Errors contains 2 objects of type line. These objects represent Simulation, Theory.

The maxstep функция вычисляет максимальный размер шага адаптивного фильтра. Этот размер шага сохраняет фильтр стабильным на максимально возможной скорости сходимости. Создайте основной входной сигнал, x, путем передачи подписанного случайного сигнала в БИХ. Сигнальное x содержит 50 системы координат по 2000 выборок каждой системы координат. Создайте фильтр 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

Система идентификации является процессом идентификации коэффициентов неизвестной системы с помощью адаптивного фильтра. Общий обзор процесса показан на Систему идентификации - Использование адаптивного фильтра для идентификации неизвестной системы. Основными компонентами являются:

  • Алгоритм адаптивного фильтра. В этом примере установите 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')

Figure contains an axes. The axes with title System Identification of an FIR filter contains 3 objects of type line. These objects represent Desired, Output, Error.

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

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

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

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

Figure contains an axes. The axes with title System Identification by Adaptive LMS Algorithm contains 2 objects of type stem. These objects represent Actual filter weights, Estimated filter weights.

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

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

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

Figure contains an axes. The axes with title System Identification by Adaptive LMS Algorithm contains 2 objects of type stem. These objects represent Actual filter weights, Estimated filter weights.

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

Увеличьте формат кадра необходимого сигнала. Несмотря на то, что это увеличивает расчет участия, LMS-алгоритм теперь имеет больше данных, которые могут использоваться для адаптации. При 1000 выборках данных сигнала и размере шага 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')

Figure contains an axes. The axes with title System Identification by Adaptive LMS Algorithm contains 2 objects of type stem. These objects represent Actual filter weights, Estimated filter weights.

Увеличьте количество выборок данных дополнительно путем ввода данных через итерации. Запустите алгоритм на 4000 выборках данных, переданных в LMS-алгоритм пакетами 1000 выборки в 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')

Figure contains an axes. The axes with title System Identification by Adaptive LMS Algorithm contains 2 objects of type stem. These objects represent Actual filter weights, Estimated filter weights.

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

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

Figure contains an axes. The axes with title System Identification of an FIR filter contains 3 objects of type line. These objects represent Desired, Output, Error.

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

Для получения примера, использующей подход LMS, смотрите Систему идентификации конечной импульсной характеристики Filter Using 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')

Figure contains an axes. The axes with title System Identification by Normalized LMS Algorithm contains 3 objects of type line. These objects represent Desired, Output, Error.

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

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

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

Figure contains an axes. The axes with title System Identification by Normalized LMS Algorithm contains 2 objects of type stem. These objects represent Actual filter weights, Estimated filter weights.

Адаптивный фильтр адаптирует свои коэффициенты фильтра так, чтобы они совпадали с коэффициентами неизвестной системы. Цель состоит в том, чтобы минимизировать сигнал ошибки между выходом неизвестной системы и выходом адаптивного фильтра. Когда эти два выхода сходятся и тесно совпадают для одного и того же входа, говорят, что коэффициенты тесно совпадают. Адаптивный фильтр в этом состоянии напоминает неизвестную систему. Этот пример сравнивает скорость, с которой это сходимость происходит для нормализованного алгоритма 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 представляют ошибку между желаемым сигналом и выходом нормализованных и неормализированных фильтров, соответственно.

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

Figure contains an axes. The axes with title Comparing the LMS and NLMS Conversion Performance contains 2 objects of type line. These objects represent NLMS derived filter weights, LMS derived filter weights.

Отмените аддитивный шум 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, - синусоидальный шум, добавленный к неизвестной системе. Минимизация сигнала ошибки минимизирует шум, добавляемый в систему.

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

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

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

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

В векторной форме 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 - количество выборок в сигнале. Кроме того, задайте μ как степень двойки для эффективных вычислений.

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

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

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

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

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 теперь является желаемым входом в алгоритм sign-data.

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

В Система Идентификации of FIR Filter Using LMS Algorithm вы создали фильтр по умолчанию, который устанавливает коэффициенты фильтра в нули. В большинстве случаев этот подход не работает для алгоритма sign-data. Чем ближе вы устанавливаете свои начальные коэффициенты фильтра к ожидаемым значениям, тем больше вероятность, что алгоритм остается хорошо поведенным и сходится к решению фильтра, которое эффективно удаляет шум.

В данном примере начнем с коэффициентов, используемых в шумовом фильтре (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')

Figure contains an axes. The axes with title Noise Cancellation by the Sign-Data Algorithm contains 2 objects of type line. These objects represent Actual signal, Result of noise cancellation.

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

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

Изменение начальных условий веса (InitialConditions) и mu (StepSize), или даже фильтр 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 - количество выборок в сигнале. Кроме того, задайте μ как степень двойки для эффективного расчета.

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

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

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

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

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 теперь является желаемым входом в алгоритм sign-error.

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

В Система Идентификации of FIR Filter Using LMS Algorithm вы создали фильтр по умолчанию, который устанавливает коэффициенты фильтра в нули. В большинстве случаев этот подход не работает для алгоритма ошибки знака. Чем ближе вы устанавливаете свои начальные коэффициенты фильтра к ожидаемым значениям, тем больше вероятность, что алгоритм остается хорошо поведенным и сходится к решению фильтра, которое эффективно удаляет шум.

В данном примере начнем с коэффициентов, используемых в шумовом фильтре (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')

Figure contains an axes. The axes with title Noise cancellation performance by the sign-error LMS algorithm contains 2 objects of type line. These objects represent Actual signal, Error after noise reduction.

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

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

Изменение начальных условий веса (InitialConditions) и mu (StepSize), или даже 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 - вектор-столбец из 1000 элементов.

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 (StepSize). Как отмечалось ранее в этом разделе, значения, которые вы задаете для coeffs и mu определите, может ли адаптивный фильтр удалить шум из пути сигнала. В Система Идентификации of FIR Filter Using LMS Algorithm вы создали фильтр по умолчанию, который устанавливает коэффициенты фильтра в нули. Обычно этот подход не работает для алгоритма знака-знака.

Чем ближе вы устанавливаете свои начальные коэффициенты фильтра к ожидаемым значениям, тем больше вероятность, что алгоритм остается хорошо поведенным и сходится к решению фильтра, которое эффективно удаляет шум. В данном примере вы начинаете с коэффициентов, используемых в шумовом фильтре (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')

Figure contains an axes. The axes with title Noise cancellation performance by the sign-sign LMS algorithm contains 2 objects of type line. These objects represent Actual signal, Error after noise reduction.

Когда 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)

    В Normalized LMS, для преодоления потенциальной числовой нестабильности в обновлении весов, в знаменателе была добавлена небольшая положительная константа, Для ввода с двойной точностью с плавающей точностью, Для входных параметров с одной точностью с плавающей точностью Для входных параметров с фиксированной точкой

  • 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] Хейс, M.H. Статистическая цифровая обработка сигналов и моделирование. Нью-Йорк: John Wiley & Sons, 1996.

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

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