Что такое сглаживание и как я могу это сделать?
У меня есть массив в Matlab, который является спектром амплитуды речевого сигнала (величина 128 точек FFT). Как мне сгладить это с помощью скользящей средней? Из того, что я понимаю, я должен взять размер окна определенного количества элементов, взять среднее, и это станет новым 1-м элементом. Затем сдвиньте окно вправо на один элемент, возьмите среднее значение, которое станет вторым элементом, и так далее. Это действительно так работает? Я сам не уверен, потому что если я сделаю это, в моем конечном результате у меня будет меньше 128 элементов. Так как же это работает и как это помогает сгладить точки данных? Или есть какой-то другой способ, которым я могу сделать сглаживание данных?
РЕДАКТИРОВАТЬ: ссылка на дополнительный вопрос
источник
Ответы:
Сглаживание можно сделать разными способами, но в самых общих и общих терминах это означает, что вы выравниваете сигнал, смешивая его элементы со своими соседями. Вы немного размазываете / размываете сигнал, чтобы избавиться от шума. Например, очень простой метод сглаживания состоит в том, чтобы пересчитать каждый элемент сигнала
f(t)
до 0,8 от исходного значения плюс 0,1 от каждого из его соседей:Обратите внимание, как коэффициенты умножения, или веса, складываются в единицу. Поэтому, если сигнал довольно постоянный, сглаживание не сильно его меняет. Но если сигнал содержал внезапное резкое изменение, то вклад соседей поможет немного прояснить этот шум.
Веса, которые вы используете в этой функции пересчета, можно назвать ядром . Одномерная функция Гаусса или любое другое базовое ядро должно подойти в вашем случае.
Хороший пример одного конкретного вида сглаживания:
Вверху
: сглаженный сигнал Внизу: сглаженный сигнал
Примеры нескольких ядер:
источник
В дополнение к хорошему ответу Junuxx я хотел бы добавить несколько заметок.
Сглаживание связано с фильтрацией (к сожалению, довольно расплывчатая статья в Википедии ) - вы должны выбрать сглаживатель на основе его свойств.
Один из моих любимых - медианный фильтр . Это пример нелинейного фильтра. У него есть некоторые интересные свойства, он сохраняет «ребра» и довольно устойчив при большом шуме.
Если у вас есть модель поведения вашего сигнала, фильтр Калмана стоит посмотреть. Его сглаживание фактически является байесовской оценкой максимального правдоподобия сигнала на основе наблюдений.
источник
Сглаживание подразумевает использование информации из соседних выборок для изменения отношения между соседними выборками. Для конечных векторов на концах нет соседней информации с одной стороны. Вы можете выбрать: не сглаживать / фильтровать концы, принимать более короткий результирующий сглаженный вектор, составлять данные и сглаживать их (зависит от точности / полезности любых прогнозов на концах), или, возможно, использовать разные ядра асимметричного сглаживания в заканчивается (что приводит к сокращению информационного содержания в сигнале в любом случае).
источник
Вы можете найти весь код Matlab для сглаживания фильтра скользящей средней для различной длины отводов. www.gaussianwaves.com/2010/11/moving-average-filter-ma-filter-2/
источник
Другие упоминали, как вы делаете сглаживание, я хотел бы упомянуть почему сглаживание работает.
Если вы правильно передискретизируете свой сигнал, он будет относительно незначительно отличаться от одного семпла к другому (семпл = временные точки, пиксели и т. Д.), И ожидается, что он будет иметь общий плавный вид. Другими словами, ваш сигнал содержит несколько высоких частот, то есть компоненты сигнала, которые изменяются со скоростью, подобной вашей частоте дискретизации.
Тем не менее, измерения часто искажаются шумом. В первом приближении мы обычно считаем, что шум следует гауссову распределению со средним нулем и определенным стандартным отклонением, которое просто добавляется поверх сигнала.
Чтобы уменьшить шум в нашем сигнале, мы обычно делаем следующие четыре допущения: шум является случайным, не коррелируется между выборками, имеет среднее значение, равное нулю, и сигнал подвергается достаточной избыточной дискретизации. С этими допущениями мы можем использовать фильтр скользящего среднего.
Рассмотрим, например, три последовательных образца. Поскольку сигнал сильно избыточно дискретизирован, можно считать, что базовый сигнал изменяется линейно, что означает, что среднее значение сигнала по трем выборкам будет равно истинному сигналу в средней выборке. Напротив, шум имеет среднее значение ноль и не является коррелированным, что означает, что его среднее значение должно стремиться к нулю. Таким образом, мы можем применить фильтр скользящего среднего из трех выборок, где мы заменяем каждую выборку средним значением между собой и двумя соседними соседями.
Конечно, чем больше мы делаем окно, тем больше шум будет усредняться до нуля, но тем меньше будет наше предположение о линейности истинного сигнала. Таким образом, мы должны сделать компромисс. Один из способов получить лучшее из обоих миров - использовать средневзвешенное значение, в котором мы даем более малым весам более отдаленные выборки, чтобы мы усредняли шумовые эффекты от больших диапазонов, не слишком взвешивая истинный сигнал там, где он отклоняется от нашей линейности. предположение.
То, как вы должны определить вес, зависит от шума, сигнала и вычислительной эффективности, и, конечно, от компромисса между избавлением от шума и включением сигнала.
Обратите внимание, что за последние несколько лет была проделана большая работа, чтобы позволить нам ослабить некоторые из четырех допущений, например, путем разработки схем сглаживания с переменными окнами фильтра (анизотропная диффузия) или схем, которые на самом деле не используют окна на всех (нелокальные средства).
источник