Начало работы с программным аудио

Я ищу помощь, чтобы начать работать программно со звуком.

В частности, платформа, с которой я работаю, предоставляет 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/

Другие вопросы по тегам