Есть ли технический термин для этого простого метода сглаживания сигнала?

26

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

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

введите описание изображения здесь

Поэтому я применяю простую функцию к значениям, чтобы «сгладить» результат:

// pseudo-code
delta = fftValue - smoothedFftValue;
smoothedFftValue += delta * 0.2; 
// 0.2 is arbitrary - the lower the number, the more "smoothing"

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

введите описание изображения здесь

Итак, мой вопрос:

  1. Является ли это устоявшимся паттерном или функцией, для которой термин уже существует? Это так, каков термин? Я использую «сглаживание» выше, но я знаю, что это означает что-то очень специфическое в DSP и, возможно, не правильно. В остальном это могло быть связано с объемным конвертом, но не совсем то же самое.

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

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

Майкл Бромли
источник
1
Теперь мне интересно, что вы получите, если вы возьмете сглаженное БПФ и обратное БПФ.
user253751
Будет ли проще сделать первый ответ в другом порядке? current_value = current_value * decay; if (new_value> current_value) {current_value = new_value; }
Ричард Форстер
@immibis Это должно быть реверберация из моего понимания. Поправьте меня если я ошибаюсь.
Андреас
Конечно, и оптимизирующий компилятор будет производить ту же реализацию. Ключевым моментом было получить правильный результат, когда (current_value * decay) <new_value <current_value.
Ричард Форстер
2
Мне очень нравится этот вопрос. Это один из тех случаев, когда кто-то, пробуя несколько вещей, случайно обнаруживает себя на дне огромного дерева знаний (в частности, фильтры Бесконечного Импульса). Тем временем, люди, которые уже взбираются на дерево, могут описать все классные вещи, которые они уже обнаружили среди ветвей ...
DrMcCleod

Ответы:

37

То, что вы реализовали, - это однополюсный фильтр нижних частот, иногда называемый негерметичным интегратором . Ваш сигнал имеет разностное уравнение:

y[n]=0.8y[n1]+0.2x[n]

где - это входное значение (значение сглаженного столбца), а - сглаженное значение столбца. Это распространенный способ реализации простого низкочастотного фильтра низкой сложности. Я писал о них несколько раз в предыдущих ответах; см. [1] [2] [3] .y [ n ]x[n]y[n]

Джейсон Р
источник
4
Большое спасибо за это. Так очень полезно. Гуглить самостоятельно - все равно, что быть потерянным в море, когда дело доходит до DSP. Наличие пары терминов для поиска дает мне кое-что понять.
Майкл Бромли
3
Я думаю. Я думаю, что OP применяет этот фильтр к ряду значений в отдельных бинах в частотной области. Нормальный низкочастотный диапазон применяется к серии отсчетов во временной области. Одинаков ли эффект (я так не думаю, потому что высокочастотные части все еще находятся в сигнале, но ... их интенсивность изменяется медленнее?)? Если нет, не могли бы вы уточнить, что фильтр делает с сигналом во временной области?
Йонас Шефер
3
@JonasWielicki Я думаю, что целью является сглаживание каждого отдельного значения бина, чтобы оно не менялось очень быстро. также фильтр нижних частот (как объяснено в ответе) применим к любому временному ряду независимо от его области (время или частота или что-либо еще).
Арпит Джейн
@arpitjain Я понимаю это. Я просто хотел бы знать, есть ли какое-то понимание (не обязательно у вас, ОП или автора), как это влияет на временную область, когда вы делаете это.
Йонас Шефер
@JonasWielicki Операция представляет собой свертку в частотной области, поэтому она преобразуется в умножение (соответствующих (обратных) преобразований Фурье) во временной области.
MBaz
17

Предупреждение: включите немного истории, старые бумаги (я люблю их) и перфокарты!

Вы использовали с форму: иногда записывается как: a=0.2

y(n)=y(n1)+a[x(n)y(n1)],
y(n)=ax(n)+(1a)y(n1).

Первая версия выше менее естественна, но она избегает одного умножения и более эффективна. Обе формулы дают линейный , причинный и бесконечный импульсный фильтр . История восходит к Пуассону, адаптивным фильтрам Колмогорова-Зурбенко , Брауну (Статистическое прогнозирование управления запасами . McGraw-Hill, 1959), Холту (1957) и Уинтерсу (1960). Он реализован в виде схемы рекурсивной фильтрации , известной под разными именами в литературе:

«Экспоненциальный» в названии связан с импульсным откликом с геометрической прогрессией, который определяет экспоненциальный спад: .h[n]=(1a)u[n]an

Для исторической заметки Роберт Г. Браун и Артур Д. Литтл использовали этот метод в 1956 году в Экспоненциальном сглаживании для прогнозирования спроса , по-видимому, для табачной промышленности. Немного больше истории и объяснения можно найти в Holt-Winters прогнозирования для чайников (или разработчиков) - Часть I . Питер Zehna предлагает критический обзор в некоторых замечаниях по экспоненциальному сглаживанию , 1966. Глава Р. Брауна в Энциклопедии исследования операций и науки управления (книги Google) датируется историей 1944 года, читаемые страницы воспроизводятся здесь:

Экспоненциальное сглаживание, с.  205, Энциклопедия исследования операций и науки управления

Экспоненциальное сглаживание, с.  206, Энциклопедия исследования операций и науки управления

Многие методы расширяют это сглаживание, которое недействительно, когда данные имеют тенденцию или сезонность. Некоторые из них известны как двойное или тройное экспоненциальное сглаживание и фильтры Холта-Винтерса .

Вы также можете проверить: как работает этот «простой фильтр»?

Лоран Дюваль
источник
1
Спасибо, это отлично. Как уже упоминалось, я совершенно новичок в этом, поэтому некоторые из ваших ответов потребуют дальнейших исследований для меня, чтобы полностью оценить, но это, безусловно, отвечает на мой вопрос, а затем и некоторые. Если не для другого, более раннего ответа, это также, конечно, заслуживает принятия в качестве ответа.
Майкл Бромли
1
Небольшое исправление, Зимы 1 (960) должны быть Зимами (1960), я полагаю
SGR
9

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

Обычный подход для аудиометров - это «детектор пиков с потерями».

if new_value > current_value
  current_value = new_value;
else
 current_value = current_value * decay;  

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

Hilmar
источник
Я отмечаю, что это имеет сходство с заданием, которое я сделал в колледже, очень жестко звучащий MIDI (созданный в предыдущем задании) был улучшен путем свертывания (и масштабирования для соответствия пикам и длительностям) (полностью прямоугольных) сигналов ноты с треугольным сигнал, который нарастал очень резко (хотя и не мгновенно), а затем постепенно затухал, создавая резкую ноту, которая затухала «естественно». Значительное улучшение звучания песни (в данном случае Fur Elise).
KRyan
Я думаю, вы хотели бы сохранить, new_valueесли он больше, чемcurrent_value * decay
user276648
6

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

Он прямо аналогичен аналоговому низкочастотному фильтру RC.

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

Джон Р. Штром
источник
3

Как упоминалось в других ответах, это однополюсный рекурсивный фильтр, тип фильтра с бесконечной импульсной характеристикой (IIR).

Большим источником информации об этой и других функциях DSP является Стивен В. Смит: Руководство для ученых и инженеров по цифровой обработке сигналов : бесконечный импульсный отклик (IIR)

... каждая точка в выходном сигнале определяется путем умножения значений из входного сигнала на коэффициенты "a", умножения ранее рассчитанных значений из выходного сигнала на коэффициенты "b" и сложения продуктов вместе. что нет значения для b0, потому что это соответствует вычисляемой выборке. Уравнение 19-1 называется рекурсивным уравнением, а фильтры, которые его используют, называются рекурсивными фильтрами. Значения «a» и «b», которые определяют фильтр, называются коэффициентами рекурсии.

Asmund
источник