Reconstrucción de señal de audio de espectrograma

19

Tengo un conjunto de canciones para las cuales extraje el espectrograma de magnitud usando una ventana de Hamming con una superposición del 50%. Después de extraer el espectrograma, hice una reducción de dimensionalidad usando el Análisis de Componentes Principales (PCA). Después de reducirlo a una dimensión menor, reconstruí los espectrogramas a partir de dimensiones inferiores. Entonces, ahora habría algún error entre el espectrograma original y el espectrograma reconstruido. Me gustaría convertir este espectrograma de nuevo a la señal de audio y reproducirlo, para poder saber, cuando se reconstruye desde dimensiones inferiores, cómo suena el audio.

¿Hay alguna función disponible en decir Matlab. convertir un espectrograma de magnitud a una señal de audio?

usuario76170
fuente
2
Realmente quieres el STFT y el STFT inverso. "Espectrograma" es solo un nombre para un mapa de calor de la magnitud del STFT, y la magnitud por sí sola no es suficiente para reconstruir una señal. Mire mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… ?
endolito
44
Para ampliar el comentario de @ endolith, lo que falta cuando pasa de STFT a espectrógrafo es la información de fase, un componente vital de la representación del dominio de frecuencia de su señal.
Bjorn Roche
entonces eso significa que si quiero reconstruir la señal de audio original, ¿necesito tanto la amplitud como la fase del STFT? Pero generalmente para construir funciones de audio, el | S | La amplitud del complejo no es lo que se utiliza y la información de fase se descarta. He realizado PCA en el espectrograma de mel que calculé como M, es la matriz multiplicadora del banco de filtros de mel. así que ¿cómo reconstruir la señal de audio dada X , la aproximación a X consiguió después de PCA? X=losol(METROEl |SEl |)X^
user76170
@endolith: intenté usar el enlace que le diste a mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/… Utilicé la información de fase y amplitud, es decir (complejo como entrada a la función anterior). Con esto intenté reproducir la señal y sonó entrecortada. Por qué pasó esto ? Luego calculé la norma entre la señal original y la obtenida del procedimiento STFT inverso como se indicó anteriormente y mostró un gran valor de 3.46 * 10 ^ 3. ¿Alguna idea de por qué sucede esto? S
user76170
@ user76170: entrecortado se debe a que el STFT corta la señal en cuadros, a veces superpuestos, y tiene que deconstruirlos de la misma manera en que fueron construidos o habrá discontinuidades en cada uno. ¿Usó las funciones STFT e ISTFT de ese enlace? Mire la forma de onda de la señal entrecortada para que pueda ver cuál es el problema.
endolito

Respuestas:

15

Si el espectrograma se calculó como la magnitud del transformador de cuatro tiempos de corta duración a partir de ventanas superpuestas , entonces el espectrograma contiene implícitamente información de fase.

Las siguientes iteraciones hacen el trabajo:

xn+1=istft(Sexp(iangle(stft(xn))))

es el espectrograma, stft es la transformada de Fourier de tiempo corto hacia adelante, isft es la transformada de Fourier de tiempo corto inverso.Sstftisft

Edouard
fuente
Me gustaría comentar directamente en @edouard, pero no tengo suficiente reputación. ¿Alguien sabe cuál su respuesta? Además, ¿cómo inicializaría x 0 ? ¿Simplemente al azar? Es x n la señal reconstruida completa en la iteración n o simplemente el n º coeficiente de x ? Gracias. ix0xnnnthx
PR
1
@PR Es el número imaginario de la unidad, . 1
Peter K.
3

Me costó un poco entender la respuesta de @edouard, que está haciendo lo correcto. Compare con /signals//a/3410/9031 , que utilicé para implementar mi reconstrucción.

Tenga en cuenta que es el número imaginario, y x n es la señal reconstruida en el n º iteración. Comience con x 0 como un vector aleatorio de longitud de la señal de audio. Para mí, unas pocas iteraciones fueron suficientes para obtener un resultado que sonaba bien. Sin embargo, el error absoluto de la señal original fue bastante alto. Además, el espectrograma generado que generé a partir de la señal reconstruida, aunque mostraba las mismas estructuras en general, tenía magnitudes bastante diferentes.ixnnthx0

PR
fuente
2

Puede usar el espectrograma reconstruido versus el espectrograma original para diseñar un filtro cuya respuesta de magnitud transforma un espectrograma en el otro. A continuación, puede aplicar este filtro a los datos del dominio de tiempo original o a las FFT originales para la superposición de agregar / guardar un filtrado de convolución rápido.

hotpaw2
fuente
@ hotpaw2: No entendí tu respuesta, ¿por qué querría convertir un espectrograma en el otro? Quiero reconstruir la señal de audio dada una matriz de espectrograma . ¿Cuál es el requisito de diseñar un filtro que se transforme de un espectrograma a otro y que la superposición agregue / guarde un filtro de convolución rápido? Quiero reconstruir el audio desde | S | para que pueda ver cuán efectivo es PCA Digamos que puedo reproducir dos clips, una señal de audio original y la otra reconstruida a partir de dimensiones inferiores | S | |S||S||S^|
user76170
2
Una matriz de espectrograma es con pérdida, por lo que no se puede utilizar para la reconstrucción. Pero si puede aplicar ingeniería inversa a una transformación para producir el espectrograma deseado, puede aplicarlo a los datos del dominio de tiempo original sin pérdidas o posiblemente al resultado complejo original FFT.
hotpaw2
ok, entonces lo que quieres decir es que puedo reconstruir la señal de audio del resultado complejo pero no solo usando la magnitud de la misma | S | . Porque he usado | S | para mi mayor procesamiento y reducción de dimesnionalidad, entonces la reconstrucción de la señal original no es posible, supongo. S|S||S|
user76170
1
@ user76170 En resumen, necesita el complejo STFT antes de poder reconstruir su señal. Si solo tiene la magnitud STFT, eso no es suficiente. Hay excepciones a esta regla, pero en general, necesita el STFT complejo, no solo la magnitud.
Tarin Ziyaee
|S||S^|
-1

Utilice el algoritmo Griffin-Lim para invertir la señal de audio del espectrograma, si no le preocupa la complejidad del cálculo.

Jitendra Dhiman
fuente
¿Puedes por favor ampliar tu respuesta un poco? Quizás agregar un documento o enlace representativo al algoritmo y una breve explicación de cómo es relevante para esta pregunta (?)
A_A
Si entiendo su pregunta correctamente, en resumen, desea reconstruir la señal de audio de un espectrograma sin utilizar la información de fase original. El algoritmo Griffin-Lim requiere una matriz de espectrograma como entrada y la fase de reconstrucción de forma iterativa. Puede consultar el documento ieeexplore.ieee.org/document/1164317
Jitendra Dhiman
Gracias por hacérmelo saber. Solo para aclarar este punto. Esta respuesta apareció en mi cola de revisión como "baja calidad". Las opciones que tengo en términos de una "revisión" incluyen proporcionar comentarios para la "mejora". Para que esta respuesta coincida con el tipo de respuestas que se encuentran comúnmente en DSP.SE, tendría que ir un poco al algoritmo Griffin Lim para mostrar cómo es relevante para lo que pregunta el OP. Cualquier edición futura, puede aplicarla directamente a su respuesta. El objetivo de esto no es satisfacer a "mí" en particular, es tener un conjunto significativo de respuestas esclarecedoras a una pregunta
A_A
La mejor respuesta está aquí (usando Griffin-Lim) en caso de que no tenga información FFT original. timsainb.github.io/…
Artemi Krymski