logo search
rus

5 Основы теории звука и синтеза

5.1 Что такое звук?

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

Эти волны давления могут быть разной интенсивности (к примеру звук, очень громкие звуки можно почувствовать остальными частями вашего тела), и они колеблются туда и сюда с той же скоростью, с которой побуждает их объект. Наши уши могут расшифровывать звуковые частоты в диапазоне от примерно 20 Гц (герц) до 20000 Гц (или 20 кГц). Один герц соответствует одному возвратно-поступательному движению в секунду.

Один герц может быть создан от движения руки взад вперёд, но он не проявиться как звук, так как наши уши не могут слышать низкочастотные звуки. Рука, тем не менее, приводит в движение воздух, который можно легко почувствовать. Если бы вы могли помахать рукой быстрее, на более чем 20 возвратно-поступательных движений в секунду, вы услышите звук похожий на сильный бас.

В качестве примера того, что вы действительно можете услышать, это звук шведского гудка, как правило, 440 Гц. Это означает, что объект совершает колебания туда сюда 440 раз в секунду, что довольно быстро для повседневного движения. Видимо американский эквивалент представляет собой смесь 2 тонов 350 и 440 Гц, но результат всё же в том же диапазоне.

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

5.2 Как насчёт синтеза звука, как создавать звуки?

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

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

Воспроизведение звуков природы это хорошо, но не то, что нам требуется. Если вы нуждаетесь в конкретном звуке вам придётся искать его с помощью генерации реальных физических процессов, что практически невозможно. Однако, звуковые техники старой школы в производстве фильмов, создали замечательные работы с практически физической генерацией звука. Примером является звук лазерной TIE Fighter в "Звездных войнах" (надлом металлической проволоки) и рычание T-Rex в "Парке Юрского периода (крупные транспортные машины). Очевидно, существует бесконечное множество других эффектов, взрывы, шумы монстров и, конечно, самые популярные драки на кулаках.

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

Сейчас существуют удобные системы для создания звука. Звуковая карта компьютера обладает тем, что называется цифро-аналоговый преобразователь (ЦАП), который способен генерировать электрические сигналы из цифр, которые ему даны. Номер должен быть в пределах определенного диапазона, скажем -1,0 до 1,0 (с произвольной точностью между ними). Как правило, ноль дает нам покой/свободное положение динамика, при положительных числах оказывается давление на переднюю часть динамика, при отрицательных чисел на заднюю часть, то есть в другом направлении. На самом деле неважно куда идет волна, вы услышите звук, который более или менее похож на оригинал.

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

5.3 Простые формы сигналов

Ладно, мы должны подойти к цифрам. Повторять шаблоны чисел. Как же нам это сделать? Это абсолютно просто - любой повторяющийся набор чисел создаст звуковой сигнал (если вы сделаете диапазон достаточно большим, между от 0,0 и 0,00001 вряд ли получиться привлечь чьё-нибудь внимание).

* Любая шаблон вы говорите? Что насчёт 1,0,1,0,1,0,1,0 ,...?

Да, это сработает. Но, к сожалению, вы не услышите, ни один звук, даже если он использует большую часть диапазона. Помните, те шаблоны, которыми мы снабжали D/A конвертер на 44100 в секунду, и эти цифры описывают колебания (возвратно-поступательный, помните?).

…но шаблоны повторяются каждые два замера, так что в результирующая вибрация динамика на частоте 22050 Гц. Это чуть выше 20 кГц, которые вы, вероятно, запомнили, как верхний предел для человеческого слуха. Это действительно причина для использования 44,1 кГц как частоты дискретизации - поэтому мы можем воспроизводить звуки по всему диапазону человеческого уха, но не более того.

* Хорошо, что, если я держу каждое из чисел на некоторое время?

Ты имеешь в виду что-то вроде 1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0 ,...?

* Да, вот так. Или даже больше этого же до изменения.

Ура, вы только что создали прямоугольные волны, которые, пожалуй, являются самым классическим цифровым синтезированным сигналом. Сколько раз мы повторяем число количество до перехода к другому числу? Если мы увеличим, это количество, сигнал будет более растянутым во времени, и колебания будет происходить медленнее, поскольку это занимает больше времени, для завершения движение. Число повторов (также называемый "период", если измерять по времени) прямой способ управления частотой сигнала, которую мы генерируем. Более длительный период означает более низкую частоту, и наоборот.

Немного к сведению, вы обычно хотите, чтобы сигнал колебался равномерно вокруг нулевой точки, в противном случае не будет звукового щелчка/клика в начале и в конце вызова. Это вызвано средним уровнем сигнала, который сдвигается неожиданно. Это иллюстрируется довольно ясно по тому, как построены аудио системы. Они, как правило, фильтруют все, что движется медленнее, чем группа Гц, чтобы всегда держать диффузор колеблющейся около физической точки покоя динамика. Так вы получите максимально доступный диапазон движения из нее, даже если ваш аудио сигнал постоянного тока.

5.4 Синусоидальная волна

Пока простая волна имеет свойство быть простой для расшифровки цифровым компьютером, на самом деле очень сложна с музыкальной точки зрения. Она содержит большое количество резонансных частот выше единицы, которые мы создаем с выбранной величиной периода, который может сделать звук "полным" и характерным. На самом деле некоторые из них можно описать скорее как "пустые" или "воздушные", но все-таки имеющие определённый характер.

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

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

Синусоида довольно сложна в создании в вычислительном отношении, но в большинстве случаев функция sin() моделируется на разумной скорости (и в простым для использования способом). Полный период колебаний sin(t) достигается цикличным изменением t от 0 до 2*пи (что составляет примерно 6,283), и выводит значения в диапазоне от -1 до +1. Причины для использования таких, казалось бы, нечетные параметров диапазона - математические и связанны с окружностью, традиционно родных функций синуса и косинуса. Окружности радиуса 1 имеет окружность ровно 2 * PI.

5.5 Треугольная волна

Треугольная волна представляет собой попытку имитировать синусоидальную волну более точно, чем вы могли бы прямоугольной, но её использование требует весьма простых вычислений. Это просто рост и падение значений уклона. Результат создаёт звук очень похожий на синусоиду, так что в этом смысле она полезна. Звучит скучно хотя, естественно.

5.6 Пилообразная волна

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

5.7 Шум

Если вы хотите более хаотичных звуков, напоминающих взрывы или удары, вам не посчастливиться иметь дело с простыми повторяющимися моделями (если вы будете много менять их, тогда они перестанут быть простыми повторяющимися моделями). Прямой путь получения хаотической модели это использование генератора случайных чисел. Большинство языков программирования имеют такие генераторы. В C вы могли бы сделать что-то вроде этого:

next_number = (float) (rand ()% 20000-10000) / 10000

... Чтобы получить случайное число между -1,0 и +1,0. Посмотрите функции rand () и srand () для деталей.

Несмотря на это модель не будет полностью случайной, вы можете по-прежнему контролируете явную "частоту" или легкость звучания. Это можно сделать несколькими способами, но наиболее простой это задержка между переключением на новые случайные значения основана на качестве после этой задержки. Модель очень похоже на прямоугольные волны в этом отношении, кроме как вам придется задерживать период намного короче длины для шума.

5.8 Общие формы волн (для программистов)

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

Для прямоугольной волны, вы может просто проверить период, меньше или больше 0,5. Если он меньше, выводить -1, или 1 (наоборот). Чтобы получить пилообразную волну, вы напишите что-то вроде (-1,0 + period_pos*2,0), что приведет к уклону сигнала от -1 до +1 над {0,0 - 1,0} положения диапазона периода.

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

Для изменения частоты звука вам нужно просто установить новое значение для длины периода (хотя это влияет только на скорость, с которой положение периода увеличивается, он всегда будет в промежутке между 0 и 1). Для контроля звука нужно умножить выходную модель с помощью значения звука (скажем, между 0.0 для тишины и 1.0 для максимальной громкости). Можно также смешать несколько независимых сигналов, соединив их модели вместе, хотя будьте уверены, что он не превышает допустимого диапазона вашей звуковой карты (которые, вероятно, равны -1,0 до +1,0). Иными словами, вы должны будете использовать звук ниже для каждого сигнала (или "канала"), если вы собираетесь смешать (добавить) некоторые из них вместе ... или вы можете просто перемножить итоговую сумму на значение громкости, если вам не нужна регулировка громкости на каждый канал.

Еще одно небольшое предостережение, которое стоит рассмотреть это то, что вы не должны использовать числа с плавающей точкой, как будто они были неотъемлемой типов данных. То есть: не увеличивать маленькие шаги в большом диапазоне. Они имеют ограниченную точность и будет неправильно, если вы это сделаете. Это может проявляться как небольшое, но заметное изменение в высоте звука, ни хуже. Вы можете увеличивать числа с запятой столько, сколько хотите держать их в разумных пределах, как между 0,0 и 1,0. Проблемы возникают, когда размер приращения намного меньше, чем текущее значение (например, 50000,0 + 0,1).