Как сложить оцифрованные аудиосигналы? День добрый!
Генерирую звук на определенной частоте (неважно, в виде синусоиды, пилы, треугольника) в виде массива значений double (1-максимальная амплитуда). Проигрывается норм.
Если сгенерировать несколько таких звуков на разной частоте, сложить их, обработать , то:
1) сложение с дальнейшей линейной апроксимацией в максимальную амплитуду 1 (combineWithNormalize) будет звучать корректно, но очень тихо....
2) сложение с линейной (combineWithLinearDynaRangeCompression) компрессией или логарифмической(combineWithLnDynaRangeCompression) приводят к хрипам (игрался с пороговым значением threshold).
Собственно вопрос - возможно я последующие шаги пропустил, или еще что. Что я делаю не так?
Пробовал и стартовые минисмещения добавлять при генерации исходных сигналов, чтобы минизировать появление пиков при кратных частотах и т.п.
Какие вообще существуют приемлимые алгоритмы сложения аудиосигналов из нескольких исходных с формированием итогового файла (а не онлайн игра громкостью), который например в синтезаторах используется?
Чтобы без хрипов, и в то же время не очень тихо. Может порекомендуете хорошие статьи/книги (можно англоязычные)
Спасибо заранее.
Код (неоптимизированная Java):public class Combines {
/**
* Складывает аудиосигналы + проводит постнормализацию в [-1;1]
* @param audio входные аудиосигналы
* @return сложенный аудиосигнал
*/
public static double[] combineWithNormalize( double[]... audio) {
if (audio.length == 0) return null;
if (audio.length == 1) return audio[0];
int maxIdx = 0;
// Найдем самый длинный семпл
for(double[] arr: audio)
if (arr.length > maxIdx)
maxIdx = arr.length;
// Приведем все входные семплы к максимальной длине
for(int i=0; i < audio.length; i++)
if (audio[i].length < maxIdx)
audio[i] = Arrays.copyOf(audio[i], maxIdx);
// Сложим все аудиосемплы (+ выделим пиковый аудиосигнал)
double[] result = new double[maxIdx];
double normalizer = 1.0;
for (int i = 0; i < maxIdx; i++) {
for (int j = 0; j normalizer)
normalizer = res;
}
double coeff = 1.0/ normalizer;
if (normalizer !=1.0)
for (int i = 0; i = 1 || threshold maxIdx)
maxIdx = arr.length;
// Приведем все входные семплы к максимальной длине
for(int i=0; i < audio.length; i++)
if (audio[i].length < maxIdx)
audio[i] = Arrays.copyOf(audio[i], maxIdx);
double[] result = Arrays.copyOf(audio[0], maxIdx); // Нормализованный результируюший массив.
double linearCoeff = (1-threshold)/(2-threshold);
// Сложим все аудиосемплы по принципу
for (int i = 1; i < audio.length; i++)
for (int j = 0; j < maxIdx; j++) {
double res = result[j] + audio[i][j];
double absRes = Math.abs(result[j] + audio[i][j]);
if (absRes = 1 || threshold maxIdx)
maxIdx = arr.length;
// Приведем все входные семплы к максимальной длине
for(int i=0; i < audio.length; i++)
if (audio[i].length < maxIdx)
audio[i] = Arrays.copyOf(audio[i], maxIdx);
double[] result = Arrays.copyOf(audio[0], maxIdx); // Нормализованный результируюший массив.
double expCoeff = alphaT[(int) threshold*100];
for (int j = 1; j < maxIdx; j++) {
double res = 0;
for (int i = 0; i < audio.length; i++)
res = res + audio[i][j];
double absRes = Math.abs(res);
if (absRes

21 Авг 2019 в 06:17
230 +1
0
Ответы
1

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

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

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

"Digital Audio Signal Processing" от Udo Zölzer - книга о цифровой обработке аудиосигналов."Introduction to Sound Processing" от Davide Rocchesso - книга об основах обработки звука.Блоги, форумы и сообщества для аудиоинженеров и звукорежиссеров, где можно найти обсуждения и рекомендации по обработке аудиосигналов.

Надеюсь, это поможет вам улучшить процесс сложения и обработки аудиосигналов. Если у вас остались конкретные вопросы или нужна дополнительная помощь, не стесняйтесь обращаться. Удачи в вашем проекте!

20 Апр 2024 в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир