Prácticas de laboratorio
Práctica 3:
Análisis en el Dominio
Espectral
1. INTRODUCCIÓN
El objetivo de la práctica es programar funciones en C, dentro del entorno LTVWIN, para la estimación espectral de la voz y la extracción de información por varios métodos. En concreto:
• Estimación espectral basada en la FFT • Estimación espectral mediante análisis LPC
• Cálculo de las frecuencias fundamental y formantes.
Estas funciones se aplicarán sobre señales reales con el objetivo de evaluar los resultados con diferentes parámetros de cálculo (tamaño de las ventanas, desplazamiento, etc...). Podrán emplearse dos tipos de ventana: rectangular y de Hamming.
Los dos tipos de ventana que se emplearán en la estimación espectral son la rectangular y la de Hamming. Las ecuaciones que las definen son las siguientes:
El entorno LTVWin llamará a la siguiente función para que construya la ventana de análisis cuando se seleccione el tipo de ventana o al cambiar su tamaño.. Prográmela con el siguiente prototipo:
FICHERO: AnalisisEspectral.cpp
VOZDLL_API long TipoVentana( tipo, float *v, ndatos)
int tipo; // 0 - Rectangular 1 - Hamming float *v; // Array donde se construye la ventana int ndatos; // Tamaño de la ventana
{
return ndatos; // Devuelve el tamaño de la ventana }
1.2 Estimación espectral mediante la FFT - Fast Fourier Transform
El cálculo espectral basado en FFT es un método genérico de estimación del espectro de una señal cualquiera sin utilizar ningún modelo o conocimiento previo de su naturaleza. Para su programación, los pasos que deben seguirse son:
• Aplicar el tipo de ventana seleccionada (se recomienda la de Hamming)
• Calcular la FFT
• Estimar el módulo de cada una de las componentes complejas de la transformada:
Para resolver este ejercicio dispondrá del algoritmo FFT ya programado con el siguiente prototipo:
void FFT(real, imag, Npuntos)
float *real, *imag; // Arrays de datos
Int Npuntos; // Tamaño de la ventana Las condiciones de uso de esta función son tres:
• Los resultados se devuelven sobre los mismos arrays de entrada:
real e imag.
• El tamaño máximo de los arrays es 4096
• El tamaño de los arrays debe ser una potencia de 2.
Programe la función para la estimación espectral con el siguiente prototipo:
FICHERO: AnalisisEspectral.cpp
VOZDLL_API void EnergiaFFT(data, npuntos, energia)
float *data; // Datos del audio
1.3 Estimación espectral mediante análisis LPC
La estimación espectral LPC propone un modelo de producción de voz lineal y predictivo, a partir del cual podemos separar la señal de excitación de los efectos producidos por el tracto vocal (resonancias). Esta separación permite una mejora en la estimación de las propiedades de una y de otra. Dicho modelo se muestra en la figura:
En este apartado pretendemos obtener la envolvente LPC del espectro, o lo que en teoría, correspondería a las propiedades debidas a las resonancias en el tracto vocal. Siguiendo el método de correlación estudiado en teoría, los pasos a programar son los que se indican: Seleccionada una ventana de longitud L:
1. Calcular P+1 coeficientes de autocorrelación
2. Utilizando los coeficientes calculados, se resuelve la matriz tipo Topelitz.:
Como puede apreciarse, esta matriz contiene de dorma simétrica los p+1 coeficientes de autocorrelación previamente calculados:
n n n
Ö (0), Ö (1),... Ö (p),
El método Levison-Durbin explota la simetría de la matriz para optimizar las operaciones. Con el prototipo que se indica, en la práctica ya dispone de dicho algoritmo programado:
int MetodoDurbin(float *A, float *LPC_coef, int P)
// Calcula los coeficientes LPC y devuelve el número de // coeficientes realmente calculados
float *A; // Vector con los P+1 coeficientes de
n n
//autocorrelación Ö (0), ... Ö (p) float *LPC_coef; // Devuelve los coeficientes LPC
int P; // Número de coeficientes del vector de // Autocorrelación
3. Con los coeficientes (LPC) se construye la secuencia:
2.
4. Se aplica la FFT a dicha secuencia con la resolución o tamaño de ventana que se desee (npuede ser diferente de L)
5. Se calcula la operación:
• Donde G es la Ganancia o volumen del tracto vocal. Su valor podemos estimarlo siguiendo el algoritmo de XXX por el cual:
Programe la función con el siguiente prototipo
1.4 Estimación de los primeros formantes.
Localizar los primeros formantes puede facilitar la clasificación del sonido emitido. Programe una función para localizar los tres primeros máximos a partir de la envolvente obtenida del apartado anterior. Utilice el siguiente prototipo:
El entorno mostrará sobre el analizador espectral los valores F1, F2 y F3.
FICHERO: AnalisisEspectral.cpp
VOZDLL_API void EspectroLPC(float *data, int npuntos, int ncoef,\ float *envolvente, int puntosEnvolvente)
// Calcula la envolvente LPC del espectro float *data; // Datos de audio
int npuntos; // Tamaño de la ventana de análisis int P; // Número de coeficientes a calcular float *envolvente; // Array con el resultado de la envolvente
// espectral LPC
int puntosEnvolvente; // Número de puntos con los que trazar // la envolvente
{
// No devuelve nada }
FICHERO: AnalisisEspectral.cpp
VOZDLL_API void Formantes(env, envPoints, F0, F1, F2, fm) float *env; // Array con la envolvente espectral int envPoints; // Número de puntos de la envolvente int *F0;
int *F1;
int *F2; // Punteros donde se devuelven los datos // calculados
float fm; // Frecuencia de muestreo {
// No devuelve nada }
2. CUESTIONES
Para comprobar el comportamiento de la FFT como herramienta de análisis espectral, se han incluido ficheros:
onda_150_450_1225.wav Compuesta por señales de 150 Hz, 450Hz y 1225Hz
onda_150_250_1225.wav Compuesta por señales de 150 Hz, 250Hz y 1225 Hz
Compruebe la exactitud con la que la FFT mide la frecuencia de las señales de prueba contestando las siguientes cuestiones:
1) ¿Cual es el paso mínimo que se mide con el analizador?. Justifique si este valor se debe al número de puntos de la ventana de análisis o a la resolución de la presentación en pantalla.
2) Mida la composición de la señal onda_150_450_1225 empleando la FFT partiendo de los siguientes parámetros de análisis:
Tamaño de la ventana 250
Desplazamiento 32
Tipo de ventana Hamming
a) Aumente el tamaño de la ventana, y justifique por qué algunas frecuencias de la señal se observan más claramente que otras. b) Repita las medidas empleando el espectro LPC y la búsqueda de
los tres primeros máximos.
c) Aumente el número de coeficientes LPC hasta 40, y compruebe el comportamiento del algoritmo de búsqueda de los máximos espectrales. Modifíquelo como crea más apropiado.
d) Utilizando las señales mezcladas y teniendo en cuenta los resultados anteriores, analice los capacidad de la FFT para separar las frecuencias componentes de la señal.
6) Utilice ahora la señal onda_150_250_1525.wav, y partiendo de un tamaño de ventana de 128, y de 20 coeficientes LPC, compruebe la capacidad de separación de frecuencias formantes de los métodos FFT y LPC. Aumente el tamaño hasta un máximo de 2048.
El resultado anterior demuestra que la resolución del análisis LPC depende del número de coeficientes. Para análisis de señales de voz se acepta como regla empírica la siguiente:
• Un coeficiente por KHz de la frecuencia de muestreo • Dos más por cada formante a localizar
Utilice esta regla analizando los ficheros de voz incluidos en la carpeta AUDIOGENERAL.