мячин.ком

Feedback. Модульный синтез и обратная связь.

Это статья о том, что такое обратная связь, как с ней можно работать теоретически и практически, а также как её можно запрограммировать. При разработке синтезаторов и процессоров, естественным образом возникает модульный подход: представление всего процесса в виде взаимодействия некоторых объектов. Какие-то из них порождают звук или другие сигналы, какие-то их обрабатывают. Вот, например, так выглядит схема простого субстрактивного синтезатора:

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

Однако, вот такая схема нередко ставит разработчика в тупик:

Эта статья как раз о реализации подобных схем.

Казуальные и неказуальные преобразования.

В процессе обработки и синтеза звука, мы имеем дело с преобразованиями. Те преобразования, которые можно реализовать в живую, на ходу, называются казуальными. Большинство преобразований, с которыми мы привыкли иметь дело казуальны. А вот, например, реверс неказуален. Нельзя придумать девайс, который бы на ходу (прямо во время произношения) переворачивал произносимые слова во времени, типа "оволс" вместо "слово". Потому что этот девайс не может узнать заранее как ты закончишь слово. Реализовать обратную связь можно и для неказуальных преобразований. Но в рамках этой статьи неказульные преобразования рассматриваться не будут, поскольку обратная связь для неказуальных преобразований не имеет большой практической ценности.

Обратная связь.

Начнем с одного преобразования:

Обратная связь - это использование результата преобразования на входе:

Пусть in - это сигнал на входе, а out - это выходной сигнал, F(...) - преобразование, на языке формуле имеем:

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

Простое решение. Независимость от настоящего.

Если посмотреть на определение казуальных преобразований, то оно по сути означает независимость результата преобразования от будущего. Какими бы ни были следующие во времени отсчеты, они никак не влияют на результат. Аналогичным образом введем определение "независимости от настоящего": казуальное преобразование независимо от настоящего, если текущий отсчет результата зависит только от прошлых отсчетов входного сигнала, но никак не от текущего отсчета на входе:

Для таких преобразований реализация обратной связи не представляет никакой сложности: текущий отсчет результата не попадает обратно на вход, поэтому можно просто вычислять алгоритм преобразования, используя входной сигнал и "прошлое" результата. Не все преобразования не зависят от настоящего. Однако, схему обратной связи всегда можно преобразовать при помощи задержки на один отсчет:

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

Принцип сжимающих отображений и метод простой итерации.

Предыдущий метод - это уход от проблемы решения уравнения. Но если мы всё же желаем решить это уравнение. Каким образом это сделать? Для это нам понадобится известный математический факт, который называется принцип сжимающих отображений. Суть его проста: если некоторое преобразование уменьшает расстояния между точками, то существует единственная точка а, такая что F(a) = a.

Приведу простой пример. Допустим у вас есть настенная карта мира. И есть карта мира меньшего размера. Произвольным образом мы наложили маленькую карту на большую. Тогда существует точка, которая совпадает на большой и на маленькой карте. То есть можно проткнуть обе карты кнопкой, и эта кнопка и на большой, и на маленькой карте будет указывать на одно и то же место. Как найти эту точку? Довольно просто. Допустим маленькая карта находится на большой карте на территории России. Тогда мы знаем, что искомая точка в России. Тогда посмотрим где расположена маленькая Россия с маленькой карты на большой. Так, мы узнаем что это допустим Ленинградская область. Тогда мы будем смотреть на маленькую Ленинградскую область и так далее, сужая область поиска.

Процесс, который я описал, называется метод простой итерации. Заключается он в следующем: берем произвольную точку и последовательно применяем к нему преобразование. Тогда, если отображение сжимающее, оно приведет нас к точке, в которой F(a)=a. Теоретически так надо сделать бесконечное число раз, однако на практике нам требуется всего лишь конечное число итераций для необходимой точности. Метод простой итерации использовали все, кому в часы безделья попадался на глаза калькулятор. Возьмите калькулятор, наберите какое-нибудь число и начните находить его квадратный корень. Потом корень корня и т.д. Жмите на кнопку корня и смотрите что получается. Неважно какое число вы ввели, итерации все равно приведут вас к единице. Потому что корень единицы - это единица, а вычисление корня - сжимающее отображение. Вот МПИ в действии.

А вот так вы можете использовать МПИ для реализации обратной связи:

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

мячин.ком