Как сложить оцифрованные аудиосигналы? День добрый! Генерирую звук на определенной частоте (неважно, в виде синусоиды, пилы, треугольника) в виде массива значений 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
Прежде всего, нужно нормализовать все входные аудиосигналы, чтобы их амплитуды были в пределах от -1 до 1. Это важно для корректного сложения сигналов. После сложения сигналов можно провести нормализацию, чтобы уровень громкости был оптимален.
В вашем случае, когда сложение приводит к хрипам или слишком тихому звуку, возможно, проблема в компрессии диапазона. Попробуйте использовать другие алгоритмы компрессии или экспериментируйте с пороговыми значениями. Также, вы можете попробовать обработать сигналы перед сложением, например, применить эквализацию или динамическую обработку диапазона.
Чтобы изучить алгоритмы сложения и обработки аудиосигналов более глубоко, вам могут помочь следующие ресурсы:
"Digital Audio Signal Processing" от Udo Zölzer - книга о цифровой обработке аудиосигналов."Introduction to Sound Processing" от Davide Rocchesso - книга об основах обработки звука.Блоги, форумы и сообщества для аудиоинженеров и звукорежиссеров, где можно найти обсуждения и рекомендации по обработке аудиосигналов.
Надеюсь, это поможет вам улучшить процесс сложения и обработки аудиосигналов. Если у вас остались конкретные вопросы или нужна дополнительная помощь, не стесняйтесь обращаться. Удачи в вашем проекте!
Прежде всего, нужно нормализовать все входные аудиосигналы, чтобы их амплитуды были в пределах от -1 до 1. Это важно для корректного сложения сигналов. После сложения сигналов можно провести нормализацию, чтобы уровень громкости был оптимален.
В вашем случае, когда сложение приводит к хрипам или слишком тихому звуку, возможно, проблема в компрессии диапазона. Попробуйте использовать другие алгоритмы компрессии или экспериментируйте с пороговыми значениями. Также, вы можете попробовать обработать сигналы перед сложением, например, применить эквализацию или динамическую обработку диапазона.
Чтобы изучить алгоритмы сложения и обработки аудиосигналов более глубоко, вам могут помочь следующие ресурсы:
"Digital Audio Signal Processing" от Udo Zölzer - книга о цифровой обработке аудиосигналов."Introduction to Sound Processing" от Davide Rocchesso - книга об основах обработки звука.Блоги, форумы и сообщества для аудиоинженеров и звукорежиссеров, где можно найти обсуждения и рекомендации по обработке аудиосигналов.Надеюсь, это поможет вам улучшить процесс сложения и обработки аудиосигналов. Если у вас остались конкретные вопросы или нужна дополнительная помощь, не стесняйтесь обращаться. Удачи в вашем проекте!