Начало работы с программным аудио
Я ищу помощь, чтобы начать работать программно со звуком.
В частности, платформа, с которой я работаю, предоставляет API для извлечения аудиоданных из ресурса (например, MP3) или для воспроизведения произвольных данных в виде звука. В обоих случаях фактические данные представляют собой байтовые массивы 32-разрядных чисел с плавающей запятой, представляющие стерео 44,1 кГц. Что мне нужно, так это помочь понять, что представляют собой эти поплавки, и что можно сделать с ними для динамического анализа или изменения звука, который они представляют.
Какие концепции мне нужно изучить, чтобы работать со звуком таким образом?
4 ответа
Как некоторые отмечали в комментариях, вы хотите посмотреть на звук PCM.
Короче говоря, звук - это волна, которая путешествует по воздуху. Чтобы захватить этот звук, мы используем микрофон, который содержит мембрану, которая будет вибрировать, когда звуковые волны попадают в него. Эта вибрация преобразуется в электрический сигнал, где напряжение повышается и понижается. Это изменение напряжения затем преобразуется в цифровой сигнал с помощью аналого-цифрового преобразователя (АЦП) путем дискретизации определенного количества раз в секунду (" частота дискретизации" - 44 кГц или 44100 выборок в секунду) и, в текущий случай, сохраненный в виде аудиоданных с импульсной кодовой модуляцией (PCM).
Динамик работает напротив; сигнал PCM преобразуется в аналоговый с помощью цифроаналогового преобразователя (ЦАП), затем аналоговый сигнал поступает в динамик, где он будет вибрировать мембрану, которая создает вибрации в воздухе, что приводит к появлению звука.
Управление аудио
Существует множество библиотек для многих языков, с которыми вы можете манипулировать звуком, однако вы пометили этот вопрос как "независимый от языка", я упомяну несколько простых способов (как это все, что я знаю!), Которые вы быть в состоянии манипулировать аудио на вашем любимом языке.
Я представлю примеры кода в псевдокоде.
У псевдокода каждый аудиосэмпл будет иметь амплитуду в диапазоне от -1 до 1. Это будет зависеть от типа данных, который вы используете для хранения каждого семпла. (Я не имел дело с 32-разрядным float
с, так что это может быть по-другому.)
усиление
Чтобы усилить звук (следовательно, увеличить громкость звука), вам нужно увеличить вибрацию колонок, чтобы увеличить величину звуковой волны.
Чтобы заставить этот динамик двигаться больше, вам нужно увеличить значение каждого семпла:
original_samples = [0, 0.5, 0, -0.5, 0]
def amplify(samples):
foreach s in samples:
s = s * 2
amplified_samples = amplify(original_samples)
// result: amplified_samples == [0, 1, 0, -1, 0]
Полученные сэмплы теперь усиливаются на 2, и при воспроизведении они должны звучать намного громче, чем раньше.
безмолвие
Когда нет вибраций, нет звука. Молчание может быть достигнуто путем сброса каждой выборки до 0 или какого-либо конкретного значения, но не имеет никаких изменений в амплитуде между выборками:
original_samples = [0, 0.5, 0, -0.5, 0]
def silence(samples):
foreach s in samples:
s = 0
silent_samples = silence(original_samples)
// result: silent_samples == [0, 0, 0, 0, 0]
Воспроизведение вышеуказанного должно привести к отсутствию звука, так как мембрана на динамике вообще не движется из-за отсутствия изменения амплитуды в сэмплах.
Скорость вверх и вниз
Ускорение вещей может быть достигнуто двумя способами: (1) изменение частоты дискретизации воспроизведения или (2) изменение самих семплов.
Изменение частоты дискретизации воспроизведения с 44100 Гц до 22050 Гц снизит скорость воспроизведения на 2. Это сделает звук медленнее и ниже по тону. Исходя из источника 22 кГц и воспроизведения на частоте 44 кГц, звук будет очень быстрым и высоким, как щебетание птиц.
Изменение самих сэмплов (и сохранение постоянной частоты дискретизации воспроизведения) означает, что сэмплы либо (а) отбрасываются, либо (б) добавляются в.
Чтобы ускорить воспроизведение звука, выкиньте сэмплы:
original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5]
def faster(samples):
new_samples = []
for i = 0 to samples.length:
if i is even:
new_samples.add(samples[i])
return new_samples
faster_samples = faster(original_samples)
// result: silent_samples == [0, 0.2, 0.4]
Результатом вышеприведенной программы является то, что звук будет ускоряться в 2 раза, аналогично воспроизведению звука с частотой дискретизации 22 кГц и 44 кГц.
Чтобы замедлить воспроизведение звука, добавьте несколько сэмплов:
original_samples = [0, 0.1, 0.2, 0.3]
def slower(samples):
new_samples = []
for i = 0 to samples.length:
new_samples.add(samples[i])
new_samples.add(interpolate(s[i], s[i + 1]))
return new_samples
slower_samples = slower(original_samples)
// result: silent_samples == [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3]
Здесь были добавлены дополнительные образцы, тем самым замедляя воспроизведение. Здесь у нас есть interpolation
функция, которая делает "предположение" о том, как заполнить этот дополнительный пробел, который будет добавлен.
Анализ спектра и модификация звуков БПФ
Используя метод, называемый быстрым преобразованием Фурье (FFT), звуковые данные в амплитудно-временной области могут быть сопоставлены с частотно-временной областью, чтобы обнаружить частотные составляющие звука. Это может быть использовано для создания анализаторов спектра, которые вы можете увидеть в своем любимом аудиоплеере.
Мало того, что теперь у вас есть частотные составляющие аудио, если вы измените количество
Если вы хотите отключить определенные частоты, вы можете использовать БПФ для преобразования звуковых данных в частотно-временную область и обнуления частотных компонентов, которые не нужны. Это называется фильтрацией.
Создание фильтра верхних частот, который допускает частоты выше определенной частоты, может быть выполнено следующим образом:
data = fft(orignal_samples)
for i = (data.length / 2) to data.length:
data[i] = 0
new_samples = inverse_fft(data)
В приведенном выше примере все частоты выше средней отметки обрезаны. Таким образом, если аудио может выдавать 22 кГц в качестве максимальной частоты, любая частота выше 11 кГц будет отключена. (Для звука, воспроизводимого с частотой 44 кГц, максимальная теоретическая частота, которая может быть получена, составляет 22 кГц. См. Теорему отсчетов Найквиста-Шеннона.)
Если вы хотите сделать что-то вроде увеличения диапазона низких частот (аналогично эффекту усиления низких частот), возьмите нижний предел данных, преобразованных с помощью FFT, и увеличьте их величину:
data = fft(orignal_samples)
for i = 0 to (data.length / 4):
increase(data[i])
new_samples = inverse_fft(data)
Этот пример увеличивает нижнюю четверть частотных составляющих звука, приводя к тому, что низкие частоты становятся громче.
Есть довольно много вещей, которые можно сделать для семплов, чтобы манипулировать аудио. Просто идите вперед и экспериментируйте! Это самый захватывающий способ учиться.
Удачи!
Похоже, вы хотите узнать больше об аудио PCM
Обычно каждое 32-битное значение представляет уровень напряжения в указанное время. Поскольку частота дискретизации составляет 44100 Гц, вы получаете 441000 32-битных значений в секунду на канал ( * 2, поскольку у вас есть стерео)
В стереозвучаниях левый и правый каналы часто чередуются, так что первая выборка представляет левый канал, а вторая - правый и т. Д.
Чтобы понять, что представляют собой эти массивы 32-битных чисел, вам нужно прочитать хорошее введение в Digital Audio.
Если вы находитесь рядом с библиотекой, вам может пригодиться "Учебник компьютерной музыки" от Curtis Roads. В частности, глава первая "Концепции цифрового аудио". (Прошло много времени с тех пор, как я прочитал эту книгу).
Если у вас есть понимание цифрового звука, есть много способов манипулировать им. Когда вы будете готовы, эти ссылки могут помочь.
Форум по разработке плагинов Dsp + на KVR Audio - это одно из мест, где можно задавать вопросы. Сообщения здесь, как правило, разделены между общими аудио-темами DSP и VST плагинов.
MusicDsp имеет много фрагментов кода.
Руководство для ученых и инженеров по цифровой обработке сигналов - это бесплатный онлайн-учебник, в котором подробно рассматриваются стандартные темы DSP. Многое из этого также относится к цифровому аудио.
Недавно я опубликовал похожий вопрос: хорошие аудио-учебники по dsp.
Золотая ссылка - это, конечно, Audio EQ Cookbook, если вы хотите писать и разбираться в EQ, но в целом архив musicdsp.org - это лучший ресурс, который я нашел для кодирования аудио DSP.
Вот видео синтезатора ("Soundoid"), который я сделал совместно во Flash: http://www.youtube.com/watch?v=O-1hHiA7y4o
И вы можете поиграть с этим здесь: http://www.zachernuk.com/2011/03/28/soundoid-audio-synthesizer-v0-5/