Привет всем, здесь я хочу рассказать об алгоритме анализа аудиосигнала, который позволяет разбирать сигнал на отдельные волны, конечно это не дает 100% точности, но тем не менее результат, на мой взгляд, вполне хороший .
Лучше всего работу видно на музыке:
И ссылки на другие примеры разных жанров.
Металдет-Торнадо душ: Вне связи: Итак, для декомпозиции необходимо предпринять следующие шаги: — из исходного сигнала необходимо получить 8 промежуточных сигналов; — Из этих промежуточных сигналов и исходного сигнала нужно получить 8 сигналов — слоев, которые можно разобрать на отдельные волны; — Посчитайте, сколько волн в каждом слое и какова их амплитуда.
Теперь поговорим о каждом этапе подробнее: чтобы получить промежуточный сигнал, нужно взять производную исходного сигнала.
По сути, это производная дискретной функции.
Чтобы найти ее для каждого момента исходного сигнала, нужно задать 1 параметр: период, за который находится эта производная.
Значение производной представляет собой коэффициент наклона в заданном интервале; его можно найти, например, методом наименьших квадратов.
Требуется рассчитать 8 промежуточных сигналов с 8 разными периодами.
Самый простой набор периодов: 4, 8, 16, 32, 64, 128, 256, 512. Если период указан, производная рассчитывается для каждого отсчета сигнала по формуле наименьших квадратов.
Это похоже на скользящую среднюю, только здесь это не скользящая средняя, а скользящая производная текущего интервала.
Это создает 8 производных сигналов и 1 исходный сигнал.
Теперь необходимо проинтегрировать каждый из 8 производных сигналов.
В данном случае это означает, что каждая следующая выборка равна сумме всех предыдущих выборок.
После этого получается 8 промежуточных слоев.
Следующим шагом является получение слоев, которые можно разделить на отдельные волны.
Итак, теперь вам нужно получить 8 слоев.
Слои рассчитываются следующим образом: Layer0=промежуточный0-исходный сигнал слой1=промежуточный1-промежуточный0 слой2=промежуточный2-промежуточный1 слой3=промежуточный3-промежуточный2 слой4=промежуточный4-промежуточный3 слой5=промежуточный5-промежуточный4 слой6=промежуточный6-промежуточный5 слой7=промежуточный7-промежуточный6 слой8=промежуточный7 Последний слой не является разницей, а просто равен последнему промежуточному сигналу.
Можно попробовать другой способ, а именно вычислить последующие промежуточные сигналы из предыдущих промежуточных.
Но текущая программа использует 1 вариант. Теперь, чтобы разобрать слои на отдельные волны, нужно просто посчитать области, где значения увеличиваются, а где уменьшаются.
На самом деле длительность участков — это их длины волн.
Участки сигналов, где значения сигналов постоянны, следует просто пропускать.
Чтобы найти амплитуду сигнала в спектре в определенном интервале, нужно сложить все амплитуды волн, умноженные на их длину.
Код, вычисляющий промежуточный сигнал, выглядит следующим образом:
здесь wavesize — это количество сэмплов
signal[] – массив с исходным сигналом
SY=0,SX=0,SXX=0,SXY=0,Ky=0 — переменные типа float
Шаг2=ШАГ/2, где ШАГ — период (4,8,16,32,64,128,256,512)
Теги: #Звук #программирование #цветная музыкаfor(int i=Step2;i<wavesize-Step2;i++){
-
Sandboxescaper/Poc-Lpe: Что Внутри?
19 Oct, 24 -
Необычная Афера Под Прикрытием Роскомнадзора
19 Oct, 24