Beruflich Dokumente
Kultur Dokumente
8
1. TÍTULO
8
2. ANTECEDENTES
8
Reconocedor de dígitos: Proyecto independiente de ITZAR GORETTI ALONSO
GONZÁLEZ Ingeniero Técnico de telecomunicaciones Universidad de Las Palmas de
Gran Canaria. Año 2002. España. En este proyecto se hace uso del análisis de voz,
clasificación de patrones y reconocimiento de palabras aisladas dependiente del locutor.
Silla de Ruedas Inteligente Controlada por Voz. Proyecto desarrollado por: J.M.
Alcubierre, J. Minguez, L. Montesano, L. Montano, O. Saz, E. Lleida. Trabajo conjunto
entre el Instituto de Investigación en Ingeniería de Aragón, Departamento de Informática e
Ingeniería de Sistemas, Departamento de Ingeniería Electrónica y Comunicaciones de la
Universidad de Zaragoza, España. Presentado en el Primer Congreso Internacional de
Domótica y Robótica y en la revista de Tele asistencia para todos Fundación ONCE.
Muestran una silla de ruedas en donde se aplica reconocimiento de voz, reconocimiento de
imágenes y navegación en un entorno controlado. Año 2005.
9
8
3. PLANTEAMIENTO DEL PROBLEMA
El oído humano esta habilitado para desarrollar variadas tareas de procesamiento a las
señales que le llegan. Por ejemplo, posee mecanismos auditivos para realizar seguimiento
de señales en ambientes ruidosos, cambios finos de intensidad y de frecuencia pueden ser
medidos por el oído. El oído procesa una señal de presión acústica transformando esta en
patrones de vibraciones mecánicas en la membrana basilar, y representando dicho patrón
por una serie de pulsos a ser transmitidos al nervio auditivo. En la corteza auditiva se
reciben los impulsos sonoros y se interpretan como sonidos distintos. Sin embargo, las
señales deben transmitirse a las áreas auditivas de asociación circundantes, para dilucidar
su significado. Este proceso de identificación le es fácil al ser humano, sin embargo crear
un prototipo computacional de reconocimiento automático del habla no es una tarea
sencilla.
9
rigurosidad del entrenamiento del codebook, la elección de parámetros iníciales en el
entrenamiento de los modelos de cada palabra, las condiciones del ambiente etc.
10
4.
11
5. JUSTIFICACIÓN
12
6. OBJETIVOS
13
6. MARCO TEÓRICO
La señal de voz es una onda de presión acústica que se genera voluntariamente a partir de
movimientos de la estructura anatómica del sistema fonador humano. La producción de la
voz comienza en el cerebro con la conceptualización de la idea que se desea transmitir, la
cual se asocia a una estructura lingüística, seleccionando las palabras adecuadas y
ordenándolas de acuerdo con unas reglas gramaticales. A continuación el cerebro produce
los comandos nerviosos que mueven los órganos vocales para producir los sonidos. La
unidad mínima de una cadena hablada es el fonema, el cual posee un carácter distintivo en
la estructura de la lengua. La combinación de los fonemas da origen a las sílabas, las cuales
conforman las palabras, y estas a su vez, las oraciones [13].
Desde el punto de vista de la ingeniería es lógico pensar que este sistema físico puede
representarse como un filtro, cuya función de transferencia depende del sonido articulado y,
por tanto, de la posición de los distintos órganos involucrados en la generación de la voz.
La entrada del filtro se puede modelar mediante una señal de excitación, que corresponde al
paso del aire generado por los pulmones a través de la tráquea y las cuerdas vocales, y
también será dependiente del sonido generado [9].
En él se considera a la voz producida por una señal de excitación en forma de impulsos que
provienen de la acción de las cuerdas vocales, alternado de forma aleatoria con ruido
blanco, que alimenta a un filtro de características variables, aunque con una constante de
tiempo mucho mas lenta. De esta manera se puede incorporar al modelo la información del
tracto vocal, cuyas piezas móviles están consideradas con las características variables del
filtro. La información del tracto vocal esta contenida en la envolvente del espectro
resultante.
14
Figura 1. Modelo Source-Filter
Según Nyquist sabemos que es necesaria una frecuencia de muestreo de por lo menos el
doble del ancho de banda de la señal a caracterizar, sobre esta base y para un análisis
mínimo (en lo que respecta a frecuencia) de la señal de voz se utiliza una frecuencia de
muestreo fs de 8khz, aunque se suele usar 16khz si se desea obtener mayor detalle en
frecuencia lo que mejora la resolución para tratamiento de la señal.
La cuantificación más comúnmente usada, es de 8 bits, mínimo requerido para una calidad
baja, puede mejorarse su S/R con una técnica no lineal de cuantificación, se obtienen
excelentes resultados aumentando la cuantificación a 16 bits [13].
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 lo que se realiza mediante dos
procesos: muestreo y cuantificación.
La señal vocal tiene componentes de frecuencia que pueden llegar a los 10 kHz., sin
embargo la mayor parte de los sonidos vocales tiene energía espectral significativa hasta los
5 kHz solamente los sonidos fricativos poseen componentes que pueden llegar a los 10
kHz.
6.3 PRE-PROCESAMIENTO
6.3.1 Pre-énfasis
15
Hz=1-az (6.1)
La ecuación de diferencias será:
yn=sn-a×sn-1 (6.2)
6.3.2 Ventaneo
6.3.3 Segmentación
Se han planteado diferentes maneras de clasificar eventos en una señal de voz. Quizá la más
simple y más empleada, está relacionada con la generación de la voz e incluye tres estados:
silencio cuando no hay voz; sonoro cuando se presenta vibración de las cuerdas vocales; y
sordo cuando las cuerdas vocales no vibran.
16
6.4 COEFICIENTES DE PREDICCIÓN LINEAL
(6.4)
* Ventajas
17
Representación discreta de las señales de voz. Asociando una característica fonética con
cada vector del codebook, el proceso de elección del vector que mejor lo representa es
equivalente a asignar una característica fonética a cada segmento de voz.
* Desventajas
El almacenamiento requerido para los vectores del codebook no es pequeño. Cuanto más
grande sea el codebook menor es el error. Para un codebook de 1000 o más entradas, el
almacenamiento no es irrelevante. Hay que realizar un balance entre error de
cuantificación, procesamiento y almacenamiento del codebook.
1. Un gran número de vectores de observación, V1, V2,....., Vn, que conforman el grupo de
entrenamiento. El grupo de entrenamiento se usa para crear el grupo de vectores del
codebook "optimo" que representa la variabilidad espectral observada en el grupo de
entrenamiento.
2. Una medición de distancia entre cada par de vectores espectrales de observación para
agrupar el conjunto de vectores de entrenamiento como así también para asociar o clasificar
vectores arbitrarios a cada entrada del codebook.
3. Un procedimiento de clasificación para ubicar y calcular los centroides. Sobre la base del
particionamiento que clasifica el grupo de n vectores en M clústeres o sectores primero
elegimos el número M, codewords del codebook, para luego proceder a la clasificación.
Mide la línea recta que une dos puntos en un espacio Euclidiano. Si tomamos como
ejemplo un espacio unidimensional la distancia será la resta de ambas coordenadas: D (x1,
x2) = x2 – x1 en un plano será la hipotenusa del triángulo rectángulo formado por los
puntos (Pitágoras) en tres dimensiones y por extensión en un espacio multidimensional de
orden n, se calcula una "hipotenusa" n dimensional, lo que generaliza el cálculo de la
distancia mínima.
18
Al final de los distintos pasos para el tratamiento de la señal de voz, se obtiene un vector
que contiene la información vocal que representa a la ventana temporal correspondiente, de
alguna manera una colección de características que describen de la mejor manera posible la
voz humana. Estos vectores son conocidos en la literatura del reconocimiento de voz como
vectores de observación.
Cabe aclarar que existen varias formas de representación de estas características como LPC
(Linear Prediction Code) o Auditory System, pero la que en la actualidad da los mejores
resultados es el análisis Cepstral, en particular los coeficientes MFCC (Mel Frecuency
Cepstral Coeficients). También suele incorporarse al vector de Observación la información
de la primera y segunda derivadas del Cepstrum con respecto al tiempo para agregar
información de las características dinámicas del sistema y el logaritmo de la energía total de
la ventana.
Este método de clasificación se denomina k-Means debido a que se agrupan los vectores en
torno a k valores medios, quedando formados k sectores (en nuestro caso k=M). Existe el
problema de inicialización de los valores de µi, y su reestimación a medida que progresa el
algoritmo.
Algoritmo K-Means
1. Inicialización: Arbitrariamente elegimos M vectores o palabras de código, codewords,
como el grupo inicial del codebook.
2. Búsqueda del mas cercano: Por cada vector de observación, se busca el codeword en el
codebook que es el más cercano (en términos de distancia), y asigna a ese vector a la celda
correspondiente.
19
3. Actualización del centroide: actualiza el codeword en cada celda o sector usando el
centroide de los vectores de entrenamiento asignados a un sector.
4. Iteración: Repite los pasos 2 y 3 hasta que la distancia media caiga debajo de un umbral
prefijado.
La forma de cada sector o celda o partición es muy dependiente de la medida de distorsión
espectral y las estadísticas de los vectores en el grupo de entrenamiento. Este método es el
más simple y por tanto existen numerosas modificaciones y mejoras, algunos de sus puntos
débiles son:
1. Los resultados dependen en forma muy acentuada de los valores iníciales elegidos como
palabras de código.
2. También hay gran dependencia del número de sectores M así como de la implementación
de la "distancia" usada.
Algoritmo LBG
Se analizará con algún detalle debido a su buen desempeño, para eso comenzaremos por el
algoritmo fundamental LBG. El algoritmo LBG, lleva su nombre debido a sus autores Y.
Linde, A. Buzo y R. M. Gray, en él se elige 1 codeword inicial de entre los vectores de
datos a clasificar, luego se utiliza el algoritmo de división binaria para duplicar el número
de codewords, los vectores de observación se agrupan en torno a los codewords que les
presentan menor distancia, se recalculan los codewords como la media multidimensional de
cada sector y se agrupan nuevamente los datos, el proceso se detiene cuando el codebook
no presenta variación significativa y al llegar al número de codewords deseados.
Este algoritmo de gran popularidad (que utiliza el algoritmo k-Means) produce codebooks
que logran un mínimo local en la función de error por distorsión. Para generar un codebook
de M sectores o palabras de código:
En primer lugar designando un codeword inicial para luego utilizando una técnica de
división llegar a obtener un codebook inicial, luego iterando la misma técnica de división
en los codewords hasta que llegamos a obtener el número de codewords igual a M que va a
ser el tamaño del codebook deseado.
1. Designar 1 vector del codebook o codeword inicial, éste resulta ser el centroide del grupo
de los vectores de entrenamiento.
20
2.1. Calcular el error o distancia media entre el codeword inicial y los vectores de
entrenamiento:
4. Usar el algoritmo K-Means para tomar el mejor grupo de centroides para la separación
del codebook.
5. Iterar pasos 3 y 4 hasta llegar a un codebook de tamaño M.
Una de las causas que motivo el uso de un VQ fue la suposición que, en el límite, el
codebook debería idealmente tener 36 vectores, uno por cada fonema, suposición que es
incorrecta.
Un procedimiento de cuantificación para señal de voz elige el vector más cercano del
codebook al vector de observación y utiliza ese vector denominado codeword, como la
representación resultante para etapas posteriores. Se refiere como al vector "vecino" más
cercano, toma como entrada, vectores de señal de voz y da como respuesta, a su salida, el
vector que mejor representa esa entrada [15].
Dado un modelo HMM pueden definirse sobre el mismo los siguientes elementos, que
caracterizan completamente al HMM:
• N: cantidad de estados del modelo. Si bien no son observables, para algunas aplicaciones
suelen tener algún significado físico asociado.
21
Siendo los elementos aij comúnmente expresados por medio de la matriz de transiciones A,
matriz de probabilidad de transición entre estados y los elementos bjk comúnmente
expresados por medio de la matriz B, matriz de probabilidad de emisión de símbolos en un
estado cualquiera.
Desde el punto de vista del modelado de segmentos o símbolos de voz, los HMM son muy
versátiles, pudiéndose realizar el modelo de fonemas, palabras, y hasta frases enteras.
• En segundo término calcular las probabilidades P (O\ λ), es decir que la secuencia de
observaciones O, haya sido generada por un dado modelo λ.
22
Si el sistema es de reconocimiento continuo o el número de palabras es grande, lo anterior
es imposible, ya sea el hecho de tener modelos de todas las palabras posibles como el de
calcular tal número de probabilidades. Una alternativa a esto es tratar de obtener la
secuencia de estados óptima, hecho que permite el ahorro de tiempo de cálculo.
• Ergódico
El primero (modelo ergódico) se trata del modelo de una matriz de transiciones ergódica
para la cual cada estado puede alcanzarse desde cualquier otro estado en una cantidad finita
de pasos.
Normalmente se incluye otra restricción para que no ocurran grandes saltos durante el
avance de estados, y es la siguiente:
De esta manera no se darán saltos mayores a 2 estados en el sistema. Todo lo descripto para
el modelo de izquierda a derecha, no modifica en nada lo asumido para resolver un modelo
ergódico, ya que todas las restricciones realizadas a cualquier tipo de modelo son
automáticamente respetadas en la reestimación de parámetros. Todo lo dicho hace que éste
modelo sea muy utilizado en reconocimiento de voz de palabras aisladas ya que de esta
forma se puede asociar el tiempo y los estados de manera más clara para poder imaginar el
concepto físico de los estados por los que pasa el modelo, y luego mejorarlo. Una ventaja
de la topología de izquierda a derecha radica en que permite reducir la cantidad de
23
transiciones entre estados, hecho que trae como consecuencia el aumento de información
estadística asociada a los elementos del sistema.
Los HMM deben ser vistos como modelos generativos de las características vocales.
Podemos decir que por cada sonido emitido por una persona, se puede construir un HMM
que sea capaz de generar los mismos sonidos. Si bien este proceso no es sencillo, podemos
describirlo como se indica a continuación:
• una persona emite una palabra, la cual es caracterizada por una señal de voz que puede ser
descompuesta en una secuencia de observaciones características de la señal emitida.
• Por analogía, se puede obtener un modelo oculto de Markov, que genere tras un ciclo
determinado de tiempo, una secuencia de observaciones idéntica a la emitida por el ser
humano.
Ahora bien, esta analogía puede ser generada efectivamente, pero recordando las
definiciones del modelo descritas en las secciones anteriores, se concluye que, para obtener
dicho modelo es necesario caracterizarlo completamente, es decir, se deben obtener:
24
Uno de los métodos más conocidos para realizar esta tarea es la técnica de maximización de
la Estimación, y como una especialización de la misma, el algoritmo de Baum – Welch.
Este último define los parámetros de un HMM como se muestra a continuación:
• Obtención del modelo inicial: se obtiene en forma totalmente aleatoria, sujeto como es
de suponer a las restricciones de probabilidades comunes. Existe la posibilidad de
implementar mejoras que ayuden a obtener parámetros iníciales más exactos. Cabe aclarar
que cuanto más exacto o cercano al máximo global se encuentre el modelo inicial, más
exacto será el modelo final obtenido.
• Reestimación del modelo: se trata de recalcular los parámetros del modelo utilizando las
fórmulas anteriores, basándose para ello en el modelo obtenido en la iteración anterior.
• Modelo óptimo: una vez alcanzada la máxima probabilidad, se está en presencia del
modelo óptimo el cual debe ser guardado para su utilización posterior en lo que se da a
llamar el repositorio de modelos.
Habiendo generado un modelo óptimo para una secuencia de observaciones dada, solo resta
determinar cómo interactuar para obtener un reconocedor de palabras aisladas a partir de lo
expresado [15].
25
7
26
6. DISEÑO E IMPLEMENTACIÓN DEL PROTOTIPO DE RECONOCIMIENTO
DE PALABRAS AISLADAS
7.1 SOFTWARE
El software escogido para la implementación del algoritmo fue MATLAB 7.0.4, que
proporciona características necesarias a los requerimientos del prototipo como: adquisición
de datos, manejo de grandes grupos de datos, interfaces graficas etc. Matlab facilita la
manipulación de grandes grupos de datos (matrices o vectores), característica que para el
desarrollo del prototipo es muy importante, porque en el entrenamiento se realiza el
almacenamiento y procesamiento de un grupo muy grande de pronunciaciones de cada
palabra. Adicionalmente proporciona funciones muy útiles en el cálculo de distancias entre
vectores, herramienta imprescindible en el cálculo de los centroides, etc.
Las funciones pueden ser invocadas desde cualquier programa, con lo cual se disminuye el
número de líneas de código y la dificultad al programar, además posee una herramienta
llamada GUIDE (Graphical user interface develop enviroment) que sirve para implementar
interfaces graficas de usuario. Con esta herramienta se puede crear diferentes elementos
gráficos como: deslizadores, botones, cuadros de datos, pulsadores etc.
27
La implementación del algoritmo se divide en tres tareas específicas, tales como:
entrenamiento del codebook o libro de códigos, entrenamiento del Modelo Oculto de
Markov (HMM) de cada palabra y reconocimiento (Figura 2).
Tarjeta de sonido
Cuantificación
Filtro pasa-bajos
Pre-procesamiento
28
Consiste en captar mediante un micrófono la onda acústica producida por el locutor y
digitalizarla para poderla tratar en un computador (Figura 4). Es importante destacar que
tanto el micrófono usado como el lugar en el que se realiza la grabación pueden afectar las
tasas de reconocimiento. Especialmente si no son los mismos en el proceso de
entrenamiento (etapa de aprendizaje del sistema) y de reconocimiento (etapa de
funcionamiento del sistema).
7.4.2 Muestreo
FENÓMENO
FÍSICO
SISTEMA DE
ADQUISICIÓN
ACONDICIONAMIEN
SENSOR TO DE SEÑAL
HARDWARE
DE COMPUTADOR SOFTWARE
ADQUISICIÓN
ACTUADOR
ANALISIS DE
DATOS
Según el hardware conectado, sea interno o expandido, se tienen dentro del Daq Toolbox
cuatro subsistemas:
29
El subsistema de entrada análoga tiene como función muestrear y cuantificar la señal
análoga empleando uno o más canales, la señal análoga es continua en tiempo y amplitud,
el muestreo toma pequeñas muestras de la señal en tiempos discretos, mientras que la
cuantificación divide los valores de voltaje en amplitudes discretas.
Figura 5. Hardware del sistema de adquisición. Tomado de la sección de ayuda del toolbox
de adquisición de datos de matlab.
30
7.4.3 Cuantificación con el DaqToolbox 2.5 Analog Input
Cuando se realiza la toma, la señal análoga muestreada debe ser convertida a un valor
binario que el computador pueda leer. La conversión de una amplitud infinitamente precisa
a un número binario es llamada cuantificación.
El ancho de banda útil de la voz es de 8KHz, pero la información relevante esta contenida
hasta los 4 kHz aproximadamente. Se utiliza un filtro pasa-bajos con frecuencia de corte en
4khz y ganancia de 0 dB’s, con el fin de eliminar la información en frecuencias superiores
a los 4 khz, con lo cual se ahorra tiempo de procesamiento, y se evita la producción de
aliasing. De esta manera, se impide que las réplicas del espectro de la señal, que se
producen como consecuencia del muestreo, se solapen ocasionando distorsión. El diagrama
de magnitud y fase se puede observar en la figura 6
Figura 6. Diagrama de magnitud (azul) y fase (verde) del Filtro Pasa Bajos.
M
agn
itud
e(dB
)an
dPhaseR
esp
onses
0 0
-80 -2
Phase (radians)
Magnitude (dB)
-160 -4
-240 -6
-320 -8
-400 -10
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
F
req
uency(kH
z)
7.4.5 Pre-procesamiento
* Pre-énfasis
31
Antes de realizar el procesamiento digital de la señal, es necesario realizar un filtrado pasa
alto de pre-énfasis con el objetivo de aumentar la energía relativa de las componentes de
alta frecuencia en el espectro de la voz, y adicionalmente suavizar el espectro. El filtro de
pre-énfasis de primer orden con frecuencia de corte en 2500 Hz y ganancia de 6 dB´s
empleado tiene la forma:
H(z)=1-a(z) (7.1)
y(n)=s(n)-a×s(n-1) (7.2)
Luego de hacer pruebas con la constate del filtro se observo que el mejor funcionamiento se
obtuvo en la mitad del intervalo recomendado es decir (a = 0.95). El filtro de pre-énfasis
también compensa la caída de 6dB que sufre la voz cuando pasa a través del tracto vocal.
90 20
80 18
16
70
14
60
Magnitud (norm)
Magnitud (norm)
12
50
10
40
8
30
6
20
4
10 2
0 0
0 500 1000 1500 2000 2500 3000 3500 4000 0 500 1000 1500 2000 2500 3000 3500 4000
Frecuencia (Hz) Frecuencia (Hz)
(a) b)
* Ventaneo
32
En general, la aplicación de ventanas conduce al alisamiento y, por tanto, distorsión del
espectro original. Para mantener la distorsión espectral dentro de un mínimo, se requiere el
cumplimiento de las siguientes propiedades por parte de las ventanas:
Figura 8. Señal de voz dividida en Tramas de 40ms con traslape de 20ms y multiplicada por
la ventana Hamming.
* Segmentación
33
evita gastar memoria y tiempo de cálculo en las tramas que no contienen información
evitando así obtener resultados erróneos en el análisis de las señales de voz.
El algoritmo utilizado para detectar las regiones de silencio esta basado en el cálculo de las
variaciones de las muestras de la señal en una trama de voz con respecto a su media. Si la
variación es bastante grande, la trama es considerada como una trama de voz, de lo
contrario como de silencio. En la figura 9 se muestra el resultado de este procedimiento
para la palabra adelante.
μ=1Nn=1NSkn (7.4)
Ω=n=1NSkn-μ (7.5)
Donde Sk(n) son las muestras de la señal de la trama k, µ es la media y Ω es el resultado
de la sumatoria la cual es comparada con el umbral.
El umbral se calcula observando los valores obtenidos de Ω para diferentes muestras de voz
(sonora y sorda) y muestras de silencio. En la tabla 1 se muestran los valores típicos
obtenidos de Ω.
Como se observa el valor mínimo de Ω para las muestras de voz es 9.21, mientras que para
las muestras de silencio el máximo es de 6.8 por tanto el umbral que se toma es de 8.00
permitiendo así tolerar algunos niveles de ruido (13).
34
a) (b)
Una vez que la señal ha sido pre-procesada y segmentada en tramas se calculan los 10
primeros coeficientes LPC de cada trama por medio del método de autocorrelación y el
algoritmo Levinson Durbin. Luego calculamos los coeficientes LPC-Cepstrum con la
siguiente recursion en la cual partimos de los 10 coeficientes LPC hallados con la función
de Matlab LPC.
Donde los an son los coeficientes LPC de la trama analizada y los cn son los coeficientes
LPCC necesarios para caracterizar la señal de voz. En el Anexo A se muestra en
“Vocoder” el código de programa de la extracción de parámetros característicos
35
7.4.7 Modulo de Entrenamiento del Codebook
Teorema: Para cualquier sistema de codificación dado que mapee una señal
vectorial dada en N palabras binarias y reconstruya el vector aproximación desde
alguna de estas palabras binarias, existe un cuantificador vectorial con tamaño de
Codebook N que tiene exactamente el mismo rendimiento, esto es, para cualquier
entrada produce la misma salida que el sistema de codificación dado[6].
Para realizar reconocimiento de palabras aisladas se entrenó el Codebook con las palabras
del vocabulario a reconocer. El proceso consiste en promediar vectores de características
semejantes, para formar un Codebook de 6 bits (64 vectores). El vector resultante de cada
uno de los promedios es el centroide (codeword o centro de masas) de la agrupación (o
clúster) de vectores usados para calcularlo, y será el que mejor los represente en su media.
36
vectores de todas las palabras fueron almacenados en una matriz, llamada MAVECT que
constituye el grupo de entrenamiento.
Para medir la distancia entre un par de vectores se utilizo la distancia Euclidea cuadrática,
dada por 7.10.
dV1,V2=A1-A22+B1-B22+…+Z1-Z22
Con:V1=A1,B1,…,Z1V2=A2,B2,...,Z2
(7.10)
Se encontró que esta medida de distancia requiere de cálculos sencillos, lo cual representa
un menor tiempo de procesamiento en comparación con otro tipo de medida de distancia
entre vectores. En la literatura sobre reconocimiento de voz se recomienda Mahalanobis
para la medida de distancias y la evaluación de la distorsión generada. Sin embargo, esta
requiere el cálculo de la inversa de la matriz de covarianza de cada par de vectores lo cual
significa mayor cantidad de operaciones y tiempo de procesamiento.
37
Procedimiento de clasificación: Se realizo la generación del codebook con dos métodos, el
algoritmo de clasificación k-means que, a parte de requerir un método de elección del
codebook inicial también deja muchos clústeres vacios y el algoritmo de clasificación LBG
que no deja clústeres y no requiere un algoritmo de elección del codebook inicial. Este
algoritmo realiza una distribución uniforme de vectores dentro de cada clúster por lo que
fue el algoritmo de clasificación elegido para realizar el entrenamiento del codebook.
38
norma fuera mucho menor que uno. Este fue el que presento mejor desempeño dentro de
todas las pruebas realizadas. En el Anexo A se muestra en “LBG” el código de programa de
la construcción del codebook
Cuantificación vectorial.
39
7.5.2 Entrenamiento del modelo de cada palabra.
En los modelos anteriores se consiguió el mejor desempeño del modelo con una
cuantificación a 64 centroides y 200 secuencias de observación en el entrenamiento de los
diferentes modelos, excepto para el Modelo basura donde se emplearon 300 secuencias de
observación en el entrenamiento del modelo.
Los archivos .mat pueden consultarse en la carpeta archivos.mat del anexo digital.
40
Para dar solución al problema del aprendizaje o entrenamiento se buscó maximizar la
probabilidad que una secuencia de observaciones haya sido generada por un HMM
optimizando sus parámetros. Esto significa que para entrenar los modelos se necesito algún
tipo de estimación inicial de los parámetros.
Se realizó una estimación de los parámetros iníciales distinta para cada uno de los HMM.
Esto dependiendo de la cantidad de estados, de la duración de la palabra y de cómo fue
reentrenado el modelo al comprobar su funcionamiento con el reconocedor. Los parámetros
A y B son probabilidades almacenadas en forma de matrices, Las primeras estimaciones se
hicieron con matrices equiprobables y aparecieron probabilidades muy pequeñas,
posteriormente se emplearon matrices con valores arbitrarios que se fueron refinando a
medida que se volvían a entrenar los modelos.
Estas expectativas fueron calculadas a partir de las definiciones de la variable en avance (α)
y la variable en retroceso (β).
41
Inicialización: βTi=1, 1≤i≤N (7.16)
Las ecuaciones (7.11) y (7.12) en términos de Alfa y Beta para múltiples observaciones se
convierten en:
aij=k=1K1Pkt=1Tk-1αtkiaijbjOt+1kβt+1kjk=1K1Pkt=1Tk-1αtkiβtki
(7.18)
bjl=k=1K1Pkt=1siempre queOt=VkTk-1αtkiβtkik=1K1Pkt=1Tk-1αtkiβtki
(7.19)
Calculo de probabilidad
42
Salida de datos por el puerto paralelo
Teniendo en cuenta que el algoritmo de reconocimiento no solo tiene que ser capaz de
reconocer palabras aisladas sino también de rechazar palabras pronunciadas en una
conversación cotidiana, se entreno el modelo llamado modelo basura, modelo HMM de
seis estados y matriz aij mostrada a continuación:
aij=0.70.20.10.00.50.30.00.00.60.00.00.00.20.00.00.10.30.00.00.00.00.00.00.
00.00.00.00.40.30.30.00.50.50.00.01
Este modelo garantiza que ninguna palabra ajena al vocabulario de comando de la silla de
ruedas vaya a generar un movimiento indeseado, estas palabras pronunciadas en una
conversación cotidiana son reconocidas como modelo basura sin generar ninguna orden en
el puerto paralelo.
Para evitar movimientos indeseados se entreno el modelo para la palabra Markov, una
palabra que no es usada frecuentemente. Al pronunciar Markov no se activa el
reconocimiento sino la salida de datos por puerto paralelo, mientras la palabra markov no
es pronunciada el sistema reconoce todas las palabras normalmente pero no envía ningún
comando de acción para el sistema móvil. Si el usuario en una conversación cotidiana
pronuncia la palabra adelante sin desear movimiento alguno la silla no se mueve porque
requiere del comando de activación del movimiento en este caso la palabra Markov.
Adelante → 0001
Reversa → 0010
Izquierda → 0100
Derecha → 1000
43
Frenar → 0000
En esta sección se muestra como se calcula la probabilidad de que la secuencia haya sido
generada por alguno de los modelos de las palabras entrenados. Esta probabilidad se calcula
con el procedimiento forward [17] que se muestra a continuación:
Y como se observa en la ecuación 7.23, P(O∕λ) es justamente la suma de todos los ∝Ti's.
En la anterior recursión tenemos que aij es la matriz de probabilidad de transición entre
estados entrenada para cada palabra, πi es el vector de distribución de estado inicial el cual
se define así πi=[1,0,0,…..N], para asegurar que siempre empieza la secuencia en el
estado uno, condición importante en el reconocimiento de voz y bjOt matriz de
probabilidad de emisión de cada símbolo de la secuencia en un estado determinado. Para
determinar los elementos de esta matriz es necesario tener una secuencia de observaciones
de entrada compuesta por los centroides representativos de los vectores de cada
observación y bjk matriz de probabilidad de emisión de cada símbolo en un estado
cualquiera, entrenada para cada palabra. La matriz bjOt se obtiene de la siguiente forma:
44
Según la secuencia de observación tenemos que O1=7,O2=4,O3=18 y OT=45, entonces
la matriz de probabilidad de emisión de cada símbolo de la secuencia en un estado
determinado es:
Como se explico no hay un método analítico para determinar los parámetros iníciales del
Modelo Oculto de Markov de cada palabra, por lo tanto se realizaron pruebas variando los
siguientes parámetros:
45
Derecha 41.18 17.65 5.88 5.88
Observando los resultados de la tabla 2 y figura 13, se concluye que el error promedio total
mas bajo fue el obtenido con 200 secuencias de observación en el entrenamiento de los
HMM. Con un número elevado de secuencias de observación para el entrenamiento del
modelo de cada palabra se representa una mayor variabilidad, capacitando al modelo a
responder satisfactoriamente a cualquier modificación en el estilo de habla. Sin embargo
con más de 200 secuencias de observación no se obtiene una reducción del error promedio
considerable y se aumenta el tiempo de entrenamiento.
Prueba 2: esta prueba se realizo cambiando el número de estados de los HMM de cada
palabra en su entrenamiento, con matrices aij y bjk aleatorias, 200 secuencias de
observación y un codebook de 64 centroides generado con la base de datos
Vectos600h.mat.
Palabra Error (%) Error (%) Error (%) Error (%) Error (%) Error (%)
46
Como se puede observar en la tabla 3 y figura 14, los mejores resultados en cuanto a
disminución total del error se obtuvieron entrenando los HMM de cada palabra con 6
estados. Sin embargo se realizo una prueba escogiendo el modelo entrenado para cada
palabra con la cantidad de estados que menor error promedio obtuvo. Es decir los modelos
de las palabras no tienen el mismo número de estados para su entrenamiento, eso depende
del promedio de error consignado en la tabla 3 para cada modelo. Esta prueba se realizo
con matrices aij y bjk aleatorias, 200 secuencias de observación y un codebook de 64
centroides generado con la base de datos Vectos600h.mat.
Adelante 6 5.88
Reversa 5 0
Izquierda 8 14.79
Derecha 5 2.94
Frenar 6 5.88
Markov 5 8.83
E.P.T 6.37
Figura 15. Comparativo de errores utilizando modelos con numero de estados combinado.
Los promedios de error obtenidos en esta prueba no son los mismos de la prueba anterior
porque al combinar los modelos el cálculo de las probabilidades cambia es decir puede
aumentar o disminuir el error promedio en cada palabra, lo que sucede es que los
porcentajes de error de la tabla 3 se obtuvieron con el mismo numero de estados y al
realizar la prueba con número de estados diferente la interacción entre modelos varia.
Como se observa en la tabla 4 el mejor funcionamiento se obtiene utilizando una
combinación de modelos con distinto número de estados.
Prueba 3: esta prueba se realizo modificando el tamaño del codebook generado con la base
de datos Vectos600h.mat, con matrices aij y bjk aleatorias, 200 secuencias de observación y
una combinación de modelos con distinto numero de estados.
47
Tabla 5. Error en el reconocimiento de palabras aisladas modificando el número de
centroides en la generación del codebook.
Reversa 5.88 0 0
48
Derecha 1.172 2.045
aij=0.300.400.300.000.250.450.000.000.400.000.000.000.300.000.000.400.20
0.000.000.000.000.000.000.000.000.000.000.200.400.400.000.200.800.000.00
1.00
aij=0.650.350.050.000.500.300.000.000.200.000.000.000.700.000.000.000.00
0.000.000.200.100.500.000.501.00
aij=0.650.350.000.500.050.000.300.200.000.000.000.000.700.200.000.600.00
0.000.000.000.000.000.000.000.100.000.200.200.000.000.000.000.000.000.00
0.000.000.000.000.000.000.000.000.000.000.000.000.000.500.400.000.600.10
0.000.250.150.000.000.000.000.500.500.001.00
aij=0.650.350.050.000.500.300.000.000.200.000.000.000.700.000.000.000.00
0.000.000.200.100.500.000.501.00
49
Matriz aij para “frenar”:
aij=0.200.400.200.000.450.250.000.000.300.000.000.000.300.000.000.400.30
0.000.000.000.000.000.000.000.000.000.000.200.400.400.000.500.500.000.00
1.00
aij=0.650.350.050.000.500.300.000.000.200.000.000.000.700.000.000.000.00
0.000.000.200.100.500.000.501.00
Adelante 6 0
Reversa 5 2.94
Izquierda 8 5.88
Derecha 5 5.88
Frenar 6 5.88
Markov 5 2.94
E.P.T 3.92
Se puede observar que la disminución del error total es significativa así que el algoritmo de
reconocimiento de palabras aisladas que se implemento presenta las siguientes
características:
– 10 coeficientes característicos.
– Codebook de 64 centroides.
– Coeficientes LPCC.
– Algoritmo LBG para el entrenamiento del codebook.
– 200 secuencias de observación para el entrenamiento de los HMM de cada palabra.
– Numero de estados combinados para el entrenamiento de los HMM de cada palabra.
– Las matrices aij mostradas en la prueba 4 para el entrenamiento de los HMM de
cada palabra.
50
La eficiencia del algoritmo de palabras aisladas utilizando HMM es de 96.08%. Se obtuvo
una eficiencia muy alta teniendo en cuenta que para el comando de un sistema móvil por
medio de palabras aisladas es necesario que el prototipo cumpla un compromiso entre
velocidad de procesamiento y eficiencia en el reconocimiento.
Los motores son de imán permanente de 24 voltios DC del tipo utilizado en los
limpiavidrios de vehículos grandes. La potencia mecánica de estos motores es de ¼HP. Los
motores están acoplados a las ruedas por medio de cajas reductoras de velocidad que
proporcionan una ventaja mecánica en fuerza suficiente para mover la silla de ruedas y el
usuario. Planos y fotos de la silla de ruedas se muestran en el Anexo D.
Para la inversión de giro de los motores se emplearon dos puentes H implementados con
relés de 24 voltios y 10 amperios, los motores y los relés están alimentados con dos baterías
de 12 voltios de plomo-acido recargables, para recuperar la potencia de las baterías se
construyo un cargador y se acopló a la estructura de la silla. Esquemas de los circuitos ver
Anexos B y C.
La velocidad de los motores no es similar por lo que los movimientos hacia adelante y
hacia atrás no son totalmente rectos, para corregir este problema se ensambló un modulador
de ancho de pulso sobre el motor más rápido. Esquemas de estos circuitos en el Anexo C.
51
posteriormente a los relés de los puente H, que dependiendo de la orden pronunciada se
encargan de alimentar los motores.
Al encender el computador se cargan datos en el puerto paralelo sobre los que no se tiene
control, por lo que fue necesario conectar un interruptor que se encargue de activar y
desactivar la conexión entre el puerto y la tarjeta de acople de tierras. Un dato cargado en el
puerto paralelo no correspondiente a una instrucción propia del comando de la silla de
ruedas puede dañar las baterías y/o los relés. Cuando el prototipo de reconocimiento esta
funcionando se garantiza que ningún dato no valido va a ser cargado en el puerto, sin
embargo esto no ocurre durante el arranque del computador y en los periodos de
hibernación. Esquemas de la interfaz ver Anexo C.
Figura 17. Pantalla de trabajo para el entrenamiento del codebook y el HMM de cada
palabra.
52
53
8
54
CONCLUSIONES
Se escogieron palabras de forma que entre ellas exista una gran diferencia fonética. Esto
hace que discriminar entre una palabra u otra sea más fácil. Así la representación
cuantificada de cada palabra se diferenciara completamente de las otras, logrando que en el
entrenamiento de los HMM de cada palabra se obtengan modelos que representen una
mayor probabilidad de generar una determinada secuencia de observación.
55
iteración en el algoritmo de avance y retroceso. El modelo en proceso de entrenamiento se
va acercando al modelo definitivo a medida que se re estiman parámetros con cada nueva
repetición de la palabra, a diferencia del entrenamiento con una sola pronunciación en el
cual el modelo definitivo se logra cuando convergen los parámetros re estimados en
muchas iteraciones del algoritmo. Inicialmente se probo con un número pequeño de
observaciones que se incrementaron para aumentar el numero de veces que se hacia el
proceso de re estimación y así encontrar los parámetros del modelo. El modelo definitivo se
alcanza después de probar el reconocedor en funcionamiento, si el error de reconocimiento
se acerca a cero no se incrementa el número de observaciones y se archivan los parámetros.
Se empleó 200 repeticiones y la optimización mostrada en la sección 7.6.2.
56
RECOMENDACIONES
Utilizar otro método de reconocimiento diferente al utilizado en este trabajo como los
modelos ocultos de Markov continuos, alineamiento temporal dinámico o un hibrido entre
modelos ocultos de Markov y redes neuronales.
57
LOGROS
58
BIBLIOGRAFIA
[1] ALCUBIERRE J.M., Minguez J., Montesano L., Montano L., Saz 2º., Lleida 2E.
Silla de Ruedas Inteligente Controlada por Voz. Trabajo conjunto entre el Instituto de
Investigación en Ingeniería de Aragón, Departamento de Informática e Ingeniería de
Sistemas, Departamento de Ingeniería Electrónica y Comunicaciones de la Universidad de
Zaragoza, España. Año 2005.
[4] BURTON David K., Text-Dependent Speaker Verification Using Vector Quantization
Source Coding, IEEE Transactions on Speech and Audio Processing, Vol 35, No 2,
Febrero, 1987.
[5] CABAS Vanegas Edgar de Jesús, Barrera Alarcón Yecid Fernando. Diseño e
Implementación de un Prototipo que realice la Verificación Automática de Personas por su
Voz. Tesis de grado, autores:. Grupo de Procesamiento Digital de Señales DSP, Ingeniería
Electrónica, Universidad Pedagógica y Tecnológica de Colombia, Seccional Sogamoso.
Año, 2004.
[7] DELLER John R., Proakis G., Hansen H.L., Discrete- time processing of speech
signals, Prentice-Hall, 1987.
59
[8] Departamento de Ingeniería Electrónica y Comunicaciones Centro Politécnico
Superior Universidad de Zaragoza, Tecnologías de la voz, Practica IV, Análisis y
Síntesis LPC de la señal de voz. Disponible en: www.physionet.eps.unizar.es/ Eduardo/
docencia/tvoz/practicas/pract4pdf. Consultado: Agosto 2006.
[9] FAUNDEZ Zanuy Marcos, Tratamiento digital de voz e imagen, Marcombo Editores,
2001.
[10] GOLD Ben., Morgan Nelson., SPEECH AND AUDIO SIGNAL PROCESSING,
Processing and Perception of Speech and Music, John Wiley & Sons, Inc.
[16]. MENDEZ Ortiz Freddy, Vecino Pico Hugo. Propuesta, validación y prueba de una
arquitectura para modelado de portales WEB semánticos basados en interacción por voz.
Grupo de tecnologías de información Línea de Ingeniería de software y sistemas de
información, Universidad Autónoma de Bucaramanga. Año 2006.
60
[17]. OWENS F.J., Signal Processing of Speech, McGraw Hill, Inc. 1993
[18]. RABINER L.R., “A Tutorial on Hidden Markov Models and Selected Applications in
Speech Recognition,” Proceedings of the IEEE, vol. 77, no. 2, Febrero, 1989.
[20]. SMITH Sreven W., “The Scientist and Engineer’s Guide to Digital Signal
Processing”. 2da edición, San Diego CA. California Technical Publishing,1999.
61
62
ANEXO A
sd=1;
mavect=0;
ai = analoginput(‘winsound’);
addchannel(ai,1);
Fm=8000;
set(ai,’SampleRate’,Fm);
set(ai,’SamplesPerTrigger’,16000);
for f=1:600;
input(‘Enter...’);
start(ai);
ua = getdata(ai);
m=size(ua);
%pre-procesamiento
numd=0;demd=0;
[numd,demd] = butter(6,0.975,’low’);
x1=filter(numd,demd,ua);
t=1:1:m(1);
y= t*0;
l=size(t);y(1)=0;y(2)=0;
Spve = 0.04;
NumM=fix(Fm*Spve);
NumV=fix(length(y)/NumM);
p=0;
s=0;
n1=1; n5=1;
n3=1;
63
n7=1;
prom=0;
var=0;
j=0;
vart=0;
v=8;
frame=0;
n=320;
n2=n; n4=n; n6=n;n8=n;
zeros=size(y);
sono=0;s=0;
while n2<=maximo(2)
frame=y(1,n1:n2);
prom=sum(frame)/size(frame,2);
var1=abs(prom-frame);
var=sum(var1);
if var>v
p(n3:n4,1)=frame;
n3=n3+n; n4=n4+n;
if var>15
sono(n7:n8,1)=frame;
n7=n7+n; n8=n8+n;
end
else
s(n5:n6,1)=frame ;
n5=n5+n; n6=n6+n;
end
n1=n1+n;
n2=n2+n;
end
voz=p;
silent=s;
xw=0;
NumV=fix(length(p)/NumM);
Tran=fix(NumM/2);
Avance = NumM-Tran;
inicio = 0; k=1;
for l=1:1;2*NumV-1);
for n=1:NumM;
xw(k)=p(n+inicio)*(0.54 – 0.46*cos(6.2832*n/(NumM-1)));
k = k + 1;
n+inicio;
end
inicio = inicio + Avance;
end
%extracción de caracterirsticas
NumV=fix(length(xw)/NumM);
num_ven=NumV;
64
tam_ven=320;
gra=9;
n=320;
n1=1;
n2=n;
E=0;
Am=0;
for i=1:NumV;
frame=xw(n1:n2);
% extraccion de caracteristicas
[Am(i,1:10),E(i)]=lpc(frame,gra);
n1=n1+n;
n2=n2+n;
end
c=0;
for j=1:NumV;
c(j,1)=fix(log(E(j)^2));
c(j,2)=-Am(j,1);
for i=2:10;
i1=i+1;
ut=0;
u=0;
for k=1:i-1;
u=k*c(j,k)*Am(j,i-k);
ut=u+ut;
end
c(j,i1)=fix(-Am(j,i)-ut/i);
end
end
fh=size I;
fg(f)=fh(1);
mavect(sd:sd+fh-1,1:10)=c(1:fh,1:10);
sd=sd+fh;
end
mav1=’vectos600h’;
save(mav1,’mavect’);
LBG: Código de programa que realiza el entrenamiento del codebook a partir de los
coeficientes de cada palabra almacenados en el programa Vozilla.
load vectos600h
p=size(mavect);
65
centroide(1,1:10)=mean(mavect);
dc=normrnd(mean(mavect),std(mavect));
ds=max(abs(dc));
aleatorio(1,1:10)=dc/(4*ds);
n=1
for n=1:6
for h=1:2:2^n
ce1(h,1:10)=centroide((h+1)/2 ,1:10)-aleatorio((h+1)/2 ,1:10);
ce1(h+1,1:10)=centroide((h+1)/2 ,1:10)+aleatorio((h+1)/2 ,1:10);
end
for j=1:2^n
for i=1:p(1)
dist(j,i)=sqrt( sum( (ce1(j,1:10)-mavect(I,1:10)).^2) );
end
end
[a,b]=min(dist);
for m=1:2^n
ainc=0;
clos=0;
for k=1:p
if b(k)==m
ainc=ainc+1;
clos(ainc,1:10)=mavect(k,1:10);
end
end
centroide(m,1:10)=mean(clos);
aleat(m,1:10)=normrnd(mean(clos),std(clos));
aleatorio(m,1:10)=aleat(m,1:10)/(4*max(abs(aleat(m,1:10))));
tamc(m)=ainc;
end
end
cent00=centroide;
mav1=’centroides600h’;
save(mav1,’cent00’);
Leer: Código de programa que obtiene las muestras de cada palabra para el entrenamiento
de los modelos.
obs=zeros(200,100);
66
for z=1:200
be=0;
palabra=0;
vocoder
codew
tt(z)=size(be,2);
obs(z,1:tt(z))=be(1:tt(z));
end
maf1=’observaha1’;
maf2=’longituha1’;
save(maf2,’tt’);
save(maf1,’obs’);
openDAQ=daqfind;
for i=1:length(openDAQ)
stop(openDAQ(i));
end
sd=1;
mavect=0;
ai = analoginput(‘winsound’);
addchannel(ai,1);
Fm=8000;
set(ai,’SampleRate’,Fm);
set(ai,’SamplesPerTrigger’,16000);
for f=1:1;
input(‘Enter...’);
start(ai);
ua = getdata(ai);
m=size(ua);
stop(ai);
delete(ai);
numd=0;demd=0;
[numd,demd] = butter(6,0.975,’low’);
x1=filter(numd,demd,ua);
t=1:1:m(1);
y= t*0;
l=size(t);y(1)=0;y(2)=0;
Spve = 0.04;
67
NumM=fix(Fm*Spve);
NumV=fix(length(y)/NumM);
p=0;
s=0;
n1=1; n5=1;
n3=1;
n7=1;
prom=0;
var=0;
j=0;
vart=0;
v=8;
frame=0;
n=320;
n2=n; n4=n; n6=n;n8=n;
zeros=size(y);
sono=0;s=0;
while n2<=maximo(2)
frame=y(1,n1:n2);
prom=sum(frame)/size(frame,2);
var1=abs(prom-frame);
var=sum(var1);
if var>v
p(n3:n4,1)=frame;
n3=n3+n; n4=n4+n;
if var>15
sono(n7:n8,1)=frame;
n7=n7+n; n8=n8+n;
end
else
s(n5:n6,1)=frame ;
n5=n5+n; n6=n6+n;
end
n1=n1+n;
n2=n2+n;
end
voz=p;
silent=s;
xw=0;
NumV=fix(length(p)/NumM);
Tran=fix(NumM/2);
Avance = NumM-Tran;
inicio = 0; k=1;
for l=1:1:2*NumV-1);
for n=1:NumM;
xw(k)=p(n+inicio)*(0.54 – 0.46*cos(6.2832*n/(NumM-1)));
k = k + 1;
n+inicio;
end
inicio = inicio + Avance;
68
end
NumV=fix(length(xw)/NumM);
num_ven=NumV;
tam_ven=320;
gra=9;
n=320;
n1=1;
n2=n;
E=0;
Am=0;
for i=1:NumV;
frame=xw(n1:n2);
[Am(I,1:10),E(i)]=lpc(frame,gra);
n1=n1+n;
n2=n2+n;
end
c=0;
for j=1:NumV;
c(j,1)=fix(log(E(j)^2));
c(j,2)=-Am(j,1);
for i=2:10;
i1=i+1;
ut=0;
u=0;
for k=1:i-1;
u=k*c(j,k)*Am(j,i-k);
ut=u+ut;
end
c(j,i1)=fix(-Am(j,i)-ut/i);
end
end
fh=size I;
fg(f)=fh(1);
if p == 0;
else
palabra(sd:sd+fh-1,1:10)=c(1:fh,1:10);
sd=sd+fh;
end
end
mav1=’adelante’;
ero(mav1,’palabra’);
Codew: función que realiza la cuantificación vectorial de los coeficientes LPCC de una
palabra.
Realizado por:
Diego Fernando Méndez Medina
Helberth Yesid Espitia Flórez
load centroides600h
load adelante
69
p=size(palabra);
a=0;be=0;mtem=0;dis1=0;dist1=0;
if palabra == 0
be=0;
else
for i=1:p
mtem(1,1:10)=palabra(I,1:10);
mtem(2:65,1:10)=cent00(1:64,1:10);
dis1=pdist(mtem);
dist1=dis1(1:64);
[a(i),be(i)]=min(dist1);
end
end
maf1=’tira’;
save(maf1,’be’);
70
ANEXO B
Cargador de baterias
71
ANEXO C
72
Modulador de ancho de pulso
73
ANEXO D
74
75
76
77
78