He estado leyendo fragmentos en línea, pero simplemente no puedo juntarlo todo. Tengo algunos conocimientos previos de señales / DSP que deberían ser requisitos previos suficientes para esto. Estoy interesado en eventualmente codificar este algoritmo en Java, pero aún no lo entiendo completamente, por eso estoy aquí (cuenta como matemática, ¿verdad?).
Así es como creo que funciona junto con las lagunas en mi conocimiento.
Comience con su muestra de voz de audio, digamos un archivo .wav, que puede leer en una matriz. Llame a esta matriz , donde varía de (entonces muestras). Supongo que los valores corresponden a la intensidad de audio: amplitudes.n 0 , 1 , … , N - 1 N
Divida la señal de audio en distintos "cuadros" de 10 ms aproximadamente, donde suponga que la señal de voz es "estacionaria". Esta es una forma de cuantización. Entonces, si su frecuencia de muestreo es 44.1KHz, 10 ms es igual a 441 muestras, o valores de .
Haz una transformación de Fourier (FFT por el bien de la computación). Ahora, ¿se hace esto en toda la señal o en cada cuadro separado de ? Creo que hay una diferencia porque, en general, la transformada de Fourier analiza todos los elementos de una señal, por lo que unió a unido con donde son los cuadros más pequeños. De todos modos, digamos que hacemos algo de FFT y terminamos con por el resto de esto.F ( x [ n ] ) ≠ F ( x 1 [ n ] ) F ( x 2 [ n ] ) … F ( x N [ n ] ) x i [ n ] X [ k ]
Mapeo a la escala Mel, y registro. Sé cómo convertir números de frecuencia regulares a la escala Mel. Para cada de (el "eje x" si me lo permite), puede hacer la fórmula aquí: http://en.wikipedia.org/wiki/Mel_scale . Pero, ¿qué hay de los "valores y" o las amplitudes de ? ¿Siguen siendo los mismos valores pero cambiaron a los puntos apropiados en el nuevo eje Mel (x-)? Vi en algún artículo que había algo acerca de registrar los valores reales de porque si donde se supone que una de esas señales es ruido, no desea , la operación de registro en esta ecuación convierte el ruido multiplicativo en ruido aditivo, que con suerte se puede filtrar (?).
Ahora el paso final es tomar un DCT de su modificado desde arriba (sin embargo, terminó siendo modificado). Luego tomas las amplitudes de este resultado final y esos son tus MFCC. Leí algo sobre tirar valores de alta frecuencia.
Así que estoy tratando de resolver cómo calcular a estos tipos paso a paso, y claramente algunas cosas me están eludiendo desde arriba.
Además, escuché sobre el uso de "bancos de filtros" (una serie de filtros de paso de banda básicamente) y no sé si esto se refiere a hacer los cuadros a partir de la señal original, o tal vez haces los cuadros después de la FFT.
Por último, ¿hay algo que vi sobre los MFCC que tienen 13 coeficientes?
fuente
Respuestas:
Paso a paso...
1. y 2 . Esto es correcto. Tenga en cuenta que los marcos generalmente se superponen, por ejemplo, el marco 0 son muestras de 0 a 440; el cuadro 1 son muestras 220 a 660; el marco 2 son muestras 440 a 880 y así sucesivamente ... Observe también que se aplica una función de ventana a las muestras en el marco.
3 . La transformación de Fourier se realiza para cada cuadro. La motivación detrás de esto es simple: una señal de voz varía con el tiempo, pero es estacionaria en segmentos cortos. Desea analizar cada segmento corto individualmente, porque en estos segmentos la señal es lo suficientemente simple como para ser descrita eficientemente por unos pocos coeficientes. Piensa en alguien que dice "hola". No desea ver todos los fonemas contraídos en un solo espectro (FFT contrae la información temporal) analizando todo el sonido a la vez. Desea ver "hhhhheeeeeeeeeeelloooooooooo" para reconocer la palabra etapa por etapa, por lo que debe dividirse en segmentos cortos.
4 . "Mapear a la escala Mel" es engañoso y probablemente es por eso que te estás confundiendo. Una mejor descripción para este paso sería: "Calcule la energía de la señal a través de un banco de filtros sintonizados a frecuencias de escala de mel". Así es como se hace esto. Consideramos frecuencias (un valor usado comúnmente es ) igualmente espaciadas de acuerdo con la escala de mel, entre 20 Hz (parte inferior del rango de audición) y la frecuencia de Nyquist. Ejemplo práctico: la señal se muestrea a 8kHz y queremos 40 bins. Como 4kHz (Nyquist) es 2250 mel, las frecuencias centrales del banco de filtros serán: 0 mel, 2250/39 mel, 2 x 2250/39 mel .. 2250 mel.norte norte= 40
Una vez que se han definido estas frecuencias, calculamos una suma ponderada de las magnitudes FFT (o energías) alrededor de cada una de estas frecuencias.
Mire la siguiente imagen, que representa un banco de filtros con 12 contenedores:
El octavo bin tiene una frecuencia central de alrededor de 2 kHz. La energía en el octavo contenedor se obtiene sumando energías FFT ponderadas en el 1600 a 2800 Hz aproximadamente, con un pico de peso de alrededor de 2kHz.
Nota de implementación: este conjunto de sumas ponderadas se puede hacer en una sola operación: una multiplicación matricial de una "matriz de banco de filtros" por el vector de energías FFT.
Entonces, en esta etapa, hemos "resumido" el espectro FFT en un conjunto de 40 (12 en la ilustración) valores de energía, cada uno correspondiente a un rango diferente de frecuencias. Tomamos el registro de estos valores.
5 . El siguiente paso consiste en tomar el DCT de esta secuencia de 40 log-energías. Esto producirá 40 valores. Los primeros coeficientes son el MFCC (por lo general, ). En realidad, el primer coeficiente DCT es la suma de todas las energías logarítmicas calculadas en el paso anterior, por lo que es una medida general del volumen de la señal y no es muy informativo sobre el contenido espectral real de la señal; a menudo se descarta para aplicaciones de reconocimiento de voz o identificación de altavoces donde el sistema tiene que ser robusto a las variaciones de volumen.K K= 13
fuente
39 mel
viene el paso 4?