Начало работы с программным звуком [закрыто]

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

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

Какие концепции мне нужно изучить, чтобы работать со звуком таким образом?

14.12.2008 04:50:02
some 14.12.2008 05:37:19
Обычно каждое 32-битное значение представляет уровень напряжения в указанное время. Поскольку частота дискретизации составляет 44100 Гц, вы получаете 441000 32-битных значений в секунду на канал (* 2, поскольку у вас есть стерео)
some 14.12.2008 05:41:57
При стереозвучании левый и правый канал часто чередуются, так что первая выборка представляет левый канал, а вторая - правый, и так далее.
some 14.12.2008 05:45:19
Спасибо за информацию до сих пор - платформа, которую я использую, действительно чередует стереоканалы. И не стесняйтесь размещать этот материал в качестве ответа, чтобы я мог проголосовать за вас! : D
fenomas 14.12.2008 05:50:11
Выполнено! Должен ли я удалить комментарии здесь?
some 14.12.2008 06:15:55
4 ОТВЕТА
РЕШЕНИЕ

Как отмечалось в комментариях, то, что вы хотите посмотреть, это звук PCM .

Короче говоря, звук - это волна, которая путешествует по воздуху. Чтобы захватить этот звук, мы используем микрофон , который содержит мембрану, которая будет вибрировать, когда звуковые волны попадают в него. Эта вибрация преобразуется в электрический сигнал, где напряжение повышается и понижается. Это изменение напряжения затем преобразуется в цифровой сигнал с помощью аналого-цифрового преобразователя (АЦП) путем дискретизации определенного количества раз в секунду (« частота дискретизации » - 44 кГц или 44 100 выборок в секунду) и, в текущий случай, сохраненный как аудиоданные с импульсной кодовой модуляцией (PCM).

Динамик работает в противоположном; сигнал PCM преобразуется в аналоговый с помощью цифроаналогового преобразователя (ЦАП), затем аналоговый сигнал поступает в динамик, где он будет вибрировать мембрану, которая создает вибрации в воздухе, что приводит к появлению звука.

Управление аудио

Существует множество библиотек для многих языков, с которыми вы можете манипулировать звуком, однако вы пометили этот вопрос как «независимый от языка», я упомяну несколько простых способов (как это все, что я знаю!), Которые вы уметь манипулировать аудио на предпочитаемом вами языке.

Я представлю примеры кода в псевдокоде.

У псевдокода каждый аудиосэмпл будет иметь амплитуду в диапазоне от -1 до 1. Это будет зависеть от типа данных, который вы используете для хранения каждого семпла. (Я не имел дело с 32-битными floats раньше, так что это может отличаться.)

усиление

Чтобы усилить звук (следовательно, увеличить громкость звука), вам нужно увеличить вибрацию динамиков, чтобы увеличить величину звуковой волны.

Чтобы заставить этот динамик двигаться больше, вам нужно увеличить значение каждого семпла:

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функция, которая делает «предположение» о том, как заполнить этот дополнительный пробел, который будет добавлен.

Анализ спектра и модификация звуков БПФ

Используя метод, называемый быстрым преобразованием Фурье (БПФ), звуковые данные в амплитудно-временной области могут быть сопоставлены с частотно-временной областью для определения частотных компонентов звука. Это может быть использовано для создания анализаторов спектра, которые вы можете увидеть на своем любимом аудиоплеере.

Мало того, что теперь у вас есть частотные составляющие аудио, если вы измените количество

Если вы хотите отключить определенные частоты, вы можете использовать БПФ для преобразования звуковых данных в частотно-временную область и обнуления частотных компонентов, которые не нужны. Это называется фильтрацией .

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

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)

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


Есть довольно много вещей, которые можно сделать для семплов, чтобы манипулировать аудио. Просто идите вперед и экспериментируйте! Это самый захватывающий способ учиться.

Удачи!

97
13.03.2015 21:22:16
Ух ты ... Если бы я только мог любимые ответы;)
TraumaPony 22.12.2008 09:52:35
Ctrl + D (вопросы в SO имеют уникальные URL, если я не ошибаюсь ...)
Laurent K 22.12.2008 11:29:59
Вау, отличный ответ! Кстати, ваш псевдокод очень похож на Python;)
Chris Lawlor 27.02.2009 05:32:41
Спасибо! Я считаю, что код в стиле Python идеально подходит для написания псевдокода: чистый и лаконичный!
coobird 27.02.2009 06:10:11
coobird, это было потрясающее чтение
markus_p 15.09.2012 08:23:31

Похоже, вы хотите узнать больше об аудио PCM

Обычно каждое 32-битное значение представляет уровень напряжения в указанное время. Поскольку частота дискретизации составляет 44100 Гц, вы получаете 441000 32-битных значений в секунду на канал (* 2, поскольку у вас есть стерео)

При стереозвучании левый и правый канал часто чередуются, так что первая выборка представляет левый канал, а вторая - правый, и так далее.

4
14.12.2008 06:15:04

Чтобы понять, что представляют собой эти массивы 32-битных чисел, вам необходимо прочитать хорошее введение в Digital Audio.

Если вы находитесь рядом с библиотекой, вам может пригодиться «Учебник компьютерной музыки» от Curtis Roads. В частности, глава первая «Концепции цифрового аудио». (Прошло много времени с тех пор, как я прочитал эту книгу).

Если у вас есть понимание цифрового звука, есть много способов манипулировать им. Когда вы будете готовы, эти ссылки могут помочь.

Форум Dsp + Plugin Development в KVR Аудио одно место , чтобы задать вопросы. Сообщения здесь, как правило, разделены между общими аудио-темами DSP и VST плагинов.

MusicDsp имеет много фрагментов кода.

Руководство для ученых и инженеров по цифровой обработке сигналов - это бесплатный онлайн-учебник, в котором подробно рассматриваются стандартные темы DSP. Многое из этого также относится к цифровому аудио.

3
22.12.2008 09:42:52

Недавно я опубликовал похожий вопрос: хорошие аудио-учебники по 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/

1
23.05.2017 12:00:35