Segmentación y Realce de Señales de Voz Usando la Transformada Wavelet y DSP’s por Doubert Geovanny Sánchez Marín Director: Jorge Iván Marín Hurtado Modalidad: Proyecto de Grado ARMENIA UNIVERSIDAD DEL QUINDIO FACULTAD DE INGENIERIA PROGRAMA DE INGENIERIA ELECTRONICA 2004 Índice General Agradecimientos iii 1 Introducción 1 2 Características Acústicas 3 2.1 Realización Fonética ………………………………………………… 3 2.2 Clasificación de los Fonemas ………………………………………. 4 2.2.1 Fonemas Consonánticos ………………………………… 4 2.2.2 Fonemas Vocálicos ………………………………………. 6 2.3 Características del Oído ……………………………………………. 7 2.3.1 El Oído como Analizador de Frecuencias ………………… 8 2.4 Audiometría …………………………………………………………. 9 2.4.1 Componentes de un audífono ………………………………11 3 Transformada Wavelet 13 3.1 Introducción ………………………………………………………… 13 3.2 Repaso a la Transformada de Fourier ………………………………. 14 3.3 ¿Qué Son Las Wavelet? ……………………………………………. 15 3.4 Transformadas Wavelet …………………………………………….. 16 3.4.1 Transformada Wavelet Continua (CWT) ………………… 18 3.4.2 La Transformada Wavelet Discreta (DWT) ……………… 20 3.4.2.1 Transformada Wavelet Rápida (FWT) …………. 23 3.4.2.2 Algoritmo de la Transformada Wavelet Rápida …25 4 Sistema de Segmentación 4.1 Implementación del Sistema de Segmentación de Fonemas en MATLAB …………………………………………………… 4.1.1 Adquisición de la Señal de Voz ……………………….... 4.1.2 Preprocesamiento ……………………………………….. 4.1.3 Extracción de Características …………………………... 4.1.3.1 Trasformada Wavelet ……………………………. 4.1.3.2 Selección de la Wavelet Madre …………………. 4.1.3.3 Wavelet Denoising ……………………………… 4.1.3.4 Normalización …………………………………... 4.1.3.5 Energías Sub-bandas ……………………………. 2 26 27 30 31 32 32 34 35 35 36 4.1.4 Reglas de Selección …………………………………….. 37 4.1.5 Realce de la Señal ……………………………………… 44 4.1.6 Transformada Wavelet Inversa ………………………… 44 5 Implementación en el DSP 46 5.1 Captura y Pre-procesamiento de la Señal …………………………… 48 5.2 Conversión de Datos ………………………………………………... 49 5.3 Función Procesar Segmento ………………………………………… 49 5.4 Pruebas de Desempeño ……………………………………………… 52 6 Conclusiones 54 7 Proyecciones 55 Bibliografía 56 A Código fuente para MATLAB 58 A.1 Código fuente del programa principal …………………………………….. 58 B Código fuente para el DSP TMS320C6701 61 B.1 Código fuente del programa principal ……………………………………… 61 B.2 Código fuente función que procesa el segmento …………………………… 62 B.2.1 Archivo de cabecera segmentación.h …………………………….. 62 B.2.2 Archivo fuente segmentación.c …………………………………… 63 3 Índice de Figuras 1.1 Sistema de Segmentación ……………………………………………………. 1 2.1a Esquema del Aparato Fonador Humano ......………………………………. 4 2.1b Esquema aproximado de la producción de la voz ………………………… 4 2.2 El Oído Humano …………………………………………………………… 7 2.3 Membrana basilar "estirada" ……………………………………………….. 8 2.4 Banco de filtros de escalas de Mel ………………………………………….. 9 2.5 Audiograma ………………………………………………………………….. 10 2.6 Audífono Intracanal ………………………………………………………… 11 3.1 Desplazamiento de ventana para la STFT …………………………………. 15 3.2 Inconvenientes de la STFT …………………………………………………. 15 3.3 Izquierda wavelet a diferentes escalas, derecha traslación de wavelet ……. 16 3.4 Graficas de algunas wavelet madre. ………………………………………... 18 3.5 Variable escala ……………………………………………………………… 20 3.6 Proceso de análisis en diferente escala y traslación (a) escala fija a 1 y traslación variante ………………………………….. 21 (b) escala fija a 20 y traslación variante …………………………………. 21 3.7 Planos de Tiempo-Frecuencia analizado con la TW ……………………….. 22 3.8 Planos Tiempo-Frecuencia para (a) STFT (b) TW …………………………. 22 3.9 Transformada Wavelet Rápida (FWT) o Algoritmo de Mallat …………….. 24 3.10 Diagrama de bloques de la descomposición multiresolución de una señal por medio de la transformada wavelet. (a) Banco de análisis …………………………………………………….. 24 (b) síntesis ………………………………………………………………. 24 3.11 Respuesta en frecuencia del banco de filtros Wavelet …………………… 25 4.1 Sistema de Segmentación de Señales Propuesto en el Proyecto 195 ………. 4.2 Estructura del Sistema de Segmentación ………………………………….. 4.3 Esquema en memoria del vector de muestras a filtrar …………………….. 4.4 Diagrama de flujo de la simulación en MATLAB ………………………… 4.5. Análisis por bloque del filtro pre-énfasis ………………………………… 4.6 Bloque de Extracción de Características ………………………………….. 4.7 Análisis de Descomposición por nivel en Matlab ………………………… 4.8 Descomposición de un Bloque X = 512 datos de la señal en niveles de detalle y uno de aproximación ………………………………. 4.9 Bloque de normalización …………………………………………………… 4.10 Palabra “mata” etiquetada ………………………………………………… 4.11 Detección de segmentos de silencio en la palabra ‘mata’ ………………… 4 27 27 28 29 32 32 33 33 36 38 39 4.12 Esquema de la Transformada Wavelet Inversa, para recuperar un bloque de 512 datos ……………………………………………………... 45 4.13 Señal de la palabra “mata” recuperada ……………………………………... 45 5.1 Técnica de doble buffer usando DMA para captura de un bloque de 64ms con su respectivo análisis y reproducción ………………………………. 47 5.2 Diagrama de flujo del programa principal y la ISR ………………………….48 5.3 Esquema en memoria del vector de muestras a filtrar ………………………. 50 5 Índice de Tablas 2.1 Clasificación de las consonantes de acuerdo a su articulación …………….. 6 2.2 Clasificación de los fonemas vocálicos ……………………………………. 6 4.1 Ejemplos de algunas muestras de voz previamente capturadas ……………. 31 4.2 Número de coeficientes entregados por cada nivel de la wavelet con los coeficientes que se analizan y los que sirven de condiciones iniciales para los siguientes bloques ……………………………………………… 34 4.3 Rango de frecuencias ……………………………………………………….. 34 4.4 Umbral de ruido para cada nivel ……………………………………………. 35 4.5 Número de Coeficientes de cada nivel en un bloque de 512 muestras de la señal para el Cálculo de las Energías …………………………………… 36 4.6 Etiquetado Manual de la palabra “mata” …………………………………… 37 4.7 Cambio de energía entre segmentos por banda …………………………….. 38 5.1 Tiempos promedio de ejecución de las funciones dentro de la rutina del servicio de interrupción …………………………………………….. 52 5.2 Tiempos promedio de ejecución de conversión de los datos ……………….. 53 5.3 Tiempo total de la ISR ……………………………………………………… 53 6 Capitulo 1 Introducción Este trabajo plantea una aplicación al sistema de segmentación propuesto por el grupo GDSPROC de la Universidad del Quindío. El objetivo fundamental es diseñar un sistema automático de realce de voz por medio de la segmentación de señales utilizando la Transformada Wavelet. El proceso de segmentación juega un papel muy importante en aplicaciones que corresponden a la construcción de sistemas de reconocimiento continuo de voz y al realce de las señales de voz, en audífonos para personas con deficiencias auditivas, en donde está enfocado nuestro trabajo. Partiendo de las investigaciones realizadas por el Grupo de Procesamiento Digital de Señales GDSPROC en el proyecto 195, apéndice D [Hur03], en el cual plantean el sistema de segmentación de señales mostrado en la figura 1.1, proponemos una aplicación que realza los segmentos de la señal identificados, con el fin de ser utilizados en sistemas de apoyo a personas con deficiencias auditivas. El proyecto consiste en segmentar una señal de voz independiente del hablante y de las condiciones de captura, con el fin de identificar segmentos de fonemas sonoros, sordos y de silencio por medio de la Transformada Wavelet, la cual descompone la señal en diferentes bandas de frecuencia, se analizan en sub-bloques de 4ms, la evolución de la energía en cada banda y se establecen reglas de selección para identificar los segmentos. Una vez identificados estos segmentos se efectúa en ellos un realce en las diferentes bandas de frecuencia por medio de un factor de escala que dependerá del tipo de segmento identificado y/o la banda a realzar, finalmente se recupera la señal con las características antes mencionadas y libre de ruido, por medio de la transformada wavelet inversa. Figura 1.1 Sistema de Segmentación 7 Para la implementación del proyecto en tiempo real se empleó un DSP TMS320C6701 de la Texas Instrument [Tex00]. Finalmente contaremos con el criterio de una persona con limitaciones auditivas en cuanto al funcionamiento del sistema y las posibles mejoras para el futuro. El planteamiento del trabajo es el siguiente: Capítulo 2 (Características Acústicas): Analizaremos una visión global de cómo se producen los sonidos, como están clasificados los fonemas y cuales son las características del oído. Capítulo 3 (Transformada Wavelet): Presentaremos la teoría necesaria para comprender las ventajas de la Transformada Wavelet con respecto a la Transformada de Fourier en el análisis de señales. Capítulo 4 (Sistema de Segmentación): Se hará una descripción del sistema de segmentación, así como su implementación en Matlab y los resultados obtenidos en la simulación con señales previamente capturadas. Capítulo 5 (Implementación en el DSP): En este capítulo explicaremos las rutinas utilizadas en C++ para la implementación en tiempo real del sistema, el costo computacional del software y el criterio de un paciente con limitaciones auditivas. Capitulo 6 (Conclusiones): Desarrollamos las conclusiones fundamentales del trabajo presentado. Capítulo 7 (Proyecciones): Plantearemos los posibles trabajos futuros que se puedan derivar de este proyecto o que sirvan de complemento para otros trabajos. Apéndice A (Código Fuente para Matlab): Presentaremos todo el código fuente en Matlab para la simulación del sistema expuesto en el capítulo 4. Apéndice B (Código Fuente del Sistema en Tiempo Real): Expondremos el código en C desarrollado para la implementación del sistema en tiempo real en un DSP TMS320C6701. 8 Capítulo 2 Características Acústicas Un fonema es una unidad del habla y un conjunto de fonemas determina los sonidos con los cuales se pueden construir palabras en un lenguaje determinado. Por otro lado, un alófono es una de las diferentes pronunciaciones para un fonema en particular. El fonema es una abstracción y realmente no puede ser pronunciado excepto en términos de uno de sus alófonos [Dal69]. Tomando en cuenta lo anterior se puede decir que en cualquier lenguaje el número de fonemas es obviamente más pequeño que el número de fonos o alófonos. Tenemos la idea ortográfica de que es muy fácil separar la palabra “mesa” en cuatro sonidos: /m/e/s/a/, pero físicamente es un continuo de principio a final. Como Consecuencia, en la vocal /e/ hay elementos de la /m/ y de la /s/. Además, para poder hablar de prisa no llegamos a efectuar los movimientos completos, y los dejamos a medias. Por esas y otras razones, el reconocimiento automático de fonemas no es tan fácil como uno quisiera. 2.1 Realización Fonética Los sonidos se producen cuando el aire espirado por los pulmones llega hasta la laringe, donde se encuentran las cuerdas vocales. Estas cuerdas vocales son dos músculos gemelos, elásticos, que vibran cuando el aire espirado pasa por ellas. Es entonces cuando se produce el sonido que llamamos voz (figura 2.1a). La voz pasa a la cavidad bucal o la cavidad nasal, donde los órganos, principalmente los de la boca, configuran y matizan los diversos sonidos en el habla [Cas99]. Los fonemas se realizan por medio de sonidos. Los encargados de producir esos sonidos, de realizarlos fonéticamente son los órganos de fonación. La señal de voz se limita a una banda de frecuencias que va desde 300 Hz hasta 3300 Hz. A pesar de esto, tal señal no está compuesta únicamente por tonos puros en esa gama de frecuencias, ya que adicionalmente, la voz posee otro componente representado en un proceso de ruido blanco gaussiano con una densidad espectral de potencia también ubicada en la gama de 300 Hz a 3300 Hz. Los tonos puros, conocidos como “pitchs”, corresponden a los fonemas sonoros (vocales); en cambio, la señal de ruido blanco, corresponde a los fonemas sordos (consonantes), El tracto vocal es modelado como un sistema que modifica la se˜nal (sonora o sorda) proveniente de la laringe, actuando generalmente como un filtro del tipo todo polos (AR) [DJH00] [PM98]. Finalmente el modelo aproximado que representa la producción de la señal de voz y el tracto vocal se muestra en la figura 2.1b. 9 2.2 Clasificación de los Fonemas Los sonidos están divididos en dos grupos principales: Consonantes: Si la corriente de aire es detenida u obstruida. Vocales: Si el aire sale libremente. Figura 2.1(a) Esquema del Aparato Fonador Humano Figura 2.1b Esquema aproximado de la producción de la voz 2.2.1 Fonemas Consonánticos Se producen sonidos consonánticos cuando el aire al salir encuentra un obstáculo, ya sea cerrándole totalmente el paso, o dejándole una estrechez por donde pasa con fricción. Para clasificar a las consonantes se tendrá en cuenta el concepto de articulación. Se entiende por articulación de un sonido la posición adoptada por los órganos de la cavidad bucal en el momento de producirse un sonido. 10 En la producción y clasificación de las consonantes hay que tener en cuenta los siguientes factores: 1. Lugar de articulación. 2. Manera de articulación. 3. Articulaciones sonoras o sordas. Lugar de Articulación Para el idioma Español hay nueve lugares de articulación para las consonantes: 1. Bilabial. El labio inferior contra o cerca del labio superior. Ejemplo: [m] en más. 2. Labiodental. El labio inferior contra o cerca del borde de los dientes frontales superiores. Ejemplo: [f] en fuente. 3. Dental. Posición de la lengua contra el borde o atrás de los dientes superiores frontales. Ejemplo: [d] en dar. 4. Alveolar. Posición de la lengua contra o cerca de la zona alveolar. Ejemplo: [l] en luna. 5. Palatal. Posición de la lengua contra o cerca del paladar duro. Ejemplo: [c] en chico. 6. Velar. Dorso de la lengua contra o cerca del velo. Ejemplo: [k] en calor. 7. Bilabio−velar. El labio inferior cerca del labio superior y al mismo tiempo el dorso de la lengua cerca del velo. Ejemplo: [w] en hueso. 8. Uvular. Dorso de la lengua contra el uvula. Ejemplo: [rr] en carro. 9. Glotal. Movimiento de cuerdas vocales. Ejemplo: [h] en jardín. Manera de Articulación Independientemente de cual sea la zona o punto de articulación, los órganos adoptan una postura o una posición al producir los fonemas. A esto se le llama modo de articulación. En español hay seis maneras de articulación en las consonantes. 1. Oclusivas. En algún punto de la articulación del sonido la corriente de aire queda detenida y después es liberada con una pequeña explosión. Ejemplo: [p] en pasar. 2. Fricativas. La corriente de aire, sin ser detenida, es forzada a través del tracto vocal existiendo un cierre parcial, provocando que el aire salga con turbulencia. 3. Africativas (Oclusiva + Fricativa). La corriente de aire es detenida como en una oclusiva; pero en lugar de ser liberada abruptamente, es liberada con fricción como en un fricativo. 4. Nasales. El velo es bajado y la corriente de aire pasa a través de la cavidad nasal con gran resonancia. Ejemplo: [m] en más. 5. Semivocales. La cavidad oral es cerrada a la mitad, pero la corriente de aire escapa por ambos lados del lugar de articulación. [l] en luna. 6. Vibrantes. La posición de la lengua, bajo tensión, conecta el alveolar una vez que la corriente de aire pasa a través del tracto vocal. Ejemplo: [r] en pero y [rr] en perro. Articulaciones Sonoras o Sordas Todo fonema, sea cual sea su punto o manera de articulación, puede producirse con vibraciones de las cuerdas vocales o sin ellas. 11 • • Sonoros, si las cuerdas vocales se aproximan y comienzan a vibrar. Tendremos que separar los sonidos vocálicos, de los consonánticos. Sordos, si las cuerdas vocales se acercan entre si pero no llegan a vibrar. Fonemas Sonoros s, j, f, ch, p, t, k Fonemas Sordos b, d, g, m, n, ñ, l, r, rr, y Tabla 2.1 Clasificación de las consonantes de acuerdo a su articulación 2.2.2 Fonemas Vocálicos Con las vocales, la posición de la lengua y la forma en que se posiciona la boca determinan su timbre. Debido a que el aire no es bloqueado o detenido, no hay contacto entre los articuladores superiores e inferiores. En su lugar, la posición de la lengua es significante debido a que cambia el tamaño y forma de la cavidad oral. Acústicamente, cuando pronunciamos una vocal hay unas bandas de frecuencia que se amplifican más según donde pongamos la lengua: una A, por ejemplo, se articula de forma más estrecha en la zona de la faringe y más ancha en la zona de la boca, lo cual lleva a la amplificación de un tramo de frecuencia que está alrededor de los 700Hz, y otro de los 1300Hz. Estos tramos se conocen como formantes. Hay tres posiciones verticales de la lengua, las cuales determinan el grado de abertura de la cavidad oral: Alto, cuando la lengua está cerca del paladar; medio, cuando la lengua se encuentra a la mitad de la boca; y bajo. También hay tres posiciones de la lengua de frente hacia atrás: Anterior, cuando la parte alta de la lengua está muy cerca del alveolar; central, cuando la parte más alta de la lengua está en el centro de la cavidad oral; y posterior, donde la parte más alta de la lengua, el dorso, está muy cerca del velo. Por esto se puede clasificar a las vocales en un cuadro bidimensional. En español hay cinco posiciones principales. Alto Medio Bajo Anterior i e Central Posterior u o a Tabla 2.2 Clasificación de los fonemas vocálicos Las vocales son de mayor duración que las consonantes y están bien definidas espectralmente. Por esto las vocales usualmente son fáciles de reconocer y contribuyen significativamente al proceso de reconocimiento de voz. De acuerdo a la manera en que el tracto vocal se configure se determinan las frecuencias de resonancia del tracto (las formantes) y por ello el sonido se produce. Las vocales se identifican por sus formantes, las cuales son muy fuertes durante todo el fonema. 12 El principal motivo para la clasificación de los fonemas de acuerdo a su manera y lugar de articulación es para poder más adelante hacer experimentos en los cuales se agrupan los fonemas para efectos de mejoras en el reconocimiento. 2.3 Características del Oído La audición es el resultado de una serie de procesos acústicos, mecánicos, nerviosos y mentales dentro de la combinación oído/cerebro que dan a una persona la impresión de sonido [Ber69]. El oído consta de tres partes principales (figura 2.2): · · · El oído externo El oído medio El oído interno Figura 2.2: El Oído Humano El oído externo Los sonidos del mundo exterior son recogidos por el oído externo, el cual está formado por el pabellón auricular (la oreja) y el conducto auditivo externo. Cuando las ondas sonoras penetran en el oído, el conducto auditivo externo incrementa la sonoridad de los tonos que nos ayudan a comprender el habla. Al mismo tiempo el conducto auditivo externo (1) protege otra parte importante del oído: el tímpano (2) – una membrana flexible, circular que vibra cuando es alcanzada por las ondas sonoras. El oído medio Las vibraciones del sonido continúan su viaje hacia el oído medio, que contiene tres pequeños huesos llamados yunque, martillo y estribo (3, 4, 5). Estos hacen de puente entre el tímpano y el oído interno. Incrementan y amplifican las vibraciones del sonido aún mas, antes de transmitirlas sin peligro hacia el oído interno vía la ventana oval. 13 El oído interno El oído interno o cóclea, similar a la concha circular de un caracol, alberga un sistema de tubos que están rellenos de un fluido acuoso. Cuando las ondas sonoras pasan a través de la ventana oval (6), el fluido empieza a moverse, haciendo que unos pequeños cilios se muevan a su vez. Posteriormente, estos cilios transforman las vibraciones en impulsos eléctricos que viajan por el nervio auditivo (9) hasta el mismo cerebro. Aún se desconoce cómo traduce el cerebro estos impulsos nerviosos. 2.3.1 El oído como analizador de frecuencias Como se ve en la figura 2.3, la membrana basilar se estira por la cóclea. Esta membrana varía en masa y rigidez a lo largo de su longitud. En el extremo más próximo a la ventana oval y al tímpano, la membrana es rígida y ligera, así que su frecuencia de resonancia es alta. En el extremo distante, próximo al ápice, la membrana es pesada y suave, y resuena a baja frecuencia. El rango de frecuencias de resonancia disponible determina el rango de frecuencias de la audición humana, que va desde los 20Hz hasta los 20KHz, sin embargo, en la práctica sólo llega hasta los 16 KHz, siendo las frecuencias más audibles las ubicadas en el medio del espectro, aproximadamente entre 1 KHz y 4 KHz.. Figura 2.3. Membrana basilar "estirada" Frecuencias diferentes en la entrada de sonido causan que diferentes áreas de la membrana basilar vibren. Cada área tiene diferentes terminaciones nerviosas para permitir discriminar el tono. El comportamiento resonante de la membrana basilar es un paralelo exacto con el comportamiento de un analizador de espectros; la parte de dicha membrana que resuena como resultado de la aplicación de un sonido es una función de la frecuencia. Según estudios realizados por Bark y Mel [MMO95], encontraron una relación no lineal entre la frecuencia entrante al oído y la que éste realmente percibe. Tales estudios se resumen en dos ecuaciones empíricas que relacionan estas dos frecuencias: 0.76 f f2 f bark ( f ) = 13 arctan + 3.5 arctan (2.1) 100 7500 2 14 1+ f (2.2) 700 Donde esta última es la más usual en aplicaciones del tratamiento de la voz. A partir de esta concepción caprichosa adoptada por nuestro oído, es posible desarrollar un banco de filtros que analice la señal de voz, no en una escala lineal, sino usando las escalas de Mel. La respuesta en frecuencia del banco de filtros de Mel se muestra en la figura 2.4. f mel = 2595 log Figura 2.4: Banco de filtros de escalas de Mel 2.4 Audiometría Es un conjunto de pruebas para medir la audición, se lleva a cabo de dos formas [Mar99]: Vía aérea: Se llama de esta manera cuando se evalúa la habilidad para oír sonidos transmitidos a través del aire. Se usan unos auriculares para presentar los sonidos. Vía ósea: Evalúa la capacidad para oír el sonido a través de los huesos de la cabeza. Se usa un altavoz especial que transmite vibraciones. La audiometría convencional suele usar tonos puros. Un tono puro se compone de una única frecuencia de estimulación. Se suelen utilizar las frecuencias correspondientes a las octavas comprendidas entre 125 y 8000 Hertzios o Hz (125, 250, 500, 1000, 2000, 4000 y 8000 Hz), en total 8 frecuencias. Las frecuencias medias, es decir, las comprendidas entre 500 y 2000 Hz, son las más importantes para la audición de la palabra ya que en dicho rango se sitúan la mayoría de los fonemas que componen la voz humana. La audiometría se realiza mediante la utilización de un aparato electrónico denominado audiómetro. Dicho aparato se compone de un generador de estímulos que son transmitidos al individuo a través de unos auriculares aplicados estrechamente al oído, o un vibrador aplicado al hueso situado inmediatamente detrás del mismo (mastoides). En cualquier audiometría se van a realizar dos tipos de mediciones. Por un lado vamos a estudiar el umbral audiométrico a través de la vía aérea, esto es, utilizando el auricular aplicado al pabellón auditivo, y por otro a través de la vía ósea, mediante la aplicación de un vibrador al hueso de la mastoides. En el primero de los casos, el ruido debe transmitirse a través del conducto auditivo externo (donde se forman los tapones de cera), a través del oído medio (donde están los huesecillos más pequeños del cuerpo), y del oído interno, más conocido como caracol, hasta llegar al 15 nervio auditivo y al cerebro. En el caso de la estimulación por vía ósea se prescinde tanto del oído externo como del medio, produciéndose una estimulación directa del oído interno a través de los huesos del cráneo. Para realizar una audiometría, bien mediante la estimulación aérea (con auriculares) u ósea (con vibrador), se introduce normalmente a la persona en una cabina aislada acústicamente, de forma que el ruido de estimulación no se mezcle con el ruido ambiente de la sala de exploración. Seguidamente se le van presentando al paciente correlativamente ruidos (tonos puros) de diferentes frecuencias, como hemos mencionado anteriormente, comprendidas entre 125 y 8000 Hz. El explorador solicita a la persona que es explorada que levante la mano o bien apriete un indicador cuando oiga, por poco que sea, cada una de las estimulaciones, de forma que para cada una de las frecuencias vamos obteniendo su umbral auditivo. La audiometría se representa en una gráfica llamada audiograma la cuál viene definida por un eje de ordenadas dividido en intervalos de 10 dBs. y un eje de abscisas donde se sitúan los diferentes tonos que utilizamos para estimular, desde los más graves (125 y 500 Hz) hasta los más agudos (4000 y 8000 Hz). Una vez realizadas las 8 mediciones, éstas se anotan en el audiograma (ver figura 2.5). Figura 2.5 Audiograma La audiometría es normal cuando cumple dos premisas: • Todos los umbrales audiológicos se sitúan en todas las frecuencias por debajo de los 20 dBs. • No hay una diferencia superior a 5 dBs. entre las respuestas obtenidas mediante la estimulación con los auriculares por vía aérea y el vibrador óseo. 16 Evidentemente la audiometría es anormal cuando no se cumple alguna de las dos premisas anteriores. Si los umbrales se sitúan por encima de 20 dBs estaremos hablando de una pérdida auditiva, o hipoacusia que podrá afectar: • A las frecuencias graves (125-250 Hz). • A las frecuencias intermedias (500-2000 Hz). • A las frecuencias agudas (2000-8000 Hz). • A todas ellas (hipoacusia pantonal). El grado de dicha pérdida puede denominarse: • Leve (umbral entre 20 y 40 dBs.). • Moderada (umbral entre 40 y 60 dBs.). • Severa (umbral entre 60 y 80 dBs.). • Profunda (umbral mayor de 80 dBs.). Cuando los umbrales en el audiograma se sitúan por encima de los 20 dBs. las diferencias de la conducción ósea y la vía aérea nos van a permitir intuir que porción, de todos los elementos que intervienen en la audición, no está funcionando de forma correcta. 2.4.1 Componentes de un audífono Todos los audífonos (figura 2.6) constan de tres componentes importantes. Permanecen juntos en una funda protectora que suele ser de plástico. Figura 2.6 Audífono Intracanal • Micrófono El micrófono recoge los sonidos del aire y los convierte en señales eléctricas. • Amplificador El amplificador aumenta la intensidad de las señales del micrófono. Los filtros modifican los sonidos de modo que sólo se amplifican aquellos que son importantes para la persona. • Altavoz El tercer componente básico es el "altavoz" (receptor). Convierte las señales eléctricas en acústicas, que la persona puede oír. 17 • Microordenador Estos tres componentes se encuentran en todos los audífonos. Además, en los audífonos digitales, por ejemplo, se puede programar un microordenador para manipular las señales y adaptarse a la pérdida de audición de la persona con una deficiencia de audición en particular. Algunos audífonos están equipados con controles de volumen y otras funciones de control, que se pueden utilizar para realizar ajustes individuales. 18 Capítulo 3 TRANSFORMADA WAVELET 3.1 INTRODUCCIÓN Durante la última década, la transformada wavelet ha sacudido las matemáticas aplicadas y la investigación en ingeniería, demostrado ser de gran utilidad como herramienta de procesamiento. El interés en la transformada wavelet ha aumentado conforme las aplicaciones se han hecho más numerosas y se está convirtiendo en parte de los futuros estándares en el análisis de señales y compresión de imagen y video. La teoría de las wavelets es una herramienta matemática reciente, basada en la Teoría de Conjuntos y la representación en funciones integrables cuadráticas, que permiten presentar una señal o un campo tanto en escala, espacio y posibles direcciones [Jal00]. La Transformada Wavelet es también conocida como “el microscopio matemático” [ADJ03], que tiene como antecedente la Transformada de Fourier, la cual es útil cuando se estudian señales con propiedades estadísticas constantes en el tiempo o en el espacio, dado que ésta representa una señal como una superposición de sinusoides (con duración infinita en el tiempo), con diferentes frecuencias, donde los coeficientes de Fourier miden la contribución de las sinusoides a esas frecuencias. De forma similar, la transformada de wavelet representa una señal como una suma de wavelet con diferentes localizaciones y escalas. Los coeficientes de wavelet esencialmente cuantifican la fuerza de la contribución de las wavelets a esas localizaciones y escalas, su característica principal es la multiresolución, lo que permite el cambio de escala, constituyendo un medio adecuado para el análisis de señales no estacionarias, sobre todo aquellas que presentan transiciones abruptas. Sin embargo, las señales reales tienen usualmente propiedades estadísticas que cambian con el tiempo y parece más natural emplear funciones localizadas o “wavelet” para representar estas señales en lugar de funciones seno y coseno. De esta manera, la representación de señales no estacionarias como suma de un conjunto de funciones base localizadas 19 temporalmente permite obtener una representación más compacta y precisa de las propiedades de la señal que la obtenida utilizando series de Fourier. Existen dos tipos de wavelet: las continuas y las discretas. El tratamiento con wavelet discretas analiza la señal a diferentes bandas de frecuencia con diferentes resoluciones al descomponer la señal en aproximaciones y detalles, empleando para ello dos conjuntos de funciones: las funciones de escalamiento y las funciones wavelet respectivamente, ésta permite una aplicación directa a procesos computacionales. Las wavelet continuas presentan por una parte la dificultad de su manejo al tener que evaluar un gran número de integrales y tener en consecuencia una redundancia de información, pero por otra parte permiten la flexibilidad de poder adaptarse a situaciones en las que las discretas no dan un resultado satisfactorio. Algunas propiedades de las wavelet son las siguientes: • Las wavelet son bloques constructores de funciones. Es decir, podemos expresar cualquier función f en términos de wavelet. • Las wavelet tienen localización espacial y de frecuencia. • Con las wavelet es posible implementar algoritmos rápidos de cálculo para la transformada. Esto es más practico que teórico. 3.2 Repaso de la Transformada de Fourier La Teoría de Wavelet trabaja de manera similar que la Teoría de Fourier, la cual dice que una señal se compone de una serie de funciones sinusoidales y de ésta forma es más sencillo su análisis. Recordando un poco, la Transformada de Fourier (FT) de la señal x(t) está definida por la ecuación 3.1 : ∞ FT ( f ) = −i 2πft ( ) x t e dt ∫ (3.1) −∞ La transformada de Fourier trabaja bien si la señal x(t) está compuesta de unos cuantos componentes estacionarios [ALA03], pero se puede observar en FT(f) se ha perdido totalmente la dependencia temporal de la señal original, es decir, no tenemos información del instante de tiempo en el cual un acontecimiento determinado ocurre en la señal, lo implica una gran falencia ante la necesidad de analizar una señal no estacionaria como la voz. Para contrarrestar estas desventajas se ha modificado la Transformada de Fourier dando origen a lo que es la Short Time Fourier Transform (STFT) también conocida como la transformada de Gabor. La STFT aplica una función g(t) utilizada como ventana de análisis que se mueve sobre x(t) para determinar el espectro en cada instante de tiempo, ver figura 3.1 y 3.2. La expresión que nos permite este análisis es: ∞ STFT (b , f ) = ∫ x (t ) g * ( t − b ) e − iπ 2 ft dt −∞ (3.2) Donde el parámetro b indica la posición en el tiempo en la que se hace el análisis y * denota el complejo conjugado. La desventaja que presenta esta transformada es que la ventana de análisis es de un tamaño fijo (figura 3.1), por lo existe un límite de precisión y resolución y por eso no puede adaptarse a las características de la señal en ciertos puntos 20 interesantes de analizar, ya que puede proveer poca información espectral o en algunos casos redundar en esta información. Por ejemplo, cuando la ventana está ubicada en el instante de tiempo T = 0, la STFT puede determinar con precisión la frecuencia de la señal presente en este segmento, dado a que la longitud de la ventana abarca más de un período completo (Figura 3.2a), sin embargo, cuando la ventana se ubica en T = T1, no se logra abarcar un período completo, y por ende no es posible determinar con precisión el contenido de frecuencia de este segmento de tiempo (Figura 3.2b). En pocas palabras, la STFT puede resolver con buena resolución el contenido de altas frecuencias pero es incapaz de hacerlo para regiones que involucren frecuencias más bajas de lo que permita la longitud de la ventana, es así como, para un análisis de mejor resolución frecuencia-tiempo, se prefiere emplear un tipo de transformada que presente una longitud variable de la ventana, tal es el caso de la Transformada Wavelet [Hur02b]. Figura 3.1: Desplazamiento de ventana para la STFT (a) (b) Figura 3.2: Inconvenientes de la STFT Por lo visto anteriormente es que ha cobrado tanta fuerza la Teoría de las Wavelet, dado que mantiene las ideas principales de un análisis tiempo-frecuencia utilizando una ventana de análisis diferente. 3.3 ¿Qué son las wavelet? Las wavelet son un conjunto de familias de funciones ortonormales básicas que no requieren ser de duración infinita, por lo que se dice que son ondas localizadas y su comportamiento en el dominio de la frecuencia equivale a un banco de filtros pasa-bandas, examinando a la señal de interés para obtener sus características de espacio y tamaño [Teo98]. La característica de las wavelet es la posible dilatación o contracción (figura 3.3), que consiste en la variación de un parámetro a llamado factor de escala, en la función generadora de la wavelet, alargando su duración en el tiempo y modificando su amplitud, lo que permite modificar su respuesta en frecuencia y se define por: 21 ψ a ,b 1 (t ) = t − b ψ a a (3.3) donde a, b∈R, a ≠ 0 y ψ (t ) es la “wavelet madre”, que se considera una función pasa banda, a esa función madre se le agregan un par de variables que son la escala ‘a’ que permite hacer las dilataciones y contracciones de la señal y la variable de traslación ‘b’, que nos permite mover a la señal en el tiempo. Estas variables son números reales y obviamente para una escala de ‘a’= 0 la wavelet no existirá y el análisis se indeterminará. 2 f (t ) = ψ (t ); a = 1 1 0 -1 0 5 10 15 1 0 -1 -2 0 5 10 f (t ) = ψ (2t ); a = 1 2 f (t ) = ψ (4t ); a = 1 4 15 2 0 -2 0 5 10 15 Figura 3.3: Izquierda wavelet a diferentes escalas, derecha traslación de wavelet La Wavelet ψ (t ) debe satisfacer las siguientes condiciones: 1. Ser una señal de energía, 2 ∫ψ (t ) dt < ∞ . 2. Exhibir una pequeña oscilación, de tal forma que tenga media cero. Existe un sin número de funciones ψ (t ) que cumplen las condiciones anteriormente mencionadas, de las cuales las más sobresalientes fueron desarrolladas por científicos como: Alfred Haar, Ingrid Daubechies, Jean Morlett, Ronald Coifman, Yves Meyer, entre otros. En la figura 3.4 se muestran algunas. El objetivo primordial de la Transformada Wavelet, es el representar una señal o función x(t), como la combinación lineal de un número infinito de wavelet escaladas (dilatadas o contraídas) y desplazadas a lo largo de toda la señal [MYG97], 3.4 Transformada Wavelet Las Transformadas Wavelet Comprenden la Transformada Continua de Wavelet y la Transformada Discreta de Wavelet. Estas son las herramientas matemáticas que permiten el análisis de señales de manera muy similar como lo hace la Transformada de Fourier de 22 Tiempo Corto dando información en el dominio del tiempo y en el dominio de la frecuencia. 1.51 0.8 1 0.6 0.5 0.4 0 0.2 -0.5 0 -1 -0.2 -1.5 -0.4 0 -8 0.1 0.2 -6 -4 0.3 0.4 -2 0.5 0 0.6 2 0.7 0.8 4 0.9 6 1 8 Wavelet Haar Wavelet Mexican Hat 1.5 1 0.5 0 -0.5 -1 -1.5 0 1 2 3 4 5 6 7 8 9 Wavelet Daubechies de orden 5 2 1.4 1.2 1.5 1 0.8 1 0.6 0.4 0.5 0.2 00 -0.2 -0.5 -0.40 0 0.5 0.5 1 1.5 1 2 2.5 1.5 3 2 3.5 4 2.5 4.5 3 5 Wavelet symmlet de orden 2 Wavelet Coiflet de orden 1 23 11 0.8 0.5 0.6 0.4 0 0.2 0 -0.5 -0.2 -0.4 -1 -0.6 -0.8 -1.5 -10 -8 -6 -4 5 -2 0 10 2 4 6 15 8 Wavelet Daubechies 8 Wavelet Morlet Figura 3.4: Graficas de algunas wavelet madre. 3.4.1 Transformada Wavelet Continua (CWT) La Transformada Wavelet Continua es un operador lineal que asocia un número real o complejo, a una señal de energía finita, con una función particular “ψ ”denominada wavelet madre, una vez seleccionado el instante y la escala de observación. Permite así analizar estructuras de la señal que dependen del tiempo y de la escala, siendo una herramienta útil para detectar, caracterizar y clasificar señales con características espectrales extravagantes, contenidos transitorios y otras propiedades relacionadas con la falta de estacionariedad. Sea x(t) una señal del espacio L2(R) y ψ una wavelet madre, para la que más tarde se darán especificaciones. Las denominadas wavelet analizadoras se construyen partiendo de ψ ,, realizando sobre ella operaciones de traslación en el tiempo y dilatación, de forma que la posicionan y la dilatan hasta conseguir el efecto de análisis deseado. Para a, b ∈ R, a > 0, se define la familia de funciones de test o de wavelet analizadoras en la forma: ψ a ,b (t ) = t −b ψ a a 1 (3.4) Los coeficientes de la transformada wavelet de la señal x(t) respecto de la wavelet madre ψ son los productos escalares de x con las funciones de test: CWT x ( a , b ;ψ ) = x ,ψ a ,b = ∞ * t − b ( ) x t ψ dt ∫ a a −∞ 1 (3.5) El parámetro ‘b’ desliza la wavelet en busca de información local y el parámetro ‘a’ controla el ‘tamaño’ de la wavelet (a≠0), de forma que cuando a tiende a 0, se obtiene algo parecido a un ‘zoom’ del comportamiento de la señal x(t) en torno al instante t = b, la variable de escala ‘a’ puede ser vista como a = f / fo donde fo denota la frecuencia central 24 de la wavelet. De esta manera tendremos que la ecuación (3.5) se puede expresar también de la siguiente manera: CWT x ( f , b ;ψ ) = x ,ψ a ,b ∞ * f dt ( ) − t b ( ) ψ x t ∫− ∞ fo f fo = (3.6) De esta forma esta transformada permite la representación de la señal x(t) en el plano tiempo escala. Lo siguiente es explicar como: la CWT transforma la señal de un dominio a otro que depende de 2 variables. La variable escala lleva en si la información de la dilatación y la contracción de la señal (figura 3.5), pero podría verse desde otro punto de vista donde lo que cambia es la frecuencia y con ello al dilatarse, la frecuencia se reduce y al contraerse, la frecuencia aumenta. Aquí es justamente donde se aprovecha está característica de las wavelet para obtener la información de la señal y conocer sus componentes de frecuencia. En el dominio del tiempo el análisis es más sencillo ya que la variable de traslación tiene la información de tiempo (figura 3.6), pues nos indica en que lugar del eje del tiempo, se encuentra la wavelet. De este modo se van completando los datos en forma de una matriz, donde para cada integral que resolvamos tendremos un punto del plano traslación-escala, que es equivalente a tener la información en el plano tiempo-frecuencia [Her03]. Es importante aclarar que el proceso de transformación de una señal es reversible debido a que se preserva la energía de la señal, lo que se conoce con el nombre de Transformada Wavelet Inversa Continua (ICWT), que está dada por la ecuación 3.7: x (t ) = 1 CΨ ∫∫ t−b CWT ( a , b )ψ a 2 a dbda (3.7) donde la constante C Ψ (denominada condición de admisibilidad) depende sólo de la función wavelet madre ψ (t ) , de acuerdo con: C Ψ = 2π ∞ ∧ ∫ ψ (ξ ) −∞ 2 ξ −1 dξ < ∞ (3.8) Sin embargo la Transformada Wavelet de Tiempo Continuo no se presta para aplicaciones prácticas donde las señales se representan de manera discreta. 25 Figura 3.5: Variable escala 3.4.2 Transformada Wavelet Discreta (DWT) Partiendo de la ecuación (3.3) la DWT emplea valores para ‘a’ y ‘b’, en una escala de potencias de dos denominada diádica (a = 2-k y b = n2-k), permitiendo expresar la transformada en un banco de filtros de octavas. La DWT se define sobre una secuencia de subespacios cerrados Vj, (j= 0, 1, ...,J), tales que V j ⊂ V j −1 ⊂ ... ⊂ V1 ⊂ V0 , siendo V0 = l2(Z) el espacio de secuencias de números enteros de cuadrado sumable [VK95]. Estos subespacios Vj son completos y satisfacen la propiedad, ∪ Vj = l2(Z), j∈[0,J]. La descomposición multiresolución de una señal xn se deriva asumiendo que cualquier elemento en Vj se puede representar de manera única como la suma de dos elementos de los subespacios Vj+1 y Wj+1, siendo Vj = Vj+1 ⊕ Wj+1. Si existe una secuencia g n ∈V0 tal que { {g n−2 k }k∈Z } es una base de V1, entonces existe una secuencia hn ∈ V0 tal que hn −2 k k∈Z es una base de W1, y V0 se descompone como: V0 = W1 ⊕ W2 ⊕ … ⊕ Wj ⊕ Vj simplemente iterando la ley anterior de descomposición J veces. En el caso de estar definiendo el concepto de multiresolución por medio de wavelets ortogonales, Wj+1 se define como el complemento ortogonal de Vj+1 en Vj. 26 (a) (b) Figura 3.6: Proceso de análisis en diferente escala y traslación. (a) escala fija a 1 y traslación variante, (b) escala fija a 20 y traslación variante. 27 Lo atractivo de esta transformada es que el desarrollo en serie de wavelet conduce a una estructura de descomposición multiresolución por medio de un eficiente algoritmo de cálculo basado en la implementación piramidal de un banco de filtros. El banco de filtros de análisis o descomposición calcula los productos escalares con las funciones bases de los subespacios W1, W2, ..., WJ y VJ. Así, la secuencia de entrada se descompone en una componente o aproximación en el subespacio VJ y una serie de detalles en los subespacios Wj (j= 1, 2, ..., J)[Per01]. La DWT permite realizar lo que se denomina Análisis de Multiresolución (MRA), que consiste en estudiar la señal empleando por cada componente de frecuencia una resolución diferente. Esto es una alternativa más sobre la STFT que analiza todas las componentes de frecuencia a una misma resolución (sección 3.2). En general, las ventajas que ofrece este método es que, con el uso de wavelet, a altas frecuencias (bajas escalas) se tiene una buena resolución en tiempo y poca resolución en frecuencia, información detallada o parámetros escondidos en la señal (que usualmente ocurren en periodos cortos de tiempo), mientras que para bajas frecuencias (grandes escalas) corresponden a información global de la señal y los resultados requieren buena resolución en frecuencia y poca resolución en tiempo [Pol96], como se aprecia en la figura 3.7. Figura 3.7:. Plano de Tiempo-Frecuencia analizado con la TW Mientras que para la STFT las ventanas serían de igual dimensión para todos los casos ya que para ese análisis no se dilatan ni se contrae, ver figura 3.8(a), lo que representa una ventaja de la WT sobre la STFT, ya que se puede tener mayor detalle del comportamiento de la señal, dada la resolución que se puede alcanzar. (a) (b) Figura 3.8: Planos Tiempo-Frecuencia para (a) STFT (b) TW 28 3.4.2.1 Transformada Wavelet Rápida (FWT) La transformada discreta wavelet unidimensional (1-D DWT) se puede calcular por medio de la Transformada Wavelet Rápida (FWT) o algoritmo piramidal desarrollado por Mallat [Mal89] (figura 3.9), la cual es una implementación computacionalmente eficiente donde su costo computacional es Θ(L) (siendo L la longitud de la señal de entrada). La Transformada Wavelet Rápida (FWT) descompone una señal en sus secuencias de aproximación y detalle en diferentes niveles u octavas (figura 3.10a). El cálculo de la transformada wavelet se inicia con una señal de entrada, a(0)n . Sean a(i-1)n y d(i-1)n sus secuencias de aproximación y detalle en el nivel de descomposición i-1, respectivamente. La aproximación y detalle de la señal en el nivel i se definen como: a (i ) n d (i ) n N −1 = ∑ g k a 2(in−−1k) k =0 = N −1 ∑h a K =0 k ( i −1) 2n−k Filtro Pasa-Bajo (3.9) Filtro Pasa-Alto (3.10) siendo gk y hk los coeficientes de los filtros paso baja y paso alta de orden N, respectivamente (figuras 3.9 , 3.10(a)). Las ecuaciones (3.9 y 3.10) describe el cálculo de la Transformada Wavelet Rápida. Los coeficientes de los filtros se obtienen a partir de la representación de la wavelet madre en tiempo continuo. La resolución de las diferentes aproximaciones a n(i ) así obtenidas disminuye al aumentar i. Puesto que las señales a n(i ) (i = 1, 2, ..., J) representan a la señal original en varias resoluciones, la FWT también se conoce como una técnica de descomposición multiresolución de señales, esta estructura recibe el nombre de banco de filtros de análisis, el proceso consiste en una serie de filtrados repetitivos usando el concepto de diezmado, es decir, al principio se utiliza un filtro pasa bajas y otro pasa altas con frecuencia de corte de la mitad de la máxima componente de frecuencia de la señal a analizar, posteriormente la salida de ambos filtros se vuelve a enviar a otro par de filtros de las mismas características, la frecuencia de corte del segundo filtro es la mitad de la máxima componente de frecuencia de la señal que va a entrar a ese filtro, ver figura 3.11. De éste modo se va reduciendo el ancho de banda y eso se traduce en la reducción a la mitad de la resolución, lo que significa que a mayor número de etapas de filtrado se tendrá una mayor resolución a baja frecuencia. La señal de entrada a n( 0) se puede reconstruir a partir de su descomposición multiresolución de acuerdo con: { an(i −1) = ∑ ak(i ) g n−2 k + d k(i ) hn−2 k } (3.11) k Esta ecuación describe el banco de filtros de síntesis, que consta de un filtro paso baja y otro paso alta de coeficientes g n y hn , respectivamente, y que se encuentran fijados por las condiciones de reconstrucción perfecta [VK95] y de la wavelet madre en tiempo continuo. La figura 3.10(a)(b) muestra un diagrama de bloques de los bancos de filtros de análisis y síntesis respectivamente. 29 Figura 3.9: Transformada Wavelet Rápida (FWT) o Algoritmo de Mallat (a) (b) Figura 3.10. Diagrama de bloques de la descomposición multiresolución de una señal por medio de la transformada wavelet. (a) Banco de análisis y (b) síntesis. Resulta interesante evaluar el número de operaciones de filtrado que se deben realizar por cada muestra de la entrada a n( 0) . Nótese que los bancos de filtros de análisis y síntesis conllevan exactamente el mismo número de operaciones. La señal de entrada a n( 0) se utiliza como entrada de los dos filtros y de la salida de estos dos filtros sólo se utiliza una de cada dos muestras debido a la decimación por 2. De esta manera, la primera pareja de filtros sólo 30 realiza 2(1/2)= 1 operaciones de filtrado por cada muestra de entrada. En el segundo nivel de descomposición y puesto que la frecuencia de la señal a n(1) es la mitad de la frecuencia de la señal de entrada, sólo se realizan ½ operaciones de filtrado por muestra de entrada. Extendiendo este desarrollo se determina que el número de operaciones de filtrado por cada muestra de entrada está acotado superiormente por 1+1/2+1/4+..... = 2. Figura 3.11: Respuesta en frecuencia del banco de filtros Wavelet 3.4.2.2 Algoritmo Transformada Wavelet Rápida (FWT) La 1-D DWT se puede implementar por medio del algoritmo piramidal (PA:Pyramid Algortithm) desarrollado por Mallat [Mal89]. Dada una secuencia x(n) de longitud L, este algoritmo se define mediante: Inicio {Algoritmo Piramidal Directo} Para (i = 1 a J ) Para (n = 1 a 2J-i ) a (i ) n d (i ) n N −1 = ∑ g k a 2(in−−1k) k =0 = N −1 ∑h a K =0 k ( i −1) 2n−k Filtro Pasa-Bajo Filtro Pasa-Alto Fin {Algoritmo Piramidal Directo} Siendo a n( 0) = x(n) , L = 2J, con J representando el número de octavas, y N siendo la longitud de los filtros paso baja y pasa alta. 31 Capítulo 4 Sistema de Segmentación El sistema de segmentación de señales tiene como objetivo identificar los segmentos de voz sonoros, sordos y los tramos de silencio, utilizando transformada wavelet con el fin de hacer un realce en la señal independiente del segmento identificado, por ejemplo, aumentar algunas bandas de frecuencia para los sonidos sordos, no aumentar las vocales en lo absoluto y reducir por completo los segmentos de ruido y de silencio. La Transformada Wavelet juega un papel muy importante en el planteamiento de este proyecto ya que autores como Tan et al. [TLS94] y Long y Datta [LD96] han mostrado que los fonemas correspondientes a sonidos sordos se relacionan con las escalas de mayor resolución, en cambio, los fonemas sonoros, tales como las vocales, con las escalas de menor resolución, El sistema de segmentación propuesto que se plantea en el Apéndice D del proyecto de investigación 195 de la Universidad del Quindío [Hur03] figura 4.1, se basa en utilizar la DWT con la wavelet madre que mejor se ajuste a las características de la señal para descomponerla en cuatro niveles o sub bandas y hacer una identificación entre fonemas sonoros, sordos y tramos de silencio o ruido. El método para la segmentación y clasificación de los fonemas en tiempo real consiste en capturar bloques de 64ms que equivalen a 512 datos, y analizar pequeños sub-bloques de 4ms de longitud correspondientes a 32 muestras por medio de una FWT, hacer una clasificación mediante reglas de selección, las cuales se obtienen mediante un estudio de evolución de las energías de cada uno de los niveles de descomposición, para facilitar el proceso de segmentación , la información se suaviza por medio de un filtro de media móvil de 8 coeficientes. Una vez identificado los segmentos de los fonemas se efectúa un realce en las diferentes bandas de descomposición según el segmento identificado y se procede a recuperar la señal utilizando la IDWT, la señal recuperada traerá las características adecuadas para la escucha en una persona con deficiencias auditivas. A continuación analizaremos la estructura del sistema de segmentación, de la figura 4.2, detallando cada uno de los bloques que comprenden dicho sistema, y su implementación en Matlab. Se ejecutaron simulaciones con frases de voz previamente almacenadas en formato (.wav) con el fin de obtener las resultados adecuados que nos permitieron clasificar los segmentos. 32 d-1……d-4 Extracción de características a bloques de 32 muestras Filtro media móvil d / dt Detector del Segmento Clasificador d-1…..d-8, a-8 Figura 4.1 Sistema de Segmentación de Señales Propuesto en el Proyecto 195. DWT Captura Señal de Voz Pre-énfasis Adquisición Preprocesamiento Wavelet Denoising Log ∂t ∫ exp{ } Cálculo de Energías Normalización Extracción de Características Identificación del Fonema Realce Segmentación Realce de la Señal Figura 4.2 Estructura del Sistema de Segmentación 4.1 Implementación del Sistema de Segmentación de Fonemas en MATLAB Para el desarrollo del proyecto y la obtención de los resultados deseados se efectuaron simulaciones en MATLAB que obedecen al diagrama de flujo de la figura 4.3. Con muestras de voz de diversos hablantes previamente capturadas de pequeña longitud, las cuales formaban frases que contenían entre de 3 y 5 fonemas tanto sonoros como sordos y segmentos de silencio, se realizó el análisis correspondiente y se establecieron las reglas de selección adecuadas para segmentar la señal en 3 categorías diferentes de voz: sonidos sonoros (vocales), sonidos sordos (consonantes) y segmentos de silencio o ruidos de fondo. 33 La implementación y funcionamiento del programa en matlab se detalla a continuación. La señal de entrada X es un vector de cierta longitud, del cual se toman tramas de 512 datos correspondientes a 64ms de la señal total, este se analiza independientemente de los otros bloques teniendo en cuenta las últimas N-1 muestras del bloque anterior para su descomposición por medio de la transformada wavelet y garantizando una continuidad de la señal de entrada, siendo N el tamaño de la respuesta al impulso en este caso la longitud de la wavelet madre seleccionada, la figura 4.3 ilustra el esquema en la memoria del DSP de los bloques de entrada a cada una de las etapas del banco de filtros wavelet, se descompone la señal hasta obtener los coeficientes wavelet de la señal de voz de los 4 niveles de detalle de mayor resolución. Estudiando la evolución de energías de cada uno de los niveles se establecieron los criterios de segmentación de cualquier señal de voz independiente del hablante y de las condiciones de captura, una vez identificados los segmentos se efectúa un realce de la señal, dicho realce se produce por medio de un factor de escala sobre los coeficientes entregados por el bloque wavelet denoising, es por esta razón que en el diagrama de flujo de la figura 4.4 se divide en dos partes, ya que los coeficientes entregados por la etapa wavelet denoising son utilizados para identificar los segmentos y realzar la señal. Por convicción este planteamiento en el diagrama de flujo no se puede plantear pero es una forma muy simple de ilustrar el desarrollo del algoritmo. El sistema de segmentación de la voz de la figura 4.4 está conformado por 6 etapas clasificadas de la siguiente manera: • • • • • • Adquisición de la señal de voz Preprocesamiento Extracción de Características Segmentación Realce de la señal Recuperación de la señal de voz 512 Muestras leídas Primera captura de muestras N-1 muestras anteriores N-1 muestras 512 Muestras leídas Segunda captura de muestras N-1 muestras anteriores N-1 muestras Figura 4.3. Esquema en memoria del vector de muestras a filtrar 34 INICIO Lectura del Archivo .wav Conversión de Fs a 8KHz Ajuste de la Señal a un Múltiplo de 512 Datos Selección de Bloque de 512 Datos Filtrado de Pre-énfasis Transformada Wavelet Wavelet Denoising Normalización Cálculo Energías Sub-bandas Reglas de Selección Realce de la Señal Transformada Inversa Wavelet del Bloque Concatenación de Bloques Conversión Señal a Formato .wav FIN Figura 4.4 Diagrama de flujo de la simulación en MATLAB 35 4.1.1 Adquisición de la Señal de Voz La señal de voz básicamente está constituida por ondas de presión producidas por el aparato fonador humano como se explicó en el capítulo 2. La manera más apropiada de capturar este tipo de señal se realiza mediante un micrófono, el cual se encargará de convertir la onda de presión sonora en una señal eléctrica. La siguiente etapa será aquella que se encargue de amplificar las señales a niveles que sean manejables. A partir de la señal analógica obtenida se hace necesario convertir la señal a formato digital para poder procesarla en la computadora, y se realiza mediante dos procesos: muestreo y cuantificación. Este proceso de dos etapas se conoce como Modulación por Código de Pulsos (PCM). La mayor parte de los sonidos vocales tiene energía espectral significativa hasta los 4khz, entonces la frecuencia de muestreo debe de ser por lo menos dos veces la frecuencia máxima (según el Teorema de Shanon), por lo que fs = 8 KHz, que corresponde a la calidad telefónica. Las muestras de voz fueron tomadas de diversos hablantes entre hombres y mujeres y en diversos ambientes de ruido de fondo con el fin de establecer criterios en señales producidas en diferentes medios, para ello utilizamos la tarjeta de sonidos del computador que permite guardar las frases en formato .wav a una frecuencia de muestreo de 22050Hz usando 8 bits por muestra para ser manipuladas en el entorno de matlab por medio de la función [X,fs] = wavread (‘.wav’) [MMOP07] la cual lee un archivo con extensión .wav, y devuelve un vector X con los valores de amplitud de cada una de las muestras, y fs es la frecuencia de muestreo de la señal. Debido a que la frecuencia de muestreo en el momento de la captura es de 22050Hz debemos llevar a cabo una conversión a 8Khz ya que como se mencionó anteriormente, nuestra frecuencia de muestreo óptima es de fs = 8Khz, las muestras de voz capturadas quedan almacenadas en una base de datos para su respectivo análisis, algunas se pueden ver en le tabla 4.1 teniendo en cuenta el análisis de los fonemas del capítulo 2 sección 2.2. Fonemas Consonánticos Fonema B C Ch D F G H J K L Ll M N Ñ Ejemplo Bote Casa Pecho Donde Fama Goma Jardín Paja Queso Lana Llave Mamá Nana Leña 36 Clasificación Bilabial, Oclusivo Velar, Oclusivo Palatal, Africado Dental, Oclusivo Labiodental, Fricativo Velar, Oclusivo Glotal Alveolar, Fricativo Velar, Oclusivo Alveolar, Semivocal Palatal, Africativa Bilabial, Nasal Alveolar, Nasal Palatal, Nasal P Q R RR S T V W X Y Z Papa Queso Pero Carro Sopa Atar Nueve Hueso Paja Mayo Caza Bilabial, Oclusivo Velar, Oclusivo Alveolar, Vibrante Uvular, Vibrante Alveolar, fricativo Dental, Oclusivo Fricativa Biobio-velar Alveolar, Fricativo Palatal, Fricativo Interdental, Fricativo Fonemas Vocálicos Fonema A E I O U Ejemplo A E I O U Clasificación Central, Abierta Anterior, Media Anterior, Cerrada Posterior, Media Posterior, Cerrada Tabla 4.1 Ejemplos de algunas muestras de voz previamente capturadas 4.1.2 Preprocesamiento Esta etapa consta de un filtro de Pre-énfasis, un filtro FIR empleado en los sistemas de reconocimiento para eliminar el ruido de la señal, reducir los efectos de volumen y contrarrestar en cierto grado la atenuación impuesta por el tracto vocal del hablante, haciendo que el análisis sea independiente de las condiciones de captura. Se usa un filtro digital de primer orden cuya función de transferencia es [BR99]: H ( z ) = 1 − az −1 (4.1) Donde 0 < a · 1, pero t´ıpicamente se emplea un valor de a = 0:95 permitiendo una amplificación de 20dB para las componentes de alta frecuencia. Su implementación en Matlab se efectúa por medio de la función de la convolución entre la señal de entrada X y H(z), su salida Y es un vector de la señal filtrada. Y = conv( X , [1 − 0.95]) (4.2) Como la señal se analiza por bloques de 512 datos, hay que tener en cuenta el último dato entregado del bloque actual para el análisis del bloque siguiente, técnica conocida como solapamiento y suma [Hur02b]ver Figura 4.5. 37 Figura 4.5. Análisis por bloque del filtro pre-énfasis 4.1.3 Extracción de Características Esta etapa involucra el análisis de las señales de voz. Está compuesta por cuatro bloques (figura 4.6) que nos permiten obtener el comportamiento o evolución de las energías en los diferentes niveles de descomposición para determinar y clasificar los segmentos de voz. Trasformada Wavelet Wavelet Denoising Normalización Energías Sub-banda Figura 4.6 Bloque de Extracción de Características 4.1.3.1Trasformada Wavelet El primer bloque consiste en descomponer la señal por medio de la Transformada Wavelet en sus 4 niveles de mayor resolución, para ello se hace uso del wavelet toolbox de MATLAB el cual tiene embebida la función [C, L] = dwt ( X , ‘w_name’), que descompone la señal de entrada X de longitud n igual a 512 datos (bloque de 64ms). Utilizando la wavelet madre ‘db8’ de longitud 2N con N = 8 (ver sección selección wavelet madre), en dos vectores C1, L1 de longitud igual a 263 datos cada uno ( floor ((n-1)/2) + N ) asociados al nivel de aproximación y detalles respectivamente, se puede apreciar en la figura 4.7 un análisis de 38 descomposición en matlab [MMOP07], que para el segundo nivel de detalle y aproximaciones C2 y L2, la señal de entrada corresponde a los coeficientes de aproximaciones del primer nivel C1 de longitud 263 datos, dando como resultado los vectores de detalle y aproximaciones del nivel 2 de longitud 139 datos cada uno, el procedimiento se repite hasta obtener los 4 niveles de detalle y uno de aproximaciones de la señal a analizar, como muestra la figura 4.8. Para los bloques de 512 datos siguientes se deben de tener en cuenta las condiciones iniciales que corresponden a los últimos N-1 datos del bloque anterior en el mismo nivel, ya que en el algoritmo de mallat se emplean filtros FIR los cuales dependen de entradas anteriores. Por este motivo la longitud de los coeficientes wavelet en cada nivel será siempre mayor que la longitud de la señal descompuesta. En la tabla 4.2 podemos observar el número de datos que se analizan por cada nivel y las condiciones iniciales tenidas en cuenta para los siguientes bloques. La señal de voz se descompone en 4 bandas de frecuencia (H1, H2, H3, H4), en la tabla 4.3 se presenta el rango de frecuencias de las 4 bandas con su respectiva frecuencia central en las que se descompone la señal. Figura 4.7 Análisis de Descomposición por nivel en Matlab X h(-n) 2 g(-n) 2 a1 = 263 d-1 = 256 datos h(-n) 2 g(-n) 2 a2 = 139 X = 512 datos d-2 = 128 datos h(-n) 2 g(-n) 2 a3 = 77 d-3 = 64 datos h(-n) 2 g(-n) 2 d-4 = 32 datos a-4 = 32 datos Figura 4.8 Descomposición de un Bloque X = 512 datos de la señal en 4 niveles de detalle y uno de aproximación 39 Nivel de Entrada # Coeficientes Entregados Ao = Bloque 512 A1 = 263 A2 = 139 A3 = 77 A1 = 263 A2 =139 A3 = 77 A3 = 46 D1 = 263 D2 = 139 D3 = 77 D4 = 46 Coeficientes Analizados D1 = 256 D2 = 128 D3 = 64 D4 = 32 Condiciones Iniciales sgte bloque D1 = 7 D2 = 11 D3 = 13 D4 = 14 Tabla 4.2 Número de coeficientes entregados por cada nivel de la wavelet con los coeficientes que se analizan y los que sirven de condiciones iniciales para los siguientes bloques Nivel Frecuencia Mínima (Hz) Frecuencia Máxima (Hz) H1 H2 H3 H4 Tabla 4.3 Rango de frecuencias 4.1.3.2 Selección de la Wavelet Madre Lo primero a tener en cuenta a la hora de realizar un análisis wavelet es cuál wavelet madre utilizar ya que se hace necesario determinar la señal Ψ(t) que mejor se adapte al sistema; para esto se hizo referencia al proyecto de investigación 195 “Reconocimiento de Voz en Tiempo Real por medio de la Transformada Wavelet Y Procesadores Digitales de Señales” [Hur03a] realizado en la universidad del Quindío. Entre los criterios tenidos en cuenta están: • • • Mayor similitud con las muestras de las señales de voz. Bajo este criterio la wavelet Haar se descarta debido a su gran diferencia con una señal de voz. La symlets son bastante simétricas y las señales de voz son asimétricas, por lo tanto también se descartan. Así que solo quedan la Daubechies y la Coeiflet. Menor carga computacional. Un orden alto de la función wavelet implica una longitud mayor en los coeficientes de los filtros usados en el análisis y por lo tanto un costo computacional más alto. Para las wavelets daubechies y symlets la longitud de los filtros de análisis hn y síntesis gn es 2N, donde N es el orden de la función wavelet, en cambio para las coiflets, esta longitud se triplica ya que las longitudes de dichos filtros son 6N. Por tal motivo fué descartada. Se empleó el método de determinación de la mejor base el cual hace uso de la entropía µ de DWT, y el algoritmo de la selección de la mejor base, llegando a la conclusión de emplear la Wavelet Daubechies de orden 8. 40 4.1.3.3 Wavelet Denoising Es una técnica mediante la cual se elimina el ruido ambiente de fondo y el producido por el sistema de grabación utilizado. Esta técnica tiene la ventaja de que se incorpora directamente dentro del algoritmo de cálculo de la transformada y no requiere de demasiada carga computacional. Para esto se realiza lo que se conoce como un soft-thresholding que consiste en restar cierto umbral a los coeficientes arrojados por el cálculo de la DWT de cada uno de los niveles de descomposición cuyo valor absoluto sea mayor a éste y llevar a cero los coeficientes cuyo valor absoluto se encuentre por debajo. Para calcular el umbral se capturan datos con el micrófono en ausencia de voz (ruido) y se hace uso de la siguiente ecuación [RB98]: 2 * log n *σ u= (4.3) n donde: u = Umbral. n = Número de datos (tamaño del ruido capturado). σ 2 = Varianza del ruido En la tabla 4.4 se muestran los valores de umbral de ruido en cada una de las bandas obtenidos haciendo uso de la transformada wavelet discreta de 8 niveles, es muy notorio la reducción de ruido utilizando el bloque wavelet denoising a la hora de recuperar la señal, si se utiliza un umbral muy fuerte puede ocasionar pérdidas de energía importante que repercuten en la identificación de los segmentos. Nivel Detalle 1 Detalle 2 Detalle 3 Detalle 4 Aproximación 4 Umbral 12.4 e -3 6.1 e -3 3.1 e -3 1.9 e -3 1 e -3 Tabla 4.4 Umbral de ruido para cada nivel 4.1.3.4 Normalización Es de notar en el sistema que el bloque de normalización está antes del cálculo de energías, el cual emplea el logaritmo del valor absoluto de los coeficientes wavelet, la derivada temporal, la integración y la exponenciación (ver figura 4.9), este conjunto de bloques garantizan, para los parámetros extraídos, una independencia del volumen de la señal. log W g {Af (t )} = log A + log W g { f (t )} (4.4) ∂ ∂ log W g {Af (t )}(s, t ) = log W g {Af (t )}(s, t ) (4.5) ∂t ∂t Al emplear el calculo del logaritmo del valor absoluto se logra una independencia del factor de amplitud de la señal (Ec. 4.4), el cual puede ser eliminado por medio de la derivada 41 temporal al conjunto de datos (Ec. 4.5) logrando una independencia de amplitud de los parámetros extraídos, la derivada temporal en matlab se implementa por medio de un derivador de primer orden dado por la ecuación de recurrencia y[n ] = x[n] − x[n − 1] (4.6) y para la operación de integración un integrador de suma continua dado por la función de transferencia [LF94] 1 H (z ) = (4.7) 1 − z −1 Tanto el derivador (ecu4.6) como el integrador (ecu.4.7) se pueden implementar en MATLAB [MMOP07] por medio de la función Y = FILTER (bk, ak, x) teniendo en cuenta como condición inicial para el siguiente bloque de datos, el último dato de cada uno de los niveles de descomposición ya que el derivador y el integrador dependen de la entrada (FIR) y salida (IIR) anterior respectivamente. ∂t Log ∫ exp{ } Normalización Figura 4.9 Bloque de normalización 4.1.3.5 Energías Sub-bandas Una vez obtenidos los coeficientes wavelet normalizados de cada uno de los 4 niveles de detalle y 1 de aproximación, procedemos a calcular la energía aportada por cada uno de los niveles de detalle en los que se toman sub-bloques de 4ms que corresponden a segmentos de 32 muestras para analizar la evolución de la energía y establecer las reglas de selección adecuadas, para este análisis se utilizó la siguiente ecuación: Ebanda i = N i ∑ C K =1 i (k )2 (4.8) Donde Ci son los coeficientes de la banda i, Ni es la longitud por banda y Ebandai es un vector de una longitud 16 datos que contiene la energía de la banda i por cada segmento de 32 datos (4ms) del total del bloque capturado de 512 datos (64ms), en la tabla 4.5 se puede observar el número de coeficientes que aporta cada banda por bloque y por segmento para el cálculo de energía por cada nivel. Nivel Datos Por Datos Por Segmento Bloque (64ms) (4ms) Detalle 1 256 16 Detalle 2 128 8 Detalle 3 64 4 Detalle 4 32 2 Aproximación 4 32 2 Tabla 4.5 Número de Coeficientes de cada nivel en un bloque de 512 muestras de la señal para el Cálculo de las Energías 42 Una vez obtenidos los vectores de energía de cada uno de los niveles de detalle, y para facilitar el proceso de segmentación, la información se suaviza por medio de un filtro de media móvil de 8 coeficientes, cabe recordar que cada vector tiene una longitud de 16 datos en cada nivel y que corresponden a solo un bloque de 512 datos (64ms) de la señal, es decir un dato en cada vector equivale a la energía contenida en un segmento de 32 muestras (4ms) por banda. 4.1.4 Reglas de Selección En esta sección se describen una serie de pruebas, que fueron llevadas a cabo de cara a realizar la segmentación de las frases componentes de la base de datos de una manera automática. El objetivo de dichas pruebas, era el de evaluar la posibilidad de realizar la segmentación de fonemas de las frases componentes de nuestra base de datos de una manera automática (la segmentación consiste en delimitar mediante etiquetas la posición de los fonemas dentro de las frases), con el fin de establecer reglas de selección que permitan identificar el tipo de segmento. En efecto, debemos especificar que dicho proceso de segmentación es realizado manualmente (empleando herramientas de edición de sonido como, Sound forge 5.0 y Cool Edit Pro 2.0), para lo cual se debe escuchar una a una las frases, y colocar las etiquetas que aislan cada uno de los fonemas de forma manual, estas etiquetas se graban en un archivo de formato .phn con el mismo nombre del archivo .wav que contenga la frase, el archivo .phn contiene el número de fonemas en la frase y el posicionamiento de cada fonema (Tabla 4.6), no hay que olvidar que los valores obtenidos de las etiquetas se toman de los archivos cuya frecuencia de muestreo es aproximadamente 22Khz y que se debe hacer la conversión a 8Khz, para ser visualizados (ver figura 4.10) y poder observar el comportamiento de la energía entre fonemas de cada una de las bandas. # de Fonemas 4 /m/ /a/ /t/ /a/ Etiquetado Manual Posición Longitud 544 2880 3447 3734 9856 540 10440 3585 Tabla 4.6 Etiquetado Manual de la palabra “mata” Claramente, este procesado manual requiere una gran cantidad de tiempo y además, en algunos casos, lleva asociado también errores. Estos errores pueden venir derivados del cansancio que este trabajo implica, por esta razón se produce errores de criterio en la segmentación. En total se dispuso de un conjunto de 108 archivos .wav con frases que contenían de 3, 4 y 5 fonemas que mezclaban sonidos sonoros, sordos y segmentos de silencio, como también archivos con sílabas que mezclan las consonantes con las vocales por ejemplo el archivo B.wav contiene la señal “ba be bi bo bu”, para concluir las simulaciones se tomaron frases con más de cuatro palabras de cara al entrenamiento del sistema. Hay que tener en cuenta que por trabajar el sistema con una frecuencia de muestreo de 8Khz, fue necesario convertir la frecuencia de muestreo de todas las frases de 22Khz a 8Khz, como también el 43 posicionamiento manual de las etiquetas, esto se realizó con líneas de código en el programa de matlab. 0.5 /m/ /a/ /t/ /a/ 0.4 0.3 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 0 1000 2000 3000 4000 5000 6000 Figura 4.10 Palabra “mata” etiquetada Para establecer las reglas de selección analizamos el comportamiento de la energía de las cuatro bandas de descomposición en las zonas donde se encontraba el etiquetado manual, observando la evolución de la energía de un segmento a otro, detallando el umbral de la banda con mayor intensidad y en que porcentaje se encontraba por encima de las otras bandas, estudiando los cambios de pendientes de las bandas tanto individual como en conjunto, concluyendo así para cada tipo de segmento los siguientes aspectos: Detección Segmento de Silencio: En ausencia de voz se puede notar que en el nivel de detalle de mayor resolución (d-1) la energía es superior a la de los demás niveles o bandas y permanece constante en las 4 bandas con un umbral muy pequeño. Otra manera para identificar el segmento de silencio consiste en analizar la intensidad de la energía, si esta no supera el umbral de 1e9 en la banda de mayor intensidad, el segmento se identifica como silencio. Para obtener una mayor exactitud en los segmentos de silencio analizamos también los cambios de energía entre segmentos en cada banda o nivel de descomposición, dándole un valor dependiendo de la variación como se muestra en la tabla 4.7, la variación depende del cambio de energía entre segmentos en cada una de las bandas por separado. Valor Cambio de Energía 1 Aumento de Energía 0 Energía Constante -1 Disminución de Energía Tabla 4.7 Cambio de energía entre segmentos por banda 44 Luego de realizar diferentes pruebas se concluyó que en los segmentos en el cual la energía permanecía constante en las cuatro bandas correspondían a segmentos de silencio. Para determinar dicha regla de selección se suman los valores de cambio en cada banda por segmento es decir que si en las 4 bandas la energía aumenta el segmento tendrá un valor de 4, si da un valor negativo la energía diminuye y se aproxima el fin del segmento dependiendo del cambio, cuando el segmento toma un valor de cero, se analizan las cuatro bandas y si en todas las bandas la energía es constante es decir el cambio es igual a cero, se detecta un segmento de silencio, la figura 4.11 ilustra la suma de las variaciones de energía en las 4 bandas, notándose que la transición entre el fonema /a/ y el fonema /t/ existen segmentos de silencio, ya que los puntos son constantes en este tramo; en el caso en que algunas de las bandas tengan un valor distinto se cero se analiza el umbral para determinar el tipo de segmento. 120 /m/ /a/ /t/ /a/ 100 80 60 40 20 0 0 1000 2000 3000 4000 5000 6000 Figura 4.11 Detección de segmentos de silencio en la palabra ‘mata’ Detección Segmento de Sonoro: Para determinar un segmento que haga parte de un fonema sonoro es decir una vocal, analizamos primero en comportamiento de la energía, en archivos que contenían solo vocales, para esto se hizo referencia a la base de datos del proyecto 195(grupo GDSPROC ) que contiene las vocales pronunciadas por 42 hablantes entre hombre y mujeres, lográndose apreciar un comportamiento gausiano con el tiempo en cada una de las vocales con una intensidad fuerte comparada con la de los fonemas sordos, y notándose que dependiendo de la vocal la banda predominante es distinta. Además el umbral máximo que alcanza la banda predominante es mayor a 1e16. Se puede notar que al inicio de cada vocal la banda predominante aumenta considerablemente mientras que las restantes se incrementan levemente, el fin de la vocal se presenta cuando todas la banda o bandas predominantes van disminuyendo su valor de umbral comparado con el valor máximo alcanzado, a continuación se explica el comportamiento de la energía por vocal: Vocal “A”: Predomina la energía de los niveles d-2 y d-3 con mayor intensidad, seguido por el nivel de detalle d-1 que varía considerablemente según el hablante, 45 entre el 20% y 80% con respecto a la banda de mayor intensidad, la energía del nivel d-4 es muy pequeña pero siempre mayor al 1%. Vocal “E”: Se caracteriza el nivel d-1 como banda predominante, las tres bandas restantes varían su energía con respecto a d-1 entre el 5% y el 50% independientemente una de otra, siendo la banda d-2 el más notorio y en algunos caso es comparable con d-1 pero no mayor a este. Vocal “I”: d-1 sobresale sobre las demás bandas, mientras que la energía de los niveles d-4 y d-2 oscila entre 20% y el 60% con d-4 siempre mayor a d-2, la banda d-3 varia su energía con respecto a d-1 entre 1% y el 30%, en algunos casos d2 y d-3 presentan la misma intensidad . Vocal “O”: Predominan d-3 y d-4, en algunos casos la energía de todas las bandas son iguales, mientras que en otros la energía de los niveles d-1 y d-2 son muy leves con valores no mayores al 30% ni menores al 1%. Vocal “U”: La bandas de mayor intensidad son d-4 y d-3 con un valor mayor de 1e15 siendo ligeramente menor el nivel d-3, los niveles d-2 y d-1 tienen valores menores al 80% y mayores al 5% respectivamente. En conclusión: • La principal característica de los fonemas sonoros es la intensidad que aporta cada una de las bandas por segmento con un comportamiento gaussiano y su duración en el tiempo es muy larga comparada con los fonemas sordos • La energía promedio por segmento es mayor a 1e13 y la banda predominante depende de la vocal que se esté analizando. • La vocal /i/ es de una energía pequeña comparada con las otras vocales. • Un segmento que haga parte de una vocal existe aporte de energía en todas las bandas a excepción de la /i/ en algunos casos. • Para observar el comportamiento ideal de una vocal y el aporte de energía en cada una de las bandas debe de ser pronunciada claramente de lo contrario se mezclará con un segmento sordo debido al aporte de energía de cada una de las bandas. Detección Segmento de Sordo: Para analizar el comportamiento de las bandas de energía de un segmento sordo, extrajimos de las frases, los segmentos de consonante independiente de la vocal que forma la silaba, los archivos estudiados contenían la combinación de las consonantes con las vocales dando como resultado las siguientes características: • Fonema /b/ Grafía: b, v. La banda predominante es el nivel de detalle d-4, con energía no mayor a 1e12 y el aporte de energía de las demás bandas es nulo cuando está precedido de silencio, algunos casos se presenta leve de energía en d-3. 46 • • • • • • Si le antecede una vocal hay aporte de energía en todas las bandas con un valor muy inferior al punto máximo de la vocal anterior alrededor 1e13. El detalle d-1 es muy leve, en algunas ocasiones es nulo. Fonema /d/ Grafía: d. Predomina la banda d-4 con intensidad menor a 1e12, sin aporte de energía en las demás bandas cuando está precedida de un silencio. Cuando le antecede una consonante o vocal la banda predominante es la misma con una intensidad mayor y existe cierto aporte en la banda d-3 en casos excepcionales la banda d-2 aparece levemente. d-1 es totalmente nulo. Fonema /f/ Grafía: f. Este sonido es de muy corta duración y debido a la fricción de este fonema se nota energía en el detalle d-1 o pequeña energía en d-2 y d-3, en pruebas realizadas algunos de los segmentos correspondientes a este fonema se vuelven cero por el bloque wavelet denoising debido a que el sonido es muy similar al producido por el micrófono. Fonema /g/ Grafía: g, gu: Para las sílabas ga, go, gu, el nivel máximo es d-4 y la energía en las demás bandas es cero, la transición con otro fonema presenta un aumento notable en las bandas d-2 y d-3, el detalle d-1 permanece en cero por varios segmentos e incrementa su energía abruptamente. En las sílabas gue, gui, sobresalen los detalles d-1 y d-2, el cambio entre fonemas ocurre cuando las bandas predominantes disminuyen y luego aumentan abruptamente entre segmentos. Fonema /j/ Grafía: j, g. d-4 aparece como la banda predominante con una intensidad menor a 1e12, se presentan casos donde aparece la banda d-2 con aporte de energía sin ser mayor a d-4 y depende del fonema anterior o siguiente. Fonema /k/ Grafía: c, qu, k. Debido al carácter explosivo de este fonema, puede ser detectado como una vocal, a diferencia de ésta, este fonema es de una duración mucho más corta, donde predominan las bandas d-1 y d-2 seguidas con un valor aproximadamente del 25% con respecto a la banda predominante. En el cambio de fonema, la banda de mayor energía cae por segmentos hasta el punto en que pasa a predominar otra banda aumentando su energía entre segmentos. Fonema /l/: Grafía l: El nivel con mayor energía es el detalle d-4, con el nivel d-3 alrededor del 25% con respecto a d-4, cuando los niveles de mayor resolución van tomando valores por encima de 1e13 existe un cambio de fonemas. 47 • • • • • • Cuando el segmento anterior es una vocal, la intensidad es considerable aunque más pequeña que el valor máximo del fonema anterior. Fonema /ll/ Grafía: ll: d-1 es la banda predominante con energía en todas la bandas siempre menor a 1e13, un aumento de energía considerable o un cambio continuo de bandas produce un cambio de fonema. Fonema /m/ Grafía: m. Predominan d-4 y d-3. Cuando le precede un silencio no hay energía en las demás bandas. Si le antecede una vocal, el nivel d-2 aparece con energía considerable y la intensidad de d-4 y d-3 es aproximadamente el 10% del punto máximo de la banda predominante de la vocal anterior. Fonema /n/ Grafía: n. Presenta el mismo comportamiento del fonema m. Fonema /ñ/ Grafía: ñ. d-4 es la banda predominante con una intensidad no superior a 0.5e13, d-3 aporta energía variable de aproximadamente del 20% con respecto a d-4. En el segmento que los niveles d-2 y d-1 empiezan a aparecer se trata de un cambio de fonema. Un cambio de banda predominante e incremento notorio entre un segmento y otro de energía ocasiona también transición de fonemas. Cuando la antecede una vocal, el nivel máximo pasa a ser el detalle de menor resolución d-4 y los de mayor resolución tienden a cero. Fonema /p/ Grafía: p. El fonema /p/ es de muy corta duración y sobresalen las bandas d-2 y d-3 como las de mayor intensidad. Algunos casos presenta aporte de energía en el detalle d-1 cuando le antecede una vocal. El cambio de fonema se presenta con un aumento notorio de la banda de mayor intensidad o un cambio de esta con incrementos leves. Fonema /r/: Grafía: r. Este fonema presenta un comportamiento muy aleatorio, ya que no hay una banda que predomine sobre las otras en el momento de analizar las energías. Cuando los segmentos anteriores pertenecen a un segmento de silencio, en algunos casos, predomina d-1 y en otros d-4 con energía en las bandas restante mayor al 60% de la banda predominante, si se presenta una transición entre [consonante/vocal] o [vocal/consonante] se nota un cambio de la banda predominante como también la intensidad, ya sea una disminución o un aumento. 48 • • • • Fonema /s/ Grafía: s, c, z Tiene un comportamiento muy distinto a las demás consonantes ya que la banda predominante depende del segmento siguiente, por lo regular d-1, mientras que las otras bandas son cero, la intensidad es pequeña si la antecede un segmento de silencio, pero si el segmento anterior es una vocal, existe un aporte de energía en todas las bandas hasta disminuir quedando solo el detalle d-1. Fonema /t/ Grafía: t. La banda de mayor intensidad es d-1. A diferencia del fonema /p/ la duración es un poco más larga, también se presenta energía en el nivel d-2. Cuando le antecede una vocal es notoria la energía en el detalle d-4 y más intensa en las demás bandas. Fonema /w/: Presenta el comportamiento de un fonema sonoro, y depende en gran medida del fonema siguiente con el que forma la silaba. Fonema /x/ Grafía: j, g. Tiene intensidad comparada con la de las vocales más o menos entre 5e12 y 1e15 dependiendo de la vocal con que forma la silaba donde predominan las bandas de mayor resolución como son d-1 y d-2, en las dos bandas restantes la energía es cero. Transición entre [consonante]/[vocal]: Estos son algunos de los comportamientos que se presentan entre el cambio de una consonante a una vocal, es de aclarar que estas reglas no son cien por ciento seguras a la hora de identificar los segmentos y pueden presentar pequeños errores en la segmentación. • Si al menos una de las bandas es aproximadamente constante por dos o más segmentos y se incrementa notoriamente en el siguiente se presenta un cambio de fonema. • Cuando las bandas d-4, d-3 y d-2 aportan energía sin importar su intensidad y la banda d-1 y/o d-2 es nula, se trata de una consonante. En el segmento que una de estas bandas cobra una intensidad de energía mayor al 1% de la banda predominante o pasa a ser la banda predominante se trata de una transición entre consonante / vocal. • Un cambio de la banda predominante entre segmentos, llevando consigo un incremento de más del 400% con respecto al segmento anterior ocasiona un cambio de fonema. • Si se presenta un solo segmento de silencio, se produce un cambio de fonema. • La banda predominante se incrementa en más de un 500%. 49 Transición entre [vocal] /[consonante]: El cambio de fonema entre vocal/consonante ocasiona que los niveles de energía en los segmentos de consonante tengan una energía mucho mayor a cuando le antecede un silencio, tomando valores de aproximadamente 1e13 en todas las bandas. • La banda de energía predominante llega a un punto máximo y empieza a descender notoriamente entre segmentos, llegando a un valor por debajo del 5% del punto máximo, se presenta el fin de la vocal y el comienzo de una consonante. • Si se presenta un cambio de banda y desciende el valor de la banda predominante por debajo de 6e13 se presenta una consonante. • Cuando todas las bandas presentan energía en el segmento anterior y en el siguiente alguna de las bandas no presenta energía, se trata de un cambio entre vocal/consonante. • Si se presentan cambios continuos entre segmentos de la banda predominante y el valor de intensidad no se altera notoriamente, se trata de un cambio de fonemas sordos. 4.1.5 Realce de la Señal El realce de la señal se efectúa de una forma muy sencilla en la banda a la cual se desea amplificar, esto depende de las deficiencias auditivas que pueda sufrir el paciente y se realiza por medio de un factor de escala, que consiste en multiplicar en los segmentos identificados, los coeficientes entregados por el bloque wavelet denoising con el factor escala en la o las bandas deseadas. El factor de escala depende de la intensidad en la que se desea, amplificar cada una de las bandas, el tipo de segmento identificado y el criterio obtenido por el audiólogo en los exámenes realizados. Todos los coeficientes wavelet que hagan parte de los segmentos de silencio o ruido, son llevados a cero para que no produzcan realce alguno y evitar molestias en el paciente o distorsión de la señal en los segmentos adyacentes. 4.1.6 Transformada Wavelet Inversa Finalmente, el algoritmo del sistema de segmentación entre en la etapa donde se recupera la señal por medio de la transformada wavelet inversa, una vez realizado el realce de los diferentes niveles de detalles en los segmentos detectados del bloque de 64ms, utilizamos la función embebida en el entorno de matlab que me permite obtener la transformada wavelet inversa de cada nivel, recibiendo los coeficientes de detalle (dn) y de aproximación (an) del nivel n y retornando los coeficientes de aproximación del nivel n-1 (an-1), La función es expresada en el wavelet toolboox de matlab como an-1 = idwt (an, dn, ‘wname’). Este procedimiento se repite hasta recuperar la señal original como se muestra en la figura 4.12 los coeficientes utilizados son los entregados por el bloque wavelet denoisisng con el fin de que al recuperar la señal, esta tenga una reducción de ruido considerable. 50 X = 512 datos d-1 = 263 datos d-2 = 139 datos d-3 = 77 datos d-4 = 46 datos a-4 = 46 datos h(-n) 2 g(-n) 2 h(-n) 2 g(-n) 2 h(-n) 2 g(-n) 2 h(-n) 2 g(-n) 2 X a1 = 263 datos a2 = 139 datos a3 = 77 datos Figura 4.12 Esquema de la Transformada Wavelet Inversa, para recuperar un bloque de 512 datos. Los coeficientes de detalle como el de aproximación, son los entregados por el bloque wavelet denoising completos, la salida corresponde a la señal recuperada con el respectivo realce, el tiempo de duración de X en segundos es 64ms. La figura 4.13 muestra la señal recuperada de la palabra “vaso ”sin ningún realce. /m/ 6 /a/ /t/ /a/ 4 2 0 -2 -4 -6 0 1000 2000 3000 4000 5000 Figura 4.13 Señal de la palabra “mata” recuperada. 51 6000 Capítulo 5 Implementación en el DSP Como el sistema desarrollado en el entorno matlab no funciona en tiempo real, ya que las muestras de voz han sido previamente almacenadas en archivos de audio (.wav) para luego ser procesadas y reproducidas, se opta por implementar el sistema en un DSP (Digital Signal Processor), el cual es un microcontrolador/procesador con gran capacidad de procesamiento y almacenamiento. Un DSP puede ejecutar instrucciones a muy alta velocidad y posee una memoria extensa tanto para datos como para programas y es una excelente alternativa para ejecutar el sistema en tiempo real. El sistema fue desarrollado sobre un procesador digital de señales de punto flotante TMS320C6701 de la Texas instrumet, empleando para ello la tarjeta experimental EVM67x. Para su programación se empleó el entorno de desarrollo Code-Composer Studio, y el lenguaje de programación C. Para este lenguaje se cuenta con un optimizador, el cual reordena la ejecución de las instrucciones y asigna las unidades aritmético-lógicas del trabajo, esto debido a las capacidades de procesamiento en paralelo con que cuenta el DSP. Por fortuna se cuenta con una serie de herramientas computacionales desarrolladas dentro del grupo de investigación de Procesamiento Digital de Señales de la Universidad del Quindío (GDSPROC) que están a disposición para trabajos futuros, que fueron de mucha utilidad en la realización de este proyecto como son las rutinas de captura de datos por DMA, el algoritmo de la Transformada Wavelet y la reproducción de la señal de voz. Para la implementación del sistema se empleó la estructura de la figura 4.2 descrita en el capítulo anterior para la realización de los siguientes algoritmos: 1. Captura de la señal 2. Pre-énfasis 3. Cálculo de la FWT 4. Wavelet Denoising 5. Normalización de los Coeficientes Wavelet 6. Estimación de la Energía en Cada Banda 7. Reglas de Selección 8. Realce de la Señal 9. Transformada Inversa Wavelet 52 10. Reproducción de la señal Buffer 12 0 1 2 3 509 510 511 Genera Interrupción Empieza Captura en 2 1 procesar_segmento( Entrada, Salida ) Buffer de Salida 0 1 2 3 509 510 511 Datos a Reproducir Figura 5.1 Técnica de doble buffer usando DMA para captura de un bloque de 64ms con su respectivo análisis y reproducción. 53 5.1 Captura y Pre-procesamiento de la Señal Para la adquisición de la señal se usaron los CODECs con que cuenta el sistema de desarrollo y se programó el ADC a una frecuencia de muestreo de 8kHz (calidad telefónica), 16 bits por muestra, y la técnica de entrada/salida por acceso directo a memoria (DMA) haciendo uso de un doble buffer asincrónico. El doble buffer permite realizar en paralelo los procesos de adquisición y análisis de los datos (Figura 5.1), garantizando así la ejecución en tiempo real del sistema. En la implementación final cada segmento de captura por DMA se tomó de 512 datos utilizando una frecuencia de muestreo de 8kHz, lo que implica un tiempo de adquisición de 64ms (tcaptura = 512/8000 = 64ms). Para garantizar la ejecución en tiempo real, la rutina de servicio de interrupción por finalización de transferencia por DMA lleva a cabo una inicialización de la captura por DMA del siguiente bloque de datos sobre el segundo buffer (Ver Figura 5.1) y ejecuta el análisis del respectivo segmento (512 datos), desarrollando las etapas de preprocesamiento, extracción de características, identificación del tipo de fonema, realce de la señal, y transformada inversa wavelet dentro de la rutina de servicio de ininterrupción. El programa principal y la rutina del servicio de interrupción en diagramas de flujo (figura 5.2) es la siguiente manera: Programa Principal ISR Reserva memoria (entrada, salida y etiqueta) Condiciones Iniciales. Conversión de Short a Float Iniciar filtros Iniciar DWT, IDWT Iniciar Captura por DMA (Habilita Interrupción) Iniciar Escritura. Procesar Segmento () Conversión de Float a Short FIN Figura 5.2 Diagrama de flujo del programa principal y la ISR. 54 5.2 Conversión de Datos La función que realiza la conversión de los datos se debe a que el buffer de captura entrega los datos tipo short y la función que procesa el segmento los manipula en tipo float, por tal motivo se debe realizar la conversión tanto para los datos de captura como para los de reproducción, y su algoritmo en pseudocódigo es de la forma: Conversion_short_float(entradaADC , buff) for k=0 to 511 buff[k] = entradaADC[2*k] * 0.000030519; Conversion _float_short ( buff , entradaADC) for k = 0 to 511 salidaDAC[2*k] = buff[k] * 32767.0; salidaDAC[2*k+1] = 0; 5.3 Función Procesar Segmento La forma estructural del algoritmo que procesa el segmento en pseudocódigo es: ______________________________ Procesa_segmento() preénfasis() fwt() wavelet denoising() normalización() cálculo energías() reglas_selección() realce() ifwt() _______________________________ La función de preénfasis está dada por (ecu.4.1) donde a toma un valor de -0.95. preénfasis( entrada, [1 a], salida ) for i = 1 to long[entrada] salida[i-1] = entrada[i] - a*entrada[i] Para el cálculo de la transformada wavelet rápida, contamos con las herramientas desarrolladas por el grupo de investigación GDSPROC como habíamos mencionado anteriormente, pues estas nos brindan una continuidad en la señal de entrada, es decir, nos garantizan una interdependencia entre los diferentes segmentos capturados, evitando además cortes abruptos de la señal de entrada. Para tener una visión global del funcionamiento del algoritmo retomamos un párrafo de [Hur02] donde explican dicha función. 55 “…empleando como condiciones iniciales para cada uno de los bancos de filtros wavelet muestras pasadas que habían sido entregadas por el sistema de preprocesamiento. En particular se deben tener en cuenta las N-1 muestras pasadas, donde N es la longitud de la respuesta al impulso de los filtros asociados a la wavelet usada. La Figura 5.3 ilustra el esquema en la memoria del DSP de los bloques de entrada a cada una de las etapas del banco de filtros wavelet. La implementación de cada una de las etapas del banco de filtros wavelet se llevó a cabo usando la estructura polifásica [Fli94], la cual evita la realización de cálculos innecesarios en los diferentes bloques de diezmado. Para el cálculo de la transformada se escribió un algoritmo que permite una fácil adaptación del sistema a otros niveles de descomposición.” El bloque wavelet denoising, por la procedencia de los cálculos se debe incluir después del cálculo de la transformada wavelet rápida y debido a que su costo computacional es relativamente pequeño y está incluido dentro de la función de la FWT. Como se comentó en el capítulo 4 la técnica usada fue la hardthresholding [RB98], el valor de umbral depende de la banda a analizar (tabla 4.4) y su implementación es la siguiente: wavelet denoising( fwt_entrada, long, umbral ) for i = 0 to long[fwt entrada] if ( abs(fwt entrada[i]) < umbral ) fwt salida[i] = 0 else if ( fwt entrada[i] > umbral ) fwt salida[i] = fwt entrada[i] - umbral if ( fwt entrada[i] < -umbral ) fwt salida[i] = fwt entrada[i] + umbral 5.3 Esquema en memoria del vector de muestras a filtrar. El algoritmo de la normalización es el bloque que independiza la señal del volumen que esta pueda llevar en el momento de la captura. Se implemento la ecuación 4.6 para la 56 derivada temporal de primer orden y la ecuación 4.7 para el integrador mantenedor de primer orden, de la siguiente manera: Normalización( ) Logabs( nnivel ) for i = 0 to long[n nivel] nnivel[i] = log ( abs( nnivel[i] ) ) Derivtmp( nnivel ) for k = 0 to long[n nivel] sal[k] = nnivel[k] - nnivel[k-1]; Integexp( yint ) for k = 0 to long( yint ) yint[k] = xint[k] + yant; yant = yint[k]; yint[k] = exp( yint[k] ); Para el cálculo de las energías se tomaron los vectores que contienen los coeficientes wavelet normalizados por cada nivel en un tiempo de 4ms que corresponden a n número de datos según el nivel analizado como se explicó en el capítulo anterior en la Tabla 4.5, haciendo uso de la ecuación 4.5. Energía(nnivel) for k = 0 to 16 for i = 0 to long[nnivel]/16 En[k] += nnivel[ (k*16) + i ] ^ 2 El código fuente de la función que establece las reglas de selección se encuentra en el apéndice B, ya que es algo extenso y hace énfasis a lo redactado en el capítulo anterior. Como detallamos anteriormente, la etapa de realce de la señal resultó ser de una manera muy sencilla, ya que simplemente se realiza por medio de un factor escala lo que nos da una garantía eficiente en el momento de amplificar la señal y además su costo computacional es mínimo, cabe recordar que el realce de la señal se efectúa en los coeficientes wavelet entregados por el bloque wavelet denoising y dependen del tipo de segmento identificado (marka) y el criterio obtenido. Realce( marka ) For k = 0 to k<16 if marka[k] == 0 for j = 0 to j<16 {……….} if marka[k] == 1 for j = 0 to j<16 {……….} if marka[k] == 2 for j = 0 to j<16 //Deteccion de un segmento de silencio // Coeficientes de todas las bandas llevados a cero //Deteccion de un segmento de sonoro // Coeficientes de las bandas intactos //Deteccion de un segmento de sordo 57 {……….} // Coeficientes de las bandas se multiplican con un factor de escala que dependerá del tipo de segmento identificado y el nivel auditivo del paciente. 5.4 Pruebas de Desempeño Después de haber codificado los algoritmos del sistema de segmentación en el DSP TMS320C6701, se procedió a realizar pruebas de tiempo para observar el desempeño de estos ejecutándose en el DSP. En la Tabla 5.1 se muestra el tiempo de ejecución de cada uno de los algoritmos correspondientes a las etapas de análisis del sistema, estimadas en un bloque de captura y procesamiento de 512 muestras, las cuales se deben ejecutar dentro de la rutina de servicio de interrupción (ISR) por finalización de la captura por DMA, la tabla 5.2 tiempos de conversión para la manipulación de los datos tipo float dentro de la función que procesa el bloque de 64ms, estos tiempos son de mucha importancia debido a que si el tiempo de análisis de la señal es mayor que el tiempo de captura, el sistema colapsa y no es posible llevar una implementación en tiempo real. Debido a que el DSP trabaja a una frecuencia de reloj de 133Mhz y el sistema de segmentación procesa la señal de voz en bloques de 512 muestras a una frecuencia de muestreo de 8kHz, es de garantizar que el tiempo máximo que debe tardar la rutina del servicio de interrupción debe ser menor a: 512 T= < 64ms 8000 Expresando el tiempo en ciclos de reloj del DSP: Tciclos = 133000000 * 0.064 = 8512000ciclos Algoritmo Pre-énfasis Dwt + Denoising Normalización Cálculo de Energías Reglas de Selección Realce de la Señal Idwt Total Tiempo (ms) 1,201955 4,414361 26,853195 0,745865 0,292481 0,057894 4,587218 38,152970 Ciclos de % Tiempo Reloj relativo a 64ms 159.860 1.87 587.110 6.89 3’571.475 41.95 99.200 1.16 38.900 0.45 7.700 0.09 610.100 7.16 5’074.345 59.61 Tabla 5.1 Tiempos promedio de ejecución de las funciones dentro de la rutina del servicio de interrupción. 58 Algoritmo de conversión Short a float Float a short Total Tiempo Ciclos % tiempo (ms) de Reloj relativo a 64ms 0,292955 38.963 0.45 0,399624 53.150 0.62 0,692579 92113 1.08 Tabla 5.2 Tiempos promedio de ejecución de conversión de los datos. Algoritmo de conversión Conversión Procesar_Segmento Total Tiempo (ms) 0,692579 38,152970 38,845550 Ciclos de % tiempo Reloj relativo a 64ms 92.113 1.08 5’074.345 59.61 5’166.458 60.69 Tabla 5.3 Tiempo total de la ISR Es de notar que el tiempo total de las funciones de análisis dentro de la ISR equivale a 59.61% con respecto al tiempo de captura máximo posible (tmax = tcaptura = 512/8000 = 64ms), y la conversión de los datos de short a float y viceversa corresponden a 1.08% sumando ambos porcentajes de tiempo obtenemos un 60.69% del tiempo máximo ( tabla 5.3), lo que nos garantiza una ejecución en tiempo real del sistema. El código fuente de los algoritmos empleados se encuentra en el Apéndice B, y las estimaciones de sus tiempos de ejecución en la Tabla 5.1, 5.2 y 5.3. Estos tiempos fueron estimados para un bloque de carácterısticas extraídas a partir de un segmento de captura por DMA. . 59 Capítulo 6 Conclusiones • • • • • • Se logró implementar un sistema automático de segmentación de fonemas por medio de la transformada wavelet discreta en tiempo real sobre un procesador Digital de Señales (DSP). Para eliminar el ruido incorporado en la señal de voz se utilizó la técnica Wavelet Denoising con umbral diferente en cada banda para conservar información importante en los niveles de menor resolución. Se establecieron reglas de selección para clasificar todo el conjunto de fonemas del idioma español, analizando la evolución de la energía de los cuatro niveles de mayor resolución. El método empleado para el realce de la señal de voz resultó ser muy eficiente ya que nos garantiza un realce en las diferentes bandas de frecuencia y en el segmento identificado, además su costo computacional es relativamente muy bajo. Se adaptó el sistema de segmentación propuesto por el grupo de Investigación GDSPROC para ejecutarse en el DSP TMS320C6701, luego de realizar diversas simulaciones para clasificar los segmentos. Para la implementación sobre el DSP TMS320C6701, se adquirieron los datos por medio de la técnica de DMA en doble buffer y considerando para el cálculo de la transformada una continuidad en los segmentos de la señal. 60 Capítulo 7 Proyecciones Ya que el proceso de segmentación juega un papel muy importante en la construcción de los sistemas de reconocimiento continuo de voz (CSR: Continuos-Speech Recognition), y con los estudios elaborados anteriormente en el grupo de investigación GDSPROC es posible fusionar los resultados de este proyecto para la construcción en tiempo real del sistema CSR. Por otra parte se pueden realizar estudios para la implementación de un dispositivo a nivel de hardware que resulte ser de fácil manipulación y asequible en cuanto a precio, para las personas con deficiencias auditivas y con limitaciones económicas ya que el costo de estos dispositivos hoy en día aunque son de una excelente calidad resultan ser demasiado costosos. El sistema de realce empleado nos brinda una garantía en el momento de obtener mayor intensidad de la señal de voz en una banda predeterminada, este sistema puede ser de utilidad es sistemas de ecualización de sonidos por medio de la transformada wavelet discreta ya que su costo computacional es muy pequeño, de esta manera se podría implementar un sistema de ecualización a través de una línea telefónica, ya que la frecuencia de muestreo es de 8kHz, enfocado hacia las personas con limitaciones auditivas. 61 Bibliografía [ADJ03] Alain C. González G., Daniel González S., Juan M. Hernández V., Alberto R. Hernández M., Procesamiento Digital de Señales U del Corazón. Departamento de Ingeniería Eléctrica y Electrónica. Instituto Tecnológico, Toluca. 2003. [Ala03] Alarcón A., Vicente. Anomaly Detection and Prediction in Communication Networks using Wavelet Transform. PhD Thesis. Imperial College London. University London. UK. 2003 [Ber69] Leo L. Beranek. Acústica. Hispano Americana S.A, 2 edition, 1969. [BR99] Claudio Beccetti and Lucio Prina Ricotti. Speech Recognition. John Wiley and Sons, Chichester, 1999. [Cas99] Castillo Condado, O. Evaluación de un reconocedor fonético para el español. Escuela de Ingeniería, Universidad de las Américas-Puebla.1999. [Dal69] Dalbor, Jhon. Spanish Pronunciation: Theory and Practice. Holt, Rinehart and Winston. New York, 1969. [Her03] Marianito Hernández Díaz, Análisis Comparativo de Algoritmos para Reducción de Ruido en Señales Utilizando Wavelets, Universidad de Puebla. pag.26, 2003. [Hur03a] Jorge Iván Marín Hurtado. Reconocimiento de Voz en Tiempo Real por medio de la Transformada Wavelet y Procesadores Digitales de Señales. Informe Proyecto de Investigación 195 UNIQUINDIO, 2003. [Hur03b] Jorge Iván Marín Hurtado. Procesamiento Digital de Señales. Texto Guía para el Curso de Procesamiento Digital de Señales UNIQUINDIO, 2002. [Hur03c] Jorge Iván Marín Hurtado. Clase para el control de la tarjeta de sonido Linux-Windows. www.geocities.com/gdsproc/dsp, 20 62 [Jal00] Jalali, Payman. Wavelets and applications. Energy Technology Department. Lappeenranta University of Technology. August 2000. [LD96] C.J. Long and S. Datta. Wavelet based feature extraction for phoneme recognition. Proc. ICSLP, 1:264–267, 1996. [LF94] Paul A. Lynn and Wolfgang Fuerst. Digital Signal Processing with Computer Applications. John Wiley and Sons, 1994. [Mal89] S. G. Mallat, “A Theory for Multiresolution Signal Decomposition: The Wavelet Representation”, IEEE Transactions on Pattern Recognition and Machine Intelligence, vol. 11, nº 7, pags. 674-693, 1989. [Mar99] Martin, Frederick N. Introducción a la Audiologia, AUDIOLOGIA, 1999. [MHLPA03] J.I. Marín-Hurtado, A. López-Parrado, and R. Arango. Segmentación de señales de voz usando dsp y transformada wavelet. Memorias V Congreso Colombiano de Automática, 2003. [MMOP07] Michel Misiti, Yves Misiti, Georges Oppenheim y Jean-Michel Poggi Wavelet Toolbox For Use with MATLAB Mathworks, 1997. [MYG97] Michel Misiti, Yves Misiti, Georges Oppenheim y Jean-Michel Poggi Wavelet Toolbox For Use with MATLAB Mathworks, 1997. [Per01] Javier Ramírez Pérez de Inestrosa. “Nuevas Estructuras RNS para la Síntesis VLSI de Sistemas de Procesamiento Digital de Señales”. Tesis Doctoral. Universidad de Granada. 2001. [Pol96] Polikar, Robi. The Wavelet Tutorial. Dept. Of Electrical and Computer Engineering. Rowan University. 1996. [RB98] Raghuveer M. Rao and Ajit S. Bopardikar. Wavelet Transforms. Addison Wesley, 1998. [Teo98] Anthony Teolis. Computational Signal Processing with Wavelets. Birkhauser, Boston, 1998. [Tex00] Texas Instruments. TMS320C6000 CPU And Instruction Set Reference Guide. January 2000. [TLS94] B. T. Tan, R. Lang, H. Schroder, A. Spray, and P. Dermody. Applying wavelet analysis to speech segmentation and classification.Proc. SPIE 2242, Wavelet Application Volume:750–761, 1994. [VK95] M. Vetterli, J. Kovacevic, Wavelets and Subband Coding. Prentice Hall, 1995. 63 Apéndice A Código fuente para MATLAB B.1 Código fuente del programa principal en matlab % El programa está simplificado en algunas funciones % se anexa un CD adjunto para las lines de código de % funciones optimizadas close all clear all % lectura de un archivo de sonido previamente capturado archi = input('archivo (sin extension .wav): '); [x,fs1] = wavread( strcat(archi, '.wav') ); [Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db8'); %Cambia la frecuencia de muestreo a 8KHz %======================================== if (fs1 ~= 8000) x = resample(x, 36, 100); fs1 = 8000; end % Ajusta la señal a determinado numero de muestras (multiplo 512) %==================================================================% N = (length(x)/2048-fix(length(x)/2048)); if (N < 0.3) n = 2048*fix(length(x)/2048) + 512; elseif ((N > 0.3)&(N<0.7)) n = 2048*fix(length(x)/2048) + 1024; else n = 2048*fix(length(x)/2048) + 2048; end X = ajustar(x,n); maxbandas=4; w_name='db8'; % Análisis de la señal por bloques de 512 datos % y su respectiva recuperación con el realce deseado %===================================================================== cont=1; x_ant=0; 64 x=[]; XTT=[]; while muestra <= length(X) Ct=[];Cb1=[]; if ( muestra+512 > length(X) ) tx = [ X(muestra:length(X)) ]; else tx = X(muestra:muestra+511); end xa = conv(tx , [1 -0.95]); x = [x_ant+xa(1); xa(2:512)]; x_ant=xa(513); wavelet(x); denoising( nivel_detalle, umbral); % Normalizacion de energia % Calcula la Derivada del logaritmo del valor absoluto % XX = Der( log ( || ) ) % y la Exponencial de la Integral de los Coeficientes Wavelet % exp ( integral ( XX ) ) Cb1 = normalizacion(Coefs_wavelet); Cb1=[D1' D2' D3' D4' A4']; % Cálculo de energías lenbanda = length(Cb1)/2 ; posbanda = 1; energia=[]; E_deltas = zeros(4,16); for ibanda=1:maxbandas xbanda = Cb1(posbanda:posbanda+lenbanda-1)'; lensegmento = 32/(2^ibanda); energia_banda = []; numsegmentos = 0; for i=1:lensegmento:lenbanda energia_banda(numsegmentos+1) = sum(xbanda(i:i+lensegmento-1).^2); numsegmentos = numsegmentos+1; end energia_banda=[energia_ant(ibanda,:) energia_banda]; energia_banda1 = filter([1 1 1 1 1 1 1 1], 1, energia_banda); energia_ant(ibanda,:) = energia_banda(17:23); e_nivel = energia_banda1(8:23); energia = [energia; e_nivel]; posbanda = posbanda+lenbanda; lenbanda = lenbanda/2; for l=1:numsegmentos E_deltas(ibanda,l) = sign( e_nivel(l) - Ant_eprom(ibanda) ); Ant_eprom(ibanda) = e_nivel(l); end end Ant_eprom(ibanda) = e_nivel(l); 65 % Reglas de selección establecen el tipo de segmento etiqueta = reglas(E_bandas,E_deltas); %Realce de la señal for ik=1:numsegmentos if(etiqueta(ik)==0) D1_inv(16*ik-15 :16*ik)=zeros(1,16); D2_inv( 8*ik- 7 : 8*ik)= zeros(1,8); D3_inv( 4*ik- 3 : 4*ik)= zeros(1,4); D4_inv( 2*ik- 1 : 2*ik)= zeros(1,2); A4_inv( 2*ik- 1 : 2*ik)= zeros(1,2); end if(etiqueta(ik)==1) D1_inv(16*ik-15 :16*ik) = D1_inv(16*ik-15 :16*ik)* realce_Sordo; D2_inv( 8*ik- 7 : 8*ik) = D2_inv( 8*ik- 7 : 8*ik)* realce_Sordo; D3_inv( 4*ik- 3 : 4*ik) = D3_inv( 4*ik- 3 : 4*ik)* realce_Sordo; D4_inv( 2*ik- 1 : 2*ik) = D4_inv( 2*ik- 1 : 2*ik)* realce_Sordo; A4_inv( 2*ik- 1 : 2*ik) = A4_inv( 2*ik- 1 : 2*ik)* realce_Sordo; end if(etiqueta(ik)==2) D1_inv(16*ik-15 :16*ik) = D1_inv(16*ik-15 :16*ik)* realce_Sonoro; D2_inv( 8*ik- 7 : 8*ik) = D2_inv( 8*ik- 7 : 8*ik)* realce_Sonoro; D3_inv( 4*ik- 3 : 4*ik) = D3_inv( 4*ik- 3 : 4*ik)* realce_Sonoro; D4_inv( 2*ik- 1 : 2*ik) = D4_inv( 2*ik- 1 : 2*ik)* realce_Sonoro; A4_inv( 2*ik- 1 : 2*ik) = A4_inv( 2*ik- 1 : 2*ik)* realce_Sonoro; end end L1_inv=[D1_inv L1_ant']; L2_inv=[D2_inv L2_ant']; L3_inv=[D3_inv L3_ant']; L4_inv=[D4_inv L4_ant']; C4_inv=[A4_inv C4_ant']; % Wavelet Inversa Ca3 = idwt(C4_inv * Realce , L4_inv * Realce , w_name); Ca2 = idwt(Ca3(1:77) , L3_inv * Realce , w_name); Ca1 = idwt(Ca2(1:139), L2_inv * Realce , w_name); Xa = idwt(Ca1(1:263), L1_inv * Realce , w_name); cont=cont+1; muestra=muestra+512; end%fin for muestra 66 Apéndice B Código fuente para el DSP TMS320C6701 B.1 Código fuente del programa principal #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "captura_dma.h" #include "segmentacion.h" float *buff; float *coefs1; int bBufferProcesado = 0; void procesa_segmento_ISR (short *buffer, int nmuestras) { int k; short* salidaDAC; short* entradaADC; short val; entradaADC = buffer; for(k=0;k<L;k++) { buff[k] = entradaADC[2*k] * 0.000030519; } procesar_segmento( buff, coefs1 ); // Escribe al DAC // salidaDAC = retornar_bufferout(); if (salidaDAC!=NULL) { for(k=0;k<L;k++) { salidaDAC[2*k] = buff[k] * 32767.0; 67 salidaDAC[2*k+1] = 0; } } bBufferProcesado = 1; } void main() { puts("Proyecto Segmentacion - Realce\n"); puts("Iniciando DSP..."); if (configurar_codec(HABILITAR_CAPTURAESCRITURA,MIC_SEL)==ERROR) { puts("Hubo un error al iniciar DSP!"); return; } puts("DSP [OK]"); puts("Espere, iniciando sistema..."); /*inicializacion de variables */ /****************************************************/ buff = (float*) malloc( L*sizeof(float) ); coefs1 = (float*) malloc( L*sizeof(float) ); iniciar_segmentacion(); /*****************************************************/ procesa_bufferin_func = procesa_segmento_ISR; iniciar_lectura(); retornar_bufferout(); retornar_bufferout(); iniciar_escritura(); puts("Sistema [OK]"); while (1) { while (bBufferProcesado == 0); bBufferProcesado = 0; /* mostrar la información */ } } B.2 Código fuente función que procesa el segmento B.2.1 Archivo de cabecera segmentación.h #ifndef _segmentacion_ #define _segmentacion_ #define L 512 #define N_NIVELES 4 #define lm 16 #define umbral 0.015 #define ESC_d1 10 68 #define ESC_d2 10 #define ESC_d3 10 #define ESC_d4 10 #define ESC_a4 10 void iniciar_segmentacion(); void procesar_segmento( float *in, float* out ); void preenfasis(float *Xseg, float *h, float *Yseg); void conv(float *xn, float *h, int lx, int lh, float *yn, float *ci); void dwt_bandas(float* tx, float **coefs); void denoising(float* Xruido, int j, float Umbral); void normalizacion(); void energias(float* Ed1,float* Ed2,float* Ed3,float* Ed4,float* Ea4); void reglas_seleccion(float** Ebandas,float **Edeltas,int* etiqueta); void realce(int* mark); #endif B.2.2 Archivo fuente segmentación.c /* Contiene todas las funciones necesarias para el análisis de un bloque de captura en el DSP */ #include <stdio.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include "dwt.h" #include "segmentacion.h" #include "db16.h" float Xa[L]; float maximo[4],prom_ant=1,Emax=0,Emin=0; int *etiqueta; float hp[]={1.0,-0.95}; float hmmovil[]={1,1,1,1,1,1,1,1}; //Condiciones iniciales para cada funcion float der1_ant=0,der2_ant=0,der3_ant=0,der4_ant=0,derA4_ant=0; float Xseg_ant[]={0}; float yant1=0,yant2=0,yant3=0,yant4=0,yantA4=0; float Det1[256],Det2[128],Det3[64],Det4[32],Apr4[32]; float Dn1[256],Dn2[128],Dn3[64],Dn4[32],An4[32]; float D1_energia[16+7],D2_energia[16+7],D3_energia[16+7],D4_energia[16+7],A4_energia[16+7]; float D1_mediamov[16],D2_mediamov[16],D3_mediamov[16],D4_mediamov[16],A4_mediamov[16]; 69 float D1_deltas[16],D2_deltas[16],D3_deltas[16],D4_deltas[16],A4_deltas[16]; float D1_ant_ener=0,D2_ant_ener=0,D3_ant_ener=0,D4_ant_ener=0,A4_ant_ener=0; float D1mov_ant[]={0,0,0,0,0,0,0},D2mov_ant[]={0,0,0,0,0,0,0}; float D3mov_ant[]={0,0,0,0,0,0,0},D4mov_ant[]={0,0,0,0,0,0,0}; float A4mov_ant[]={0,0,0,0,0,0,0}; void iniciar_segmentacion() { Det1[0] = 0; Det2[0] = 0; Det3[0] = 0; Det4[0] = 0; Apr4[0] = 0; Dn1[0]=0;Dn2[0]=0;Dn3[0]=0;Dn4[0]=0;An4[0]=0; etiqueta = (int*) malloc( lm*sizeof(int) ); dsp_iniciar_dwt(L,Ndb16,N_NIVELES); dsp_iniciar_idwt(L,Ndb16,N_NIVELES); } void procesar_segmento( float *in, float* out ) { //int k; float* Ebandas[4]; float* Edeltas[4]; float* coefs[5]; /**********************************************************/ /* for(k=0;k<lm;k++) etiqueta[k]=1; */ preenfasis( in, hp, Xa ); coefs[0] = Det1; coefs[1] = Det2; coefs[2] = Det3; coefs[3] = Det4; coefs[4] = Apr4; dwt_bandas(Xa,coefs); normalizacion(); energias(Dn1,Dn2,Dn3,Dn4,An4); Ebandas[0] = D1_mediamov; Ebandas[1] = D2_mediamov; Ebandas[2] = D3_mediamov; Ebandas[3] = D4_mediamov; Edeltas[0] = D1_deltas; Edeltas[1] = D2_deltas; 70 Edeltas[2] = D3_deltas; Edeltas[3] = D4_deltas; reglas_seleccion(Ebandas,Edeltas,etiqueta); realce(etiqueta); dsp_idwtB(coefs,g0,g1,N_NIVELES,L,Ndb16,out); } /***************************************************************************/ void preenfasis(float *Xseg, float *h, float *Yseg) { conv(Xseg,h,L,2,Yseg,Xseg_ant); } /***************************************************************************/ void conv(float *xn, float *h, int lx, int lh, float *yn, float *ci) { int w, k,ln; float y; for(w=0;w<lh-1;w++) { y = 0.0; for (k = 0; k<=w; k++) y += xn[w-k]*h[k]; ln=0; for (k = w+1; k<lh; k++) y += ci[ln++]*h[k]; yn[w] = y; } for(w=lh-1;w<lx;w++) { y = 0.0; for (k = 0; k<lh; k++) y += xn[w-k]*h[k]; yn[w] = y; } for(w=0;w<lh-1;w++) { ci[w] = xn[lx-lh+1+w]; } } /***************************************************************************/ void dwt_bandas(float* tx, float **coefs) { dsp_dwtB( tx, h0, h1, 4, L, Ndb16, coefs ); denoising(Det1,256,umbral); denoising(Det2,128,umbral); denoising(Det3, 64,umbral); denoising(Det4, 32,umbral); denoising(Apr4, 32,umbral); 71 } /***************************************************************************/ void denoising(float* Xruido, int j, float Umbral) { int k; for(k=0;k<j;k++) { if(fabs(Xruido[k])<Umbral) Xruido[k]=0; else { if(Xruido[k]>Umbral) Xruido[k]=Xruido[k]-Umbral; else Xruido[k]=Xruido[k]+Umbral; } } } /***************************************************************************/ void logabs(float* xnor, int nx, float* ynor) { int k; for(k=0;k<nx;k++) { // Cálculo logarítmo del valor absoluto ynor[k] = log(fabs(xnor[k])+ 1e-8); } } void derivtemp(float* xder, int nx, float* yder, float* der_ant) { int k; float der_ant_sig = xder[nx-1]; for(k=nx-1;k>0;k--) { // Calculo de la Derivada temporal yder[k] = xder[k]-xder[k-1]; } yder[0] = xder[0] - (*der_ant); *der_ant = der_ant_sig; } void integexp(float* xint, int nx, float *yant, float* yint) { int k; // Calculo de la Integral Trapezoidal for(k=0;k<nx;k++) { yint[k]=xint[k]+ *yant; *yant=yint[k]; // Calculo de la Exponenciaci¢n yint[k] = exp( yint[k] ); } } 72 void normalizacion() { // Cálculo logarítmo del valor absoluto logabs(Det1, 256, Dn1); logabs(Det2, 128, Dn2); logabs(Det3, 64, Dn3); logabs(Det4, 32, Dn4); logabs(Apr4, 32, An4); // Calculo de la Derivada temporal derivtemp(Dn1, 256, Dn1, &der1_ant); derivtemp(Dn2, 128, Dn2, &der2_ant); derivtemp(Dn3, 64, Dn3, &der3_ant); derivtemp(Dn4, 32, Dn4, &der4_ant); derivtemp(An4, 32, An4, &derA4_ant); // Calculo de la integracion trapezoidal y exponenciacion integexp(Dn1, 256, &yant1, Dn1); integexp(Dn2, 128, &yant2, Dn2); integexp(Dn3, 64, &yant3, Dn3); integexp(Dn4, 32, &yant4, Dn4); integexp(An4, 32, &yantA4,An4); } /***************************************************************************/ float energ(float* xn, int nx) { int j; float yn = 0; for(j=0;j<nx;j++) { yn += pow(xn[j],2); } return yn; } void energias(float* Ed1,float* Ed2,float* Ed3,float* Ed4,float* Ea4) { float val; //Energia de las 4 bandas por cada 4ms = 32 muestras int k; for(k=0;k<16;k++) { D1_energia[k+7] = energ( &Ed1[k*16], 16 ); D2_energia[k+7] = energ( &Ed2[k*8], 8 ); D3_energia[k+7] = energ( &Ed3[k*4], 4 ); D4_energia[k+7] = energ( &Ed4[k*2], 2 ); A4_energia[k+7] = energ( &Ea4[k*2], 2 ); } //filtro de media movil 73 conv(D1_energia+7,hmmovil,16,8,D1_mediamov,D1mov_ant); conv(D2_energia+7,hmmovil,16,8,D2_mediamov,D2mov_ant); conv(D3_energia+7,hmmovil,16,8,D3_mediamov,D3mov_ant); conv(D4_energia+7,hmmovil,16,8,D4_mediamov,D4mov_ant); conv(A4_energia+7,hmmovil,16,8,A4_mediamov,A4mov_ant); //Variaciones de energia for(k=0;k<16;k++) { val = D1_mediamov[k]-D1_ant_ener; if(val>0) D1_deltas[k] = 1; else if(val<0) D1_deltas[k] =-1; else //((D1_mediamov[k]-D1_ant_ener)==0) D1_deltas[k]= 0; val = D2_mediamov[k]-D2_ant_ener; if(val>0) D2_deltas[k] = 1; else if(val<0) D2_deltas[k] =-1; else //((D2_mediamov[k]-D2_ant_ener)==0) D2_deltas[k]= 0; val = D3_mediamov[k]-D3_ant_ener; if(val>0) D3_deltas[k] = 1; else if(val<0) D3_deltas[k] =-1; else //((D3_mediamov[k]-D3_ant_ener)==0) D3_deltas[k]= 0; val = D4_mediamov[k]-D4_ant_ener; if(val>0) D4_deltas[k] = 1; else if(val<0) D4_deltas[k] =-1; else //((D4_mediamov[k]-D4_ant_ener)==0) D4_deltas[k]= 0; /* val = A4_mediamov[k]-A4_ant_ener; if(val>0) A4_deltas[k] = 1; else if(val<0) A4_deltas[k] =-1; else //((A4_mediamov[k]-A4_ant_ener)==0) A4_deltas[k]= 0; */ D1_ant_ener=D1_mediamov[k]; D2_ant_ener=D2_mediamov[k]; D3_ant_ener=D3_mediamov[k]; D4_ant_ener=D4_mediamov[k]; A4_ant_ener=A4_mediamov[k]; } } /***************************************************************************/ void reglas_seleccion(float** Ebandas,float **Edeltas, int* etiqueta) { int k,j; float banda_max[4], prom, sum; float maxtemp, bandatemp,porcentaje; for(k=0;k<16;k++) etiqueta[k]=1; //-----------------------------------------/* for recorre cada segmento*/ 74 for(k=0;k<16;k++) { int sil1=0; int finvoz=0,cont=0; // identifica y lo etiqueta // Detecta los tramos de silencio // En el Segmento de 64ms = 512 datos banda_max[0]=4; banda_max[1]=4; banda_max[2]=4; banda_max[3]=4; maximo[0]=0;maximo[1]=0;maximo[2]=0;maximo[3]=1e20; prom=0; sum=0; //--------------------------------------------------for(j=0;j<N_NIVELES;j++) { sum+=Ebandas[j][k]; //determina el valor maximo de cada banda por segmento if(Ebandas[j][k]>maximo[0]) { maximo[0] = Ebandas[j][k]; banda_max[0]= j; } //determina el valor minimo de cada banda por segmento if(Ebandas[j][k]<maximo[3]) { maximo[3] = Ebandas[j][k]; banda_max[3]= j; } if(Edeltas[j][k]==0) // Si las variaciones de Energia son constantes sil1+=1; // En las 4 Bandas // Y la energia en Cada una no supera X umbral // se denota como un segmento de silencio if(Edeltas[j][k]== -1) finvoz=finvoz+1; } /* fin for de los niveles*/ //-------------------------------------------------prom=sum/4; // promedio de las bandas de energia porcentaje=prom/prom_ant; if(prom > prom_ant) // si el promedio de energia aumenta { if(Emin!=0) etiqueta[k]=1; Emax++; Emin=0; } else {/*if(Emin!=0) etiqueta[k]=4; */ Emin++; Emax=0; } //-------------------------------------------------// while ordena las energias de la mayor a la menor con su respectivo nivel j=0; while(cont<2) { 75 if((Ebandas[j][k]<maximo[0])&(Ebandas[j][k]>maximo[3])) { if(cont==0) { maxtemp=Ebandas[j][k]; bandatemp=j; cont++; } else if(cont==1) { if(Ebandas[j][k]<maxtemp) { maximo[1] = maxtemp; banda_max[1] = bandatemp; maximo[2] = Ebandas[j][k]; banda_max[2] = j; cont++; } else { maximo[1] = Ebandas[j][k]; banda_max[1]= j; maximo[2] = maxtemp; banda_max[2]= bandatemp; cont++; } //ordena las energias de la mayora la menor } } j++; } /*fin while*/ //-----------------------------------------------//------------------------------------------------if((maximo[0]<1e7)||((sil1==4)&(maximo[0]<1e5))||(prom < 1e5)) etiqueta[k]=0; silencio //-------------------------------------else { //Detecta // Deteccion de un SEGMENTO SONORO se marca = 7,8,9,10 //---------------------------------------------------------------// banda de menor energía mayor a 1% de la predominante = 1e15 if((maximo[3]>1e13)& (maximo[0]>1e15)) etiqueta[k]=2; // banda predominante d-4 >1e13 las demás > 1e11 if( ((banda_max[0]==3)&(maximo[0]>1e15)) & (maximo[2]>1e10) ) etiqueta[k]=2; //el promedio de energia en las bandas > 2.6e13 if((prom >= 3e13)&(porcentaje<1)) etiqueta[k]=2; // predominan dos bandas con umbral fuerte... las otras aportan energía if((maximo[1]> 0.5e15)&(maximo[3]>1e8)) etiqueta[k]=2; //if(etiqueta[k]!=2) 76 Segmento de if(etiqueta[k]==1) { //----------------------------------------------------------------// Deteccion de un SEGMENTO SORDO se marca = 3,4,5,6 //---------------------------------------------------------------//al menos 1 banda no porta energia if((maximo[3]<1e7)&(maximo[0]<1e13)) etiqueta[k]=1; //Si el promedio de energía esta en el rango if ((prom > 1e7)&(prom < 1e10)) etiqueta[k]=1; //energía en la banda predominante es pequeña if(maximo[0]<1e12) etiqueta[k]=1; //la banda de menor energia es d-1 y dos bandas tienen 0 energía if((banda_max[3]==1)&(maximo[2]<1e7)) etiqueta[k]=1; if((banda_max[0]==4)&(maximo[0]<5e12)) etiqueta[k]=1; } //Fin deteccion de segmento sordo } /* fin else */ prom_ant = prom; } // fin del ciclo por segmento } //fin de funcion /***************************************************************************/ void realce(int* marka) { int k,j; for(k=0;k<16;k++) { if(marka[k]==0) //Deteccion de un segmento de silencio { for(j=0;j<16;j++) //Elementos del segmentos los pone en 0 Det1[j+(16*k)] = 0; for(j=0;j<8;j++) Det2[j+(8*k)] = 0; for(j=0;j<4;j++) Det3[j+(4*k)] = 0; for(j=0;j<2;j++) {Det4[j+(2*k)] = 0; Apr4[j+(2*k)] = 0; } } if(marka[k]==1) //Deteccion de un segmento sordo { for(j=0;j<16;j++) //se efectua el realce por un valor de escala Det1[j+(16*k)] *= ESC_d1; for(j=0;j<8;j++) 77 Det2[j+( 8*k)] *= ESC_d2; for(j=0;j<4;j++) Det3[j+( 4*k)] *= ESC_d3; for(j=0;j<2;j++) { Det4[j+( 2*k)] *= ESC_d4; Apr4[j+( 2*k)] *= ESC_a4; } } //los segmentos sonoros no se les efectua el realce //ya que son los de mayor intensidad if(marka[k]==2) //Deteccion de un segmento sordo { for(j=0;j<16;j++) //se efectua el realce por un valor de escala Det1[j+(16*k)] *= ESC_d1/10; for(j=0;j<8;j++) Det2[j+( 8*k)] *= ESC_d2/10; for(j=0;j<4;j++) Det3[j+( 4*k)] *= ESC_d3/10; for(j=0;j<2;j++) { Det4[j+( 2*k)] *= ESC_d4/10; Apr4[j+( 2*k)] *= ESC_a4/10; } } } } 78