Как добавить звуковые эффекты в буферизованный звук PCM в Stack Overflow

у меня есть int16_t[] Буфер с PCM необработанных аудио данных, и я хочу применить некоторые эффекты (например, эхо, реверберация, усиление …) в него.

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

Я никогда не работал со звуком, но, читая данные PCM, я узнал, что я могу применить усиление, например, умножая каждое значение семпла. Но я ищу любую библиотеку или относительно простые алгоритмы, которые я могу использовать непосредственно в своем буфере для применения звуковых эффектов.

Я уверен, что есть много решений моей проблемы, если вы знаете, что искать, но это мой первый раз с обработкой звука, и я, как вы видите, потерялся.

1

Решение

Ваш int16_t[] буфер содержит последовательность выборок. Они представляют мгновенные уровни амплитуды. Думайте о них как о напряжении, которое подается на динамик в соответствующий момент времени. Они представляют собой числа со знаком со значениями в диапазоне (-32767,32767]. Поток постоянных нулей означает тишину. Поток постоянной -32000 (например) также означает тишину, но в конечном итоге это сожжет вашу катушку динамика. Положение в массиве представляет время, а значение каждого образца представляет напряжение.

Если вы хотите смешать два потока сэмплов вместе, например, чтобы применить чириканье, вы получите себе поток сэмплов с чирпом (запишите птицу или что-то в этом роде). Затем вы добавляете два звука сэмпл за сэмплом.

Вы можете сделать эффект реверберации супер-сырный, взяв исходный звуковой буфер, уменьшив его громкость (возможно, разделив все сэмплы на константу), и добавив его обратно в исходный поток, но сместив сэмплы на одну десятую секунды. ценность позиции массива.

Это основы обработки аудио. Вещи становятся действительно очень сложными. Это поле известно как «цифровая обработка сигналов», и существует множество книг на эту тему.

1

Другие решения

Для всех, как я, заинтересованных в изучении DSP, связанных с обработкой звука на C ++, я хочу поделиться своими маленькими результатами исследований и мнением, и, возможно, сэкономить вам время 🙂

Попробовав несколько библиотек DSP, я наконец нашел Synthesis ToolKit в C ++ (STK), библиотека с открытым исходным кодом, которая предлагает простой и понятный интерфейс и простой для понимания код, в который вы можете погрузиться, чтобы узнать о различных базовых алгоритмах DSP.

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

1

Вы можете сделать это либо путем взлома аудио-буфера и попыткой сделать некоторые эффекты, такие как усиление и порог, с помощью простых математических операций, или сделать это правильно, используя надлежащие алгоритмы DSP. Если вы хотите сделать это правильно, я бы порекомендовал использовать библиотеку Speex. Это открытый исходный код и хорошо проверен. www (точка) speex (точка) орг. Код должен компилироваться на MSVC или Linux с минимальными усилиями. Это самый быстрый способ получить хороший аудиокод, работающий с правильной техникой DSP. Ваш код будет выглядеть как … пожалуйста, прочитайте пример AEC.

 st = speex_echo_state_init(NN, TAIL);
den = speex_preprocess_state_init(NN, sampleRate);
speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate);
speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st);

Вам нужно настроить состояния, код Testecho включает их.

0
По вопросам рекламы [email protected]