Você está na página 1de 7

Deteccin del tono fundamental de la voz

Vzquez Nicols Jess Manuel Objetivo.


Desarrollar un software en Matlab, capaz de adquirir una seal 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 seal adquirida, apicando los conceptos vistos en clase.

Desarrollo
Las seales a analizar son seales de voz, provenientes de un archivo con extensin .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 tambin llamada Pitch, que nos brinda informacin referente a la velocidad a la que vibran las cuerdas vocales al producir la voz. Bsicamente lo que realiza el programa es adquirir una seal de voz, tomar un segmento y despus puede tomar 2 vertientes: 1) Realiza la autocorrelacion del segmento de seal 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 seal filtrada y nuevamente determina el tono fundamental. Por ultimo realiza la comparacin de las dos autocorrelaciones para observar los resultados. Lo anterior se ejemplifica en el diagrama a bloques que ser detallado ms adelante

Plot

Plot

Plot

Archivo .wav

Segmento 1

Frecuencia Fundamental

Filtro

Segmento 2

Frecuencia Fundamental

Plot

Plot

Diagrama 1. Sistema completo.

Plot

A continuacin se explicara con ms detalle cada uno de los bloques con un ejemplo del funcionamiento del software. 1) Archivo En esta etapa se adquiere la seal de voz, como ya se hizo mencin anteriormente, esta seal puede ser de un archivo previamente grabado o grabarse una nueva seal de voz. En este ejemplo se usara una nueva seal de voz de la palabra Caf, cuya grafica es:
Seal original
0.6

0.4

0.2

Amplitud

-0.2

-0.4

-0.6

-0.8

0.5

1.5

2.5 x 10
4

Tiempo

Figura 1. Seal de voz original.

En el caso que se capture una nueva seal de voz la frecuencia de muestreo por defecto es de 11025 Hz, y si se toma de un archivo esta es determinada por la funcin wread(). Las principales funciones de Matlab utilizadas en este bloque son: a) y=wavrecord(X*Fs,Fs); %%Permite grabar X segundos de fragmento de voz. b) wavwrite(y,Fs,Nombre); %% Guarda la seal de voz . c) y=uigetfile('*.wav'); %% Abre una ventana grafica para cargar un archivo. d) [y Fs]=wavread(y); %% Lee el archivo cargado por uigetfile guardndolo en y. Cabe mencionar que tambin se hace el clculo de la energa de la seal con las siguientes lneas de cdigo:
%%Calculo de la Energia de la seal for(i=1:length(y)) E=y(i)^2+E; end fprintf('La Energia de la seal es %d\n',E);

El resultado de la energa calculada para nuestra seal de prueba es: La Energia de la seal es 3.458573e+002 2) Segmento 1 y 2 En esta parte del cdigo bsicamente lo que se realiza es obtener una pequea muestra de la seal (40 ms) con el objetivo de hacer el anlisis sobre la misma. Esto se realiza ya que, aunque se podra tomar una muestra ms grande, computacionalmente hablando, es suficiente con una muestra de dicho tamao para realizar el anlisis. Para saber a partir de cual punto dentro de la grfica contar esos 40 ms, se hace uso de la funcin ginput(n) que nos devuelve n puntos tomados de una grfica. La nica diferencia entre el segmento 1 y el 2, es que el segmento 2 se hace pasar antes por un filtro pasabalas, que se explicara ms adelante, por lo cual se le eliminan sus frecuencias altas. El segmento seleccionado es graficado y se muestra en la siguiente figura:
Segmento
0.6 0.4 0.2

Amplitud

0 -0.2

-0.4

50

100

150

200 Tiempo

250

300

350

400

450

Segmento Filtrado
0.1 0.05 0

Amplitud

-0.05 -0.1

-0.15

100

200

300 Tiempo

400

500

600

Figura 2. Segmentos de voz c/s filtro.

Como se puede observar las seales son diferentes debido a la accin del filtro, ya que la original presenta las altas frecuencias y la segunda se filtr.

3) Filtro En esta etapa se implementa un filtro digital de tipo FIR. Los filtro FIR (Finite Impulse Response), es un tipo filtro digital que como su nombre lo indica, si la entrada es una seal impulso la salida tendr un numero finito de trminos no nulos. La estructura de este tipo de filtro se basa solamente en la combinacin lineal de las entradas actuales y anteriores, esto es:

( )

( )

Donde es el orden del filtro, que coincide con el nmero de trminos no nulos y con el nmero de coeficientes del filtro. Los filtros FIR tienen la gran ventaja de que pueden disearse para ser de fase lineal, lo cual hace que presenten ciertas propiedades en la simetra de los coeficientes. Adems son siempre estables. Por el contrario tambin tienen la desventaja de necesitar un orden mayor respecto a los filtros IIR para cumplir las mismas caractersticas. Esto se traduce en un mayor gasto computacional. En Matlab este tipo de filtro se puede implementar muy fcilmente con la funcin FIR1(N,Wn) la cual entrega un filtro pasa bajas de orden N, a la frecuencia de corete normalizada Wn. Cabe resaltar que la funcin FIR1, nos entrega la respuesta en el tiempo del filtro, es decir es necesario aplicar la convolucin con la seal a filtrar, ya que la convulicion en el dominio del tiempo equivale a una multiplicacin en el dominio de la frecuencia y visceversa. La convolucin es un operador matemtico que transforma dos funciones f y g en una tercera funcin que en cierto sentido representa la magnitud en la que se superponen f y una versin trasladada e invertida de g, esto es: ( ) ( ) ( ) ( ) (2)

Como se puede notar existe cierta similitud entre 1 y 2, y que como se menciono el proceso de filtrado implica una convolucin entre la respuesta temporal del filtro y la seal a filtrar.

En la siguiente figura se muestra a respuesta temporal y en frecuencia del filtro que se dise en Matlab con ayuda de la funcin FIR1 con un orden de 120 y una frecuencia de corte de 300 Hz.
Respuesta Temporal del filtro
0.06 0.05 0.04

Amplitud

0.03 0.02 0.01 0 -0.01 0 20 40 60 Tiempo 80 100 120 140

Respuesta en Frecuencia
1.4 1.2 1

Amplitud

0.8 0.6 0.4 0.2 0 0 1000 2000 3000 Frecuencia 4000 5000 6000

Figura 3. Respuesta temporal y en frecuencia del filtro.

Como se puede observar en segunda imagen de la figura anterior, tenemos la frecuencia de corte en los 300 Hz, existiendo una pequea banda de transicin con frecuencias alrededor de este valor. Tambin podemos visualizar que para frecuencias mayores los 300 Hz, la respuesta en frecuencia es nula, y ah es donde radica el efecto del filtro, ya que como se mencion una convolucin en el tiempo es una multiplicacin en la frecuencia por lo que las frecuencias de la seal mayores a los 300 Hz son nulificadas. Entonces en Matlab la convolucin se puede realizar mediante el comando conv(a,b) que realiza la convolucin entre A y B. De esta manera utilizando este comando y teniendo como parmetro A la seal a filtrar y como B la respuesta del filtro, el resultado de esta operacin se puede observar en la segunda imagen de la figura 2.

4) Frecuencia fundamental. Como ya se mencion con anterioridad lo que se busca realiza con este programa es determinar cual es la frecuencia fundamental de la seal de voz (si es que existe), y para ello se utiliza algo que es conocido como la autocorrelacion.

La funcin de autocorrelacin se define como la correlacin cruzada de la seal consigo misma. La funcin de autocorrelacin resulta de gran utilidad para encontrar patrones repetitivos dentro de una seal, como por ejemplo, la periodicidad de una seal enmascarada bajo el ruido o para identificar la frecuencia fundamental de una seal que no contiene dicha componente, pero aparecen numerosas frecuencias armnicas de esta. Entonces para la autocorrelacion tenemos que: () Donde ( )( )

es la seal a la cual se le desea calcular la autocorrelacion.

En Matlab existe dicha funcin, sin embargo en mi caso particular la calcule a partir de la definicin con el siguiente cdigo:
N=length(y2); Rxx=zeros(1,N); for m=1: N+1 for n=1: N-m+1 Rxx(m)=Rxx(m)+y2(n)*y2(n+m-1); end end Rxx=Rxx/Rxx(1);

Entonces se realiz el clculo de la autocorrelacion tanto para el segmento sin filtrar como el filtrado, obtenindose las siguientes graficas:
Autocorrelacion de la seal original
1 0.8 0.6

Amplitud

0.4 0.2 0 -0.2 -0.4 0 50 100 150 200 Frecuencia 250 300 350 400 450

Autocorrelacion de la seal filtrada


1

0.5

Amplitud

-0.5

-1

100

200

300 Frecuencia

400

500

600

Figura 4. Autocorrelacion

Se puede observar que la autocorrelacion de la seal filtrada es ms pura que de la seal sin filtrar, esto debido a que se eliminaron las altas frecuencias.

Por ltimo, se toma una muestra entre los 80 y 300 Hz, que es donde se encuentra localizada la frecuencia fundamental, esto se observa en la siguiente figura:
Rango de 80 a 300 hz seal original 1 0.8 0.6

Amplitud

0.4 0.2 0 -0.2 -0.4 0 50 100 Frecuencia Rango de 80 a 300 hz seal filtrada 1 150 200 250

0.5

Amplitud

-0.5

-1

50

100 Frecuencia

150

200

250

Figura 5. Autocorrelacion entre 80 y 300 Hz.

Entonces el programa nos arroja como resultado en el comand window: La Energia del segmento original es 1.589356e+001 La Energia del segmento filtrado es 2.715903e+000 La frecuencia fundamental es 132 La frecuencia fundamental es 132 Donde la primer frecuencia es de la seal original y la segunda de la filtrada, con lo que se concluye que, para este caso particular, tanta la seal original como la filtrada sirvieron para este clculo.

Conclusiones
Matlab es una herramienta muy importante en el anlisis de seales ya que nos provee de funciones que facilitan mucho el trabajo en el desarrollo de sistemas de PDS. Estas caractersticas permitieron desarrollar el trabajo y darme cuenta que estas son las bases para mltiples aplicaciones como el reconocimiento y caracterizacin de la voz, uno de los campos de estudio ms importantes dentro del PDS. Sin embargo es importante tambin conocer los fundamentos tericos ya que estos permitirn en su momento poder reescribir dichas funciones en otros lenguajes segn sean las necesidades del proyecto.

Você também pode gostar