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





audio (5)


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

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

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

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

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

Ученый и инженер-программист по цифровой обработке сигналов. Это бесплатный онлайн-учебник, который углубляется в стандартные темы DSP. Большая часть из них также относится к цифровому аудио.

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

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

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




Как отмечают некоторые в комментариях, то, что вы хотите изучить, это en.wikipedia.org/wiki/Pulse-code_modulation .

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

speaker работает наоборот; сигнал 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 кГц, звук будет очень быстрым и высоким, как птицы, чирикающие.

Изменение самих образцов (и сохранение постоянной частоты дискретизации воспроизведения) означает, что сэмплы либо (a) выбрасываются, либо (b) добавляются.

Чтобы ускорить воспроизведение звука, выбросьте образцы:

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

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

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

Если вы хотите отключить определенные частоты, вы можете использовать FFT для преобразования звуковых данных в частотно-временную область и обнулить ненужные компоненты частоты. Это называется filtering .

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

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)

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

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

Удачи!




Похоже, вы хотите узнать больше о en.wikipedia.org/wiki/Pulse-code_modulation

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

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




Недавно я опубликовал аналогичный вопрос: хорошие аудио-руководства по dsp .

Золотая ссылка - это, конечно же, The 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/




У меня была та же проблема, поэтому я использовал этот код для воспроизведения звуков вместо SKAction

SystemSoundID soundID;
NSString *filename = @"soundFileName";
CFBundleRef mainBundle = CFBundleGetMainBundle ();
CFURLRef soundFileUrl = CFBundleCopyResourceURL(mainBundle, (__bridge             CFStringRef)filename, CFSTR("wav"), NULL);
AudioServicesCreateSystemSoundID(soundFileUrl, &soundID);
AudioServicesPlaySystemSound(soundID);

и он решил мои проблемы, я надеюсь, что это поможет





language-agnostic audio