Nivel 5 · Lección 19

Sincrosqueezing: exprimir el espectrograma

La idea en una imagen

Cada punto es una casilla del espectrograma de una señal con una nota, un chirp que sube y un golpe, y lleva colgada una etiqueta: la velocidad real de la noria que tiene dentro. Al subir el control, cada punto sube o baja, solo en vertical, hasta la fila que dice su etiqueta. La nota y el chirp se aprietan hasta quedar en línea, y el golpe, cuya etiqueta es su propia fila, se queda tan ancho como estaba.

En la lección 18, la reasignación llevaba cada punto del espectrograma a su centro de gravedad, y las nubes de energía se contraían hasta quedar en líneas. Aquí cada casilla sigue conociendo la velocidad real de su noria, pero solo se mueve en vertical, dentro de su propia columna, hasta la fila que corresponde a esa velocidad.

Mira con calma lo que pasa con cada cosa. Los puntos de la nota y del chirp se juntan en una línea fina, mientras que los del golpe no tienen adónde ir, porque lo único que dice su etiqueta es la fila en la que ya están. Como ningún punto cambia de columna, la suma de cada columna es la misma antes y después de exprimir, y eso es lo que permite volver.

Paso a paso

La etiqueta de cada casilla

Cada casilla del espectrograma es una noria de prueba recortada por la ventana, como en la lección 11, y su flecha gira al ritmo de la noria de verdad que lleva dentro, no al de su fila, como se vio en la lección 18. Esa velocidad real, leída de lo que gira la flecha entre dos fotos, es la etiqueta de frecuencia de la casilla.

Las casillas de una misma mancha, por mucho que ocupen filas distintas, llevan la misma etiqueta, porque dentro de todas ellas está la misma noria. Una nota de 440 Hz dibuja en el espectrograma una mancha ancha que cubre decenas de hercios, pero cada casilla de esa mancha, mirada con su fase, dice 440 Hz. Esa fue la observación con la que nació el método: aunque la transformada se reparta en muchas filas, su comportamiento oscilante apunta a la frecuencia original.

La idea nació a mediados de los años noventa, cuando Ingrid Daubechies y Stéphane Maes buscaban analizar sonido con ideas tomadas de modelos del nervio auditivo, y la presentaron en 1996 con wavelets en lugar de la ventana deslizante de este curso. Aquí se sigue sobre todo la versión con ventana, que llegó poco después.

La columna de la imagen es un instante de dos notas, y cada casilla lleva su etiqueta dibujada como una flecha hacia la fila que dice. Toca, en el eje, las dos filas a las que apuntan las etiquetas de las dos manchas.

Exprimir en vertical, y por qué se puede volver

El sincrosqueezing, que viene de squeeze, exprimir, coge cada casilla con su número complejo entero, tamaño y fase, y la suma en la fila que dice su etiqueta, sin cambiarla de columna. La mancha de cada nota se aprieta hasta una línea, como un trapo mojado que se exprime solo hacia abajo. La reasignación hacía algo distinto: movía también en el tiempo, y guardaba solo la energía.

Que no se cambie de columna es lo que permite volver. Si en un instante sumas todas las casillas de la columna de la transformada, sale la muestra de la señal que está en el centro de esa ventana. Es la inversión por columnas, y mover casillas de fila dentro de su columna no cambia la suma. Por eso, tras exprimir, la suma de cada columna sigue devolviendo la señal, y si sumas solo la franja de reconstrucción alrededor de una línea, sale únicamente esa componente. La reasignación, que mueve valores de columna, rompe esa suma.

El método lo recuperó Daubechies con Jianfeng Lu y Hau-Tieng Wu en 2011, con wavelets y con teoremas: definieron con precisión qué señales son sumas de norias que cambian despacio y demostraron que el sincrosqueezing las separa, lo que la descomposición en modos de la lección 17 prometía sin poder demostrarlo. La versión sobre la transformada de Fourier de tiempo corto, la de los espectrogramas de este curso, la estudiaron Thakur y Wu en 2011, y Oberlin, Meignen y Perrier la bautizaron en 2014 como sincrosqueezing basado en Fourier.

Aprieta la energía hacia las líneas todo lo que puedas, sin estropear la señal que se recupera al sumar cada columna. Elige hacia dónde se mueve cada casilla y cuánto, y mira lo que devuelve la suma.

La apuesta: componentes separadas que cambian despacio

El sincrosqueezing hace una apuesta sobre la señal: que es una suma de norias que no se pisan y que cambian despacio. Si la apuesta se cumple, cada noria acaba en su línea, y si no, el truco falla. Las garantías valen para componentes cuyo tamaño y frecuencia varían despacio comparados con la ventana, y que están separadas en frecuencia más que la anchura de la mancha de una nota. Con una ventana gaussiana de 10 ms, eso son unos 37 Hz, y menos cuanto más larga es la ventana. Es una condición de separación parecida a la de la lección 12.

La otra condición es la modulación lenta. Si la noria acelera, la etiqueta que lee la casilla es la de un promedio de lo que pasa durante la ventana, y se queda a medio camino entre la frecuencia verdadera y la de la fila. Para un chirp lineal que sube α hercios por segundo y una ventana gaussiana de desviación σ, la parte del borrón que sobrevive a la compresión es lo que queda del borrón, que aquí se llama κ, y crece con q = 2π·α·σ²: con q pequeño casi todo se exprime, y con q grande casi nada. Cuanto más larga es la ventana, mejor se separan las notas, pero peor se exprime un chirp, y esa es la tensión del reto de abajo.

Encuentra una ventana con la que dos notas cercanas y un chirp queden finos a la vez, con más del 90 % de la energía junto a sus líneas. Después pulsa «Otra versión»: con notas más juntas y un chirp mucho más rápido, decide si existe alguna ventana que sirva.

Escuchar solo tu fundamental

Una voz con armónicos dibuja en el espectrograma una escalera de líneas, y cada línea es una noria. Si exprimes la imagen y sumas únicamente la franja de la línea más baja, la fundamental, recuperas esa noria sola, es decir, la misma voz sin sus armónicos, que suena como un silbido grave que sigue tu melodía. Con el espectrograma sin exprimir, una franja estrecha se deja fuera parte de la mancha y suena peor, y para que suene bien hace falta una franja tan ancha como la mancha, que empieza a meter otras cosas.

Para colocar la franja hay que saber por dónde va la línea en cada instante. Aquí se hace de la manera más sencilla: en cada columna se toma el máximo del espectrograma dentro de una banda de búsqueda que eliges, y la franja se centra en él. Cómo seguir una línea con garantías es la cuestión de la lección 20. La voz de este reto es sintética, y lleva algo de ruido de fondo.

Saca la fundamental de la voz con más de 25 dB de calidad usando una franja de 20 Hz o menos a cada lado. Fija entre qué frecuencias se busca la línea más baja, cuánto mide la franja y si se suma sobre la imagen exprimida o sobre la sin exprimir.

Cuando dos líneas se cruzan

Que el sincrosqueezing sea invertible no quiere decir que puedas reconstruir cualquier trozo de la imagen, porque lo que se suma son franjas en frecuencia dentro de cada instante. En un cruce, dos norias van a la misma velocidad en el mismo instante, sus dos líneas comparten franja y ninguna etiqueta puede decir de quién es cada trocito. Fuera del cruce, cada línea tiene su franja y se reconstruye muy bien.

Hay un último caso en que no sirve, el de un golpe. Para un golpe, la etiqueta de cada casilla es su propia fila, así que no se mueve nada, y en el tiempo sigue tan ancho como la ventana. La reasignación sí lo afina, porque mueve en el tiempo, y eso es parte de lo que se paga por poder volver.

Dos silbidos se cruzan: uno sube y otro baja. Toca el principio y el final del que sube para colocar su franja, escucha lo que sale y decide por qué se estropea el sonido cerca del cruce.

El ruido, y qué versión usar

El ruido también se exprime. El método no sabe qué es ruido y qué es señal, y mueve toda la energía según su etiqueta, de modo que el ruido se amontona en motas brillantes que pueden robarle la cresta a la línea. Está demostrado que el sincrosqueezing es robusto frente a perturbaciones acotadas y al ruido blanco gaussiano (Thakur, Brevdo, Fučkar y Wu, 2013), pero eso no quiere decir que haga milagros: si en la franja hay tanto ruido como línea, la línea se pierde igual que en el espectrograma, y buscar la cresta por máximos puede fallar algo más con el espectrograma exprimido que con el normal.

La versión con wavelets, la original, ve como un piano: la separación que pide entre componentes es relativa a su frecuencia, como las octavas de la lección 13. La versión con Fourier ve como una regla: pide la misma separación en hercios en todas partes, que es justo la que hay entre los armónicos de una voz. Por eso, para sacar armónicos de una voz, suele ir mejor la de Fourier.

Una línea sube de 600 a 800 Hz con una pequeña ondulación y se le añade ruido blanco. Baja la relación señal-ruido hasta encontrar la más baja con la que la cresta sigue sana, con menos del 5 % de los instantes equivocados.

En tu voz

Qué grabar. Una melodía corta, cantada o silbada: es el tramo 7 de la grabación de referencia de la serie. Con unos 3 segundos basta, y el laboratorio se queda con los 3 que tengan más sonido. Graba con el micrófono si tu navegador lo deja; si no, sube un audio grabado con el móvil o prueba con los ejemplos sintéticos.

Qué mirar. A un lado, el espectrograma, y al otro, el mismo espectrograma exprimido, con la misma ventana. Cantada, tu melodía debería salir como líneas finas: la fundamental y sus armónicos, todos con la misma forma. Después, el laboratorio busca la línea más baja, entre 80 y 500 Hz si cantas o entre 500 y 1.900 Hz si silbas, según elijas, suma su franja y te deja escuchar el original, tu fundamental sola y lo que queda al quitarla, que conserva el timbre y suena más hueco. Con una melodía silbada, la fundamental reconstruida es casi el original. Si tu fundamental es más débil que el segundo armónico, la línea salta a él y reconstruyes una octava por encima, que es el error de octava de la lección 20. En consonantes y silencios no hay línea, y una palmada sigue siendo una columna ancha, como es de esperar.

Lo que tienes que recordar

  1. Cada casilla del espectrograma lleva una etiqueta, la velocidad real de la noria que tiene dentro, y el sincrosqueezing mueve cada casilla, con su número complejo entero, a la fila de su etiqueta, sin cambiarla de columna. Las manchas se aprietan hasta líneas.
  2. Como no cambia nada de instante, la suma de cada columna se conserva y se puede volver a la señal: sumando la franja de una línea se recupera su componente sola. La reasignación, que mueve en el tiempo, pierde esa posibilidad.
  3. No rompe la incertidumbre, sino que se apoya en una suposición: componentes separadas en frecuencia más que la ventana y que cambian despacio. Falla con chirps rápidos, en los cruces, con mucho ruido y con los golpes. La pregunta que queda es cómo decidir por dónde va la línea en cada instante.

Errores típicos

Abrir

Rincón matemático

Las fórmulas, para quien las quiera. Cada una va después de su lectura en palabras.

El modelo

La señal es una suma de componentes con tamaño y frecuencia que cambian despacio:

x(t) = \sum_{k=1}^{K} A_k(t)\cos\big(2\pi\phi_k(t)\big), \qquad f_k(t) = \phi_k'(t)

Las condiciones

Con una ventana gaussiana de tamaño \sigma, en radianes por segundo, la frecuencia de cada componente cambia poco mientras dura la ventana, su tamaño cambia poco en una vuelta, y dos componentes distan más de dos veces la anchura de la ventana en frecuencia:

\sigma^2\,|\varphi_k''(t)| \le \varepsilon, \qquad |a_k'(t)| \le \varepsilon\,\varphi_k'(t), \qquad |\varphi_k'(t) - \varphi_l'(t)| \ge 2\Delta, \quad \Delta = \frac{\sqrt{2\ln 2}}{\sigma}

En hercios, la separación mínima entre dos componentes, con la desviación de la ventana en segundos, es:

|f_k - f_l| \ge \frac{\sqrt{2\ln 2}}{\pi\,\sigma}

La transformada de tiempo corto referida al centro de la ventana

La noria de prueba empieza a contar en el centro de la ventana:

\tilde V_x(t,f) = \int x(s)\,g(s-t)\,e^{-i2\pi f (s-t)}\,ds

La etiqueta

La frecuencia que dice la fase de cada casilla, calculada con la transformada de la derivada de la ventana, que coincide con cuánto gira la fase en el tiempo:

\hat f(t,f) = f - \frac{1}{2\pi}\,\operatorname{Im}\!\left\{\frac{V_x^{g'}(t,f)}{V_x^{g}(t,f)}\right\} = \frac{1}{2\pi}\frac{\partial}{\partial t}\arg \tilde V_x(t,f)

Exprimir

Cada casilla, con su número complejo, se suma en la fila de su etiqueta, en el mismo instante, y solo se usan las casillas cuyo tamaño supera un umbral \gamma:

T_x(t,f') = \frac{1}{g(0)}\int_{|\tilde V_x(t,f)|>\gamma} \tilde V_x(t,f)\;\delta\big(f' - \hat f(t,f)\big)\,df

La inversión por columnas

Sumando en frecuencia la transformada de un instante sale la señal en ese instante, multiplicada por g(0):

x(t) = \frac{1}{g(0)}\int \tilde V_x(t,f)\,df

En su versión discreta, con N casillas por columna y una señal real:

x[n] = \frac{1}{N\,g[0]}\Big(\tilde V[n,0] + \tilde V[n,\tfrac{N}{2}] + 2\,\operatorname{Re}\sum_{k=1}^{N/2-1}\tilde V[n,k]\Big)

Exprimir no cambia la suma de la columna

Moverse de fila dentro de la columna deja igual la suma de lo que supera el umbral:

\sum_{k'} T[n,k'] = \frac{1}{g[0]}\sum_{k:\,|\tilde V[n,k]|>\gamma} \tilde V[n,k]

Reconstruir una componente

Se suma solo la franja de anchura 2d alrededor de su línea, y con una señal real se toma el doble de la parte real:

x_k(t) \approx 2\,\operatorname{Re}\int_{|f - f_k(t)|<d} T_x(t,f)\,df

Lo que queda con un chirp

Con un chirp lineal de \alpha hercios por segundo y una ventana gaussiana, la etiqueta se queda entre la frecuencia verdadera y la de la fila, y la fracción del borrón que sobrevive es \kappa. Se deduce de la ecuación 17 de Auger y colaboradores (2013) y coincide con las simulaciones de esta lección:

\hat f = (1-\kappa)\,f_i(t) + \kappa\,f, \qquad \kappa = \frac{q^2}{1+q^2}, \qquad q = 2\pi\,\alpha\,\sigma^2

La versión con wavelets

La etiqueta es la velocidad de giro de la transformada wavelet en el tiempo, en cada fila de frecuencia se suman las escalas que apuntan a ella, y la señal sale sumando filas, con una constante que solo depende de la wavelet:

\omega(a,b) = -i\,\frac{\partial_b W_x(a,b)}{W_x(a,b)}, \qquad T_x(\omega_\ell,b) = \frac{1}{\Delta\omega}\sum_{a_k:\,|\omega(a_k,b)-\omega_\ell|\le\Delta\omega/2} W_x(a_k,b)\,a_k^{-3/2}\,(\Delta a)_k
x(b) \approx \operatorname{Re}\Big[C_\psi^{-1}\sum_\ell T_x(\omega_\ell,b)\,\Delta\omega\Big]

Con wavelets, la separación pedida es relativa:

|\varphi_k' - \varphi_{k-1}'| \ge d\,(\varphi_k' + \varphi_{k-1}')

Para saber más

Términos nuevos

Examen