Ответ 1
Как уже отмечалось в комментариях, вы хотите изучить PCM audio.
В двух словах sound - это волна, которая проходит по воздуху. Чтобы записать этот звук, мы используем microphone, который содержит мембрану, которая будет вибрировать, когда звуковые волны поражают ее. Эта вибрация преобразуется в электрический сигнал, где напряжение идет вверх и вниз. Это изменение напряжения затем преобразуется в цифровой сигнал аналого-цифровым преобразователем (ADC) путем выборочного опроса определенного количества раз в секунду ( " частота дискретизации" - 44 кГц, или 44 100 выборок в секунду) и в текущем случае хранится в виде импульсно-кодовой модуляции ( PCM).
A 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, и при воспроизведении они должны звучать намного громче, чем раньше.
Silence
Когда вибрации отсутствуют, звука нет. Молчание может быть достигнуто путем сброса каждого образца на 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 для преобразования звуковых данных в частотно-временную область и откалибровать частотные компоненты, которые нежелательны. Это называется фильтрация.
Создание фильтра , который позволяет использовать частоты выше определенной частоты следующим образом:
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)
В этом примере увеличивается нижняя четверть частотных составляющих звука, что приводит к тому, что низкие частоты становятся громче.
Есть несколько вещей, которые можно сделать с образцами для управления аудио. Просто продолжайте экспериментировать! Это самый захватывающий способ узнать.
Удачи!