Введение
Математические модели цифровых сигналов — вектора и матрицы, элементами которых являются числа. Числа могут быть двоичными (бинарный сигнал), десятичными («обычный» сигнал) и так далее. Любой звук, любое изображение и видео могут быть преобразованы в цифровой сигнал1: звук — в вектор, изображение — в матрицу, а видео — в последовательный набор матриц. Поэтому цифровой сигнал — это, можно сказать, универсальный объект для представления информации.
Задача сглаживания — это, по сути, задача фильтрации сигнала от высокочастотных составляющих (попросту говоря, от шума). Поэтому для разработанного алгоритма сглаживания в первую очередь необходимо определить как сильно ослабляются разные частотные составляющие. Другими словами, необходимо построить амплитудно-частотную характеристику соответствующего фильтра, иначе велика вероятность «нарваться» на артефакты.
Например, при попытке сгладить звуковой сигнал по двум соседним отсчётам весьма вероятно, что в голову придёт формула вроде
v[i] = (s[i+1] + s[i] + s[i-1])/3.
Казалось бы, обычное усреднение и мощность шума должна уменьшиться… Да, уровень шума после фильтрации будет меньше, но где гарантия того, что в вышеприведённом алгоритме справедливо следующее утверждение: чем выше частота шума, тем в большей степени он будет ослаблен? Ведь, по логике, немонотонная характеристика (то — убывающая, то — возрастающая) ничем не оправдана… Как построить зависимость ослабления от частоты для конкретного алгоритма? Как подобрать коэффициенты сглаживающего фильтра (в вышеприведённом алгоритме коэффициенты равны по 1/3)? А может быть взять не три слагаемых, а пять? Как найти свой (то есть для конкретной задачи) оптимум?
На эти и некоторые другие вопросы я постараюсь ответить так, чтобы обычный программист смог обосновать свой алгоритм, — надеюсь, не только алгоритм на тему «Сглаживание», так как идеи будут излагаться весьма общие, заставляющие думать самому…
Читать полностью »