Otra forma de descomponer una señal en un espectro

Hola a todos, aquí quiero hablar sobre un algoritmo de análisis de señal de audio que les permite analizar la señal en ondas separadas, por supuesto, no ofrece una precisión del 100%, pero sin embargo, el resultado es bastante bueno en mi opinión.

imagen

El trabajo en cualquier música se ve mejor:


Y enlaces a otros ejemplos de diferentes géneros. Metaldeth-Tornado de almas:


Fuera de contacto:


Entonces, para la descomposición, debe realizar los siguientes pasos:

- De la señal original necesita obtener 8 señales intermedias;
- A partir de estas señales intermedias y de la señal original, necesita obtener 8 señales - capas, que pueden desmontarse en ondas separadas;
- Calcular cuántas ondas en cada capa y cuál es su amplitud.

Ahora, más sobre cada etapa: para obtener una señal intermedia, debe tomar la derivada de la señal original. En esencia, esto es un derivado de una función discreta. Para encontrarlo para cada momento de la señal original, debe establecer 1 parámetro: el período durante el cual se ubica esta derivada. El valor derivado es el coeficiente de pendiente en un intervalo dado, por ejemplo, se puede encontrar por el método de mínimos cuadrados.

Se requiere calcular 8 señales intermedias con 8 períodos diferentes. El conjunto de períodos más simple: 4, 8, 16, 32, 64, 128, 256, 512. Cuando se especifica un período, para cada muestra de señal, la derivada se calcula utilizando la fórmula de mínimos cuadrados. Es como un promedio móvil, pero aquí no es un promedio móvil sino una derivada móvil del intervalo actual.

Así, se obtienen 8 señales derivadas y 1 fuente. Ahora cada una de las 8 señales derivadas debe integrarse. En este caso, esto significa que cada muestra posterior es igual a la suma de todas las muestras anteriores. Después de eso, se obtienen 8 capas intermedias.

El siguiente paso es obtener capas que se puedan desmontar en ondas separadas. Entonces ahora necesitas obtener 8 capas. Las capas se calculan así:

capa 0 = señal de salida intermedia 0
capa1 = intermedio1-intermedio0
capa2 = intermedio2-intermedio1
capa3 = intermedio3-intermedio2
capa4 = intermedio 4-intermedio3
capa5 = intermedio5-intermedio4
capa6 = intermedio6-intermedio5
capa7 = intermedio 7-intermedio6
capa8 = intermedio7

La última capa no es una diferencia, sino simplemente igual a la última señal intermedia.

Puede intentar de manera diferente, a saber, calcular las señales intermedias posteriores de las intermedias anteriores. Pero en el programa actual, se utiliza 1 opción.

Ahora, para analizar capas en ondas separadas, solo necesita calcular las áreas donde los valores aumentan y donde disminuyen. En realidad, la duración de las secciones son sus longitudes de onda. Secciones de la señal donde los valores de la señal son constantes solo necesita omitir. Para encontrar la amplitud de la señal en el espectro en un intervalo determinado, debe sumar todas las amplitudes de onda multiplicadas por su longitud.

imagen

El código que calcula la señal intermedia se ve así:

aquí waveize es el número de muestras
señal [] - matriz con la señal original
SY = 0, SX = 0, SXX = 0, SXY = 0, Ky = 0 - variables de tipo flotante
Paso2 = PASO / 2 donde PASO es el período (4,8,16,32,64,128,256,512)

for(int i=Step2;i<wavesize-Step2;i++){ SY=0,SX=0,SXX=0,SXY=0,Ky=0; for(int j=i-Step2,fromZ=0;j<i+Step2;j++,fromZ++){ SX+=fromZ; SY+=signal[j]; SXX+=fromZ*fromZ; SXY+=fromZ*signal[j]; } Ky=float((STEP)*SXY-SX*SY)/float((STEP)*SXX-SX*SX); OutSignal[i]=OutSignal[i-1]+Ky; } 

Para restar una señal de otra, simplemente reste cada muestra de cada una.
Por ejemplo, para la capa 0:

 for(int i=0;i<wavesize-1;i++) layer0[i]=OutSignal0[i]-Signal[i]; 

Si sumas todas las capas y tomas la última con el signo opuesto, obtienes la señal original, multiplicando así cualquier capa, es posible hacer un filtro de frecuencia. La siguiente pregunta es cómo calcular las amplitudes de armónicos específicos. El hecho es que en un intervalo constante, por ejemplo = 4000 muestras, puede haber muchas ondas cortas y relativamente pocas largas.

Por supuesto, puede encontrar las amplitudes promedio para cada capa y sumar. Pero este método no es muy bueno ya que hay muy pocas ondas largas, y su amplitud generalmente es muy grande, y se obtiene una fuerte no uniformidad de amplitud hacia bajas frecuencias.

En un programa que muestra música en color por enlaces, la amplitud de cada armónico se calcula como: la amplitud de la onda * su longitud. De todos modos, surge la desigualdad, pero no tan fuerte como en el caso del promedio.

En general, no creo que una persona perciba el sonido como una descomposición en un espectro; más bien, el sonido consiste en imágenes de sonido, que consisten en ondas de diferentes longitudes. En consecuencia, el volumen de un sonido es más bien el volumen promedio de todas las ondas en que consiste el sonido. Pero aún no está claro qué parámetros componen la imagen de sonido, tal vez la frecuencia promedio, la desviación estándar u otra cosa.

Source: https://habr.com/ru/post/es410357/


All Articles