Detección del tono fundamental de la voz

Vázquez Nicolás Jesús Manuel Objetivo.
Desarrollar un software en Matlab, capaz de adquirir una señal de voz, ya sea de un archivo o grabarla en el momento, con la finalidad de obtener el tono fundamental (si es que existe) de un fragmento de 40 ms de dicha señal adquirida, apicando los conceptos vistos en clase.

Desarrollo
Las señales a analizar son señales de voz, provenientes de un archivo con extensión .wav que es el formato de Windows y que se adquieren por un solo calan (mono). Lo que buscamos obtener es la frecuencia fundamental de la voz o también llamada Pitch, que nos brinda información referente a la velocidad a la que vibran las cuerdas vocales al producir la voz. Básicamente lo que realiza el programa es adquirir una señal de voz, tomar un segmento y después puede tomar 2 vertientes: 1) Realiza la autocorrelacion del segmento de señal de voz, y de ahí determina la frecuencia fundamental 2) Aplica un filtro FIR pasabajas con una frecuencia de corte de 300 Hz, para eliminar las altas frecuencias asociadas al ruido ambiente y otros factores, y aplica la autocorrelacion sobre la señal filtrada y nuevamente determina el tono fundamental. Por ultimo realiza la comparación de las dos autocorrelaciones para observar los resultados. Lo anterior se ejemplifica en el diagrama a bloques que será detallado más adelante

Plot

Plot

Plot

Archivo .wav

Segmento 1

Frecuencia Fundamental

Filtro

Segmento 2

Frecuencia Fundamental

Plot

Plot

Diagrama 1. Sistema completo.

Plot

d) [y Fs]=wavread(y). .Nombre). En este ejemplo se usara una nueva señal de voz de la palabra “Café”.6 -0.5 2 2.wav'). En el caso que se capture una nueva señal de voz la frecuencia de muestreo por defecto es de 11025 Hz. %% Abre una ventana grafica para cargar un archivo. esta señal puede ser de un archivo previamente grabado o grabarse una nueva señal de voz.2 -0. %% Guarda la señal de voz . Señal de voz original. %%Permite grabar X segundos de fragmento de voz. Las principales funciones de Matlab utilizadas en este bloque son: a) y=wavrecord(X*Fs. 1) Archivo En esta etapa se adquiere la señal de voz.5 x 10 4 Tiempo Figura 1. y si se toma de un archivo esta es determinada por la función wread(). como ya se hizo mención anteriormente. b) wavwrite(y. end fprintf('La Energia de la señal es %d\n'.E).8 0 0.6 0.4 0.5 1 1.Fs.A continuación se explicara con más detalle cada uno de los bloques con un ejemplo del funcionamiento del software.4 -0.2 Amplitud 0 -0. %% Lee el archivo cargado por uigetfile guardándolo en y. cuya grafica es: Señal original 0. c) y=uigetfile('*.Fs). Cabe mencionar que también se hace el cálculo de la energía de la señal con las siguientes líneas de código: %%Calculo de la Energia de la señal for(i=1:length(y)) E=y(i)^2+E.

2 Amplitud 0 -0.1 0.6 0.2 -0. computacionalmente hablando. Esto se realiza ya que.El resultado de la energía calculada para nuestra señal de prueba es: “La Energia de la señal es 3. se hace uso de la función “ginput(n)” que nos devuelve “n” puntos tomados de una gráfica. por lo cual se le eliminan sus frecuencias altas. que se explicara más adelante.4 0 50 100 150 200 Tiempo 250 300 350 400 450 Segmento Filtrado 0. Segmentos de voz c/s filtro.05 -0. aunque se podría tomar una muestra más grande. es que el segmento 2 se hace pasar antes por un filtro pasabalas. Para saber a partir de cual punto dentro de la gráfica contar esos 40 ms.4 0. La única diferencia entre el segmento 1 y el 2.05 0 Amplitud -0.1 -0. El segmento seleccionado es graficado y se muestra en la siguiente figura: Segmento 0. . ya que la original presenta las altas frecuencias y la segunda se filtró. Como se puede observar las señales son diferentes debido a la acción del filtro. es suficiente con una muestra de dicho tamaño para realizar el análisis.15 0 100 200 300 Tiempo 400 500 600 Figura 2.458573e+002 2) Segmento 1 y 2 En esta parte del código básicamente lo que se realiza es obtener una pequeña muestra de la señal (40 ms) con el objetivo de hacer el análisis sobre la misma.

Los filtro FIR (Finite Impulse Response). esto es: ( ) ∑ ( ) ( ) Donde es el orden del filtro.3) Filtro En esta etapa se implementa un filtro digital de tipo FIR. esto es: ( ) ( ) ∑ ( ) ( ) (2) Como se puede notar existe cierta similitud entre 1 y 2. Los filtros FIR tienen la gran ventaja de que pueden diseñarse para ser de fase lineal. si la entrada es una señal impulso la salida tendrá un numero finito de términos no nulos. La convolución es un operador matemático que transforma dos funciones f y g en una tercera función que en cierto sentido representa la magnitud en la que se superponen f y una versión trasladada e invertida de g. ya que la convulicion en el dominio del tiempo equivale a una multiplicación en el dominio de la frecuencia y visceversa. En Matlab este tipo de filtro se puede implementar muy fácilmente con la función “FIR1(N. a la frecuencia de corete normalizada “Wn”. y que como se menciono el proceso de filtrado implica una convolución entre la respuesta temporal del filtro y la señal a filtrar. . lo cual hace que presenten ciertas propiedades en la simetría de los coeficientes. Además son siempre estables. es un tipo filtro digital que como su nombre lo indica. La estructura de este tipo de filtro se basa solamente en la combinación lineal de las entradas actuales y anteriores. Esto se traduce en un mayor gasto computacional. Cabe resaltar que la función FIR1. que coincide con el número de términos no nulos y con el número de coeficientes del filtro. es decir es necesario aplicar la convolución con la señal a filtrar. nos entrega la respuesta en el tiempo del filtro.Wn)” la cual entrega un filtro pasa bajas de orden “N”. Por el contrario también tienen la desventaja de necesitar un orden mayor respecto a los filtros IIR para cumplir las mismas características.

2 1 Amplitud 0. Entonces en Matlab la convolución se puede realizar mediante el comando “conv(a.6 0.01 0 20 40 60 Tiempo 80 100 120 140 Respuesta en Frecuencia 1.b)” que realiza la convolución entre A y B.8 0.En la siguiente figura se muestra a respuesta temporal y en frecuencia del filtro que se diseñó en Matlab con ayuda de la función FIR1 con un orden de 120 y una frecuencia de corte de 300 Hz. Como se puede observar en segunda imagen de la figura anterior.02 0.04 Amplitud 0.2 0 0 1000 2000 3000 Frecuencia 4000 5000 6000 Figura 3. el resultado de esta operación se puede observar en la segunda imagen de la figura 2. 4) Frecuencia fundamental. De esta manera utilizando este comando y teniendo como parámetro A la señal a filtrar y como B la respuesta del filtro. También podemos visualizar que para frecuencias mayores los 300 Hz.4 0. y para ello se utiliza algo que es conocido como la autocorrelacion. Como ya se mencionó con anterioridad lo que se busca realiza con este programa es determinar cual es la frecuencia fundamental de la señal de voz (si es que existe).03 0. ya que como se mencionó una convolución en el tiempo es una multiplicación en la frecuencia por lo que las frecuencias de la señal mayores a los 300 Hz son nulificadas. la respuesta en frecuencia es nula. Respuesta Temporal del filtro 0.06 0.4 1. . existiendo una pequeña banda de transición con frecuencias alrededor de este valor.01 0 -0.05 0. y ahí es donde radica el efecto del filtro. tenemos la frecuencia de corte en los 300 Hz. Respuesta temporal y en frecuencia del filtro.

la periodicidad de una señal enmascarada bajo el ruido o para identificar la frecuencia fundamental de una señal que no contiene dicha componente. Entonces se realizó el cálculo de la autocorrelacion tanto para el segmento sin filtrar como el filtrado. end end Rxx=Rxx/Rxx(1).8 0. for m=1: N+1 for n=1: N-m+1 Rxx(m)=Rxx(m)+y2(n)*y2(n+m-1). como por ejemplo. La función de autocorrelación resulta de gran utilidad para encontrar patrones repetitivos dentro de una señal. .5 Amplitud 0 -0.4 0.N). pero aparecen numerosas frecuencias armónicas de esta.5 -1 0 100 200 300 Frecuencia 400 500 600 Figura 4. sin embargo en mi caso particular la calcule a partir de la definición con el siguiente código: N=length(y2).2 0 -0. Rxx=zeros(1. obteniéndose las siguientes graficas: Autocorrelacion de la señal original 1 0.4 0 50 100 150 200 Frecuencia 250 300 350 400 450 Autocorrelacion de la señal filtrada 1 0.6 Amplitud 0. Entonces para la autocorrelacion tenemos que: () Donde ∑( )( ) es la señal a la cual se le desea calcular la autocorrelacion. esto debido a que se eliminaron las altas frecuencias. Autocorrelacion Se puede observar que la autocorrelacion de la señal filtrada es más “pura” que de la señal sin filtrar.2 -0. En Matlab existe dicha función.La función de autocorrelación se define como la correlación cruzada de la señal consigo misma.

Conclusiones Matlab es una herramienta muy importante en el análisis de señales ya que nos provee de funciones que facilitan mucho el trabajo en el desarrollo de sistemas de PDS. se toma una muestra entre los 80 y 300 Hz.6 Amplitud 0. esto se observa en la siguiente figura: Rango de 80 a 300 hz señal original 1 0. tanta la señal original como la filtrada sirvieron para este cálculo. uno de los campos de estudio más importantes dentro del PDS.5 -1 0 50 100 Frecuencia 150 200 250 Figura 5. para este caso particular.Por último.5 Amplitud 0 -0.4 0 50 100 Frecuencia Rango de 80 a 300 hz señal filtrada 1 150 200 250 0. Sin embargo es importante también conocer los fundamentos teóricos ya que estos permitirán en su momento poder reescribir dichas funciones en otros lenguajes según sean las necesidades del proyecto. . Estas características permitieron desarrollar el trabajo y darme cuenta que estas son las bases para múltiples aplicaciones como el reconocimiento y caracterización de la voz.715903e+000 La frecuencia fundamental es 132 La frecuencia fundamental es 132 Donde la primer frecuencia es de la señal original y la segunda de la filtrada. con lo que se concluye que. que es donde se encuentra localizada la frecuencia fundamental.2 -0.8 0. Autocorrelacion entre 80 y 300 Hz. Entonces el programa nos arroja como resultado en el comand window: La Energia del segmento original es 1.4 0.2 0 -0.589356e+001 La Energia del segmento filtrado es 2.