Académique Documents
Professionnel Documents
Culture Documents
AUTORA:
Johana Elizabeth Briceño Sarmiento
Tesis previa a la obtención del
Título de Ingeniero en
Electrónica y
Telecomunicaciones
DIRECTOR:
Ing. Carlos Carrión
LOJA – ECUADOR
2008
CERTIFICACIÓN
-----------------------------------
Ing. Carlos Carrión B.
DIRECTOR TESIS
F).....................................
Ing. Jorge Luis Jaramillo
F……………………
Johana Elizabeth Briceño Sarmiento
DECLARACIÓN DE AUTORÍA
Autora
F: ……………………………………
Johana Elizabeth Briceño Sarmiento
INTRODUCCIÓN
Objetivo General
Objetivos Específicos
Procesar la señal de voz para obtener un vector de observación formado por las
características principales de la señal.
Diseñar de un sistema de reconocimiento de voz, usando los sistemas FPGA y
recursos disponibles.
Simulación en software del sistema de reconocimiento de voz, utilizando, System
Generator 8.1, ISE 8.1i y MATLAB 7.1.
Desarrollo del algoritmo de backpropagation en System Generator, para la etapa
de entrenamiento de dos palabras especificas.
DEDICATORIA
A mis padres:
A mis hermanas:
A mis padres por su amor, apoyo, confianza, esfuerzo, por enseñarme con su
ejemplo los más grandes valores y luchar por mis ideales; a mis hermanas por su
compañía y confianza.
Dedicatoria................................................................................................................. VI
2.1 Introducción............................................................................................................. 6
2.2 Elementos de una Neurona Artificial........................................................................ 6
2.3 Funciones de Transferencia .................................................................................... 7
2.3.1 Función Hardlim .................................................................................................. 7
2.3.2 Función Hardlims ................................................................................................. 9
2.3.3 Función Sigmoidal ............................................................................................. 11
2.4 Unidad Neuronal ................................................................................................... 14
2.5 Red Neuronal para el Reconocimiento de dígitos de un Display de Siete
Segmentos .................................................................................................................. 15
5.1 Introducción........................................................................................................... 34
5.2 Obtención y Tratamiento de la Señal de Voz ....................................................... 34
5.2.1 Obtención de la Señal de Voz ............................................................................ 35
5.2.2 Obtención Señal Útil .......................................................................................... 36
5.3 Obtención Parámetros Característicos .................................................................. 37
5.4 RNA Propuesta para el Reconocedor de Patrones de Voz ................................... 39
Referencias ................................................................................................................ 73
Anexos ....................................................................................................................... 74
LISTA DE FIGURAS
Figura 1.1 Representación de Datos Punto Fijo Binaria Complemento a Dos ............... 4
Figura 2.12 Bloque Función Sigmoid por Función Definida a Trozos .......................... 13
Figura 5.30 Interfaz GUI para Extracción de Características LPC y FFT ..................... 38
Figura 6.46 Interfaz Gráfica de Usuario para Ingreso de Datos a la RNA .................... 53
Figura 6.57 Patrones LPC para las Palabras Luces y Aire .......................................... 63
Figura 6.59 Salida Deseada y Disminución del Error para = 0.8, =0.5 ................... 65
Figura 6.60 Salida de las Neuronas de Salida para = 0.8, =0.5 .............................. 65
Figura 6.62 Salida Deseada y disminución del Error para = 1, =0.3 ....................... 67
Figura 6.63 Variación de los pesos Capa Oculta hasta Adaptarse .............................. 67
LISTA DE TABLAS
ASPECTOS GENERALES
1.1 Introducción
En los años 1980s y 1990s, se invirtió mucho esfuerzo tanto industrial como
académico en el diseño e implementación de neuroprocesadores1 en hardware,
pero la mayoría terminaron en fracasos, de hecho, el campo entero estaba
principalmente moribundo a fines de los años noventa.
1
Neuroprocesadores: Dispositivo con capacidad de cálculo paralelo, diseñado para la implementación
de redes artificiales.
Paralelismo de Capa: En una red multicapa, diferentes capas pueden ser
procesadas en paralelo. El paralelismo en este nivel es típicamente bajo, y por
consiguiente el valor limitado, pero esto puede explotarse a través del pipelining2.
2
Pipelining: Es una técnica de implementación en la que se superpone la ejecución de varias
instrucciones y aprovecha el paralelismo entre instrucciones en una corriente secuencial de
instrucciones.
1.4 Aritmética
Hay muchos aspectos del cálculo aritmético que necesitan ser considerados en el
diseño de neuro-elementos; estos aspectos incluyen la representación de datos,
cálculos de productos internos, implementación de funciones de transferencia,
almacenamiento y actualización de pesos, y la naturaleza de algoritmos de
aprendizaje. Las entradas y salidas (In/Out), aunque no son un problema aritmético,
también es importante asegurar que las unidades aritméticas puedan ser
proporcionadas con entradas a la velocidad apropiada. [2]
Una representación de una señal punto fijo binaria complemento a dos es [3]:
Figura. 1.1 Representación de datos punto fijo binaria complemento a dos [3]
Donde:
bi es el dígito binario (bits, ceros o unos).
Longitud de la palabra, en bits es dado por w.
El bit más significativo (MSB) es el de mas a la izquierda. Es representado por bw-
1.
El bit menos significativo (LSB) es el bit de más a la derecha. Representado por b0.
La longitud del fragmento, f es la distancia desde el LBS al punto binario.
Según estudios se tiene establecido 16 bits para pesos y 8 bits para la entrada de la
función de activación, como bastante bueno. [2]
Con este conocimiento, el aspecto crítico está entonces cuando, debido a las
consideraciones de desempeño (performance) o costo, debe de usarse la precisión
mas baja, esto basado en un análisis numérico cuidadoso.
7
Almacenamiento y actualización de pesos, entradas/salidas: Para este propósito,
la memoria RAM distribuida es muy pequeña para sostener la mayoría de los datos
a procesarse, por consiguiente se usa el bloque-RAM. Los valores de entrada son
guardados en un solo bloque y simultáneamente leídos fuera (como la RAM dual-
ported).
Para redes muy pequeñas, es más práctico usar RAM-Distribuidas, sobre todo para
almacenar los pesos. Para redes grandes, el bloque RAM no puede ser suficiente, y
los datos tienen que ser cargados periódicamente dentro y recuperados del
dispositivo FPGA.
Capitulo II
2.1 Introducción
Antes de desarrollar una Red Neuronal Artificial para una aplicación específica,
como en el caso de esta tesis, se desarrolla detalladamente la implementación de
todos los elementos que son parte de la RNA como es la unidad básica, que es
una neurona tipo perceptron, y las funciones de transferencia más importantes por
ser las más utilizadas, como lo son la hardlim3, hardlims4 y sigmoid5.
Para cada elemento es necesario, una vez desarrollado, comparar los resultados
obtenidos, para determinar su eficacia así como también es necesario determinar
los recursos que utilizarán en hardware para su implementación.
Una red neuronal se encuentra formada por varias unidades neuronales, celdas,
unidades de procesamiento o neuronas que se interconectan entre si formando una
red. Esta unidad de procesamiento esta formada por:
Figura.2.2 Neurona
- Las entradas Xi, que son los datos o señales que ingresan a la neurona.
3
Hardlim: Función de transferencia lineal que limita la salida entre 0 y 1.
4
Hardlims: Función de transferencia lineal que limita la salida entre -1 y 1.
5
Sigmoid: función de transferencia no lineal que limita la salida entre 0 y 1.
- Bias b, Entrada de tendencia definida como un número que indica a partir de
que valor del potencial la neurona produce una salida significativa. [7]
- Los pesos Wi, que son la intensidad de la sinapsis que conecta la entrada
con la neurona o entre dos neuronas.
Estos valores se multiplican con su respectiva entrada y si el peso es
positivo la conexión se le llama exitatoria y si es negativo se le llama
inhibidora [8]. Estos valores resultantes de las multiplicaciones son sumados
formando una señal resultante n.
N
n = ∑ Wi X i (2.1)
i =1
y = f i (n i ) (2.2a)
n
y = f (∑ Wi X i + b) (2.2b)
i =1
1 si n ≥ 0
a=
0 si n < 0
Donde:
sums; valor de entrada, es la suma total de las entradas a la neurona por su
respectiva matriz de pesos.
bias; valor de entrada, ganancia b de la neurona, que se suma al valor de
las entradas multiplicadas por los pesos, formando la salida n.
n = w1,1 p1 + w1, 2 p 2 + ... + w1, R p R + b (2.4)
Ahora la elección entre las dos formas de implementar la función hardlim depende
mucho de la cantidad de recursos que estos requieren para su implementación en
hardware ya que los resultados obtenidos en ambas formas son correctos según la
ecuación 2.3. Para esto se utiliza la herramienta Resourse Estimator, que estima
rápidamente los recursos requeridos por la FPGA para implementar el modelo. Los
resultados se encuentran en el capitulo VI.
1 si n ≥ 0
a=
− 1 si n < 0
Esta función toma los valores de entrada, los cuales pueden oscilar entre más y
menos infinito, y restringe la salida a valores entre cero y uno [9], figura 2.9, según
la expresión:
1
a=
1 + e −n
Bloques ROM: Las ventajas de utilizar los bloques de memoria ROM es que, se
evita el desperdicio de localidades porque éstas dependen del número de bits de la
entrada y este valor funciona como un apuntador a la localidad de memoria donde
se encuentre el valor almacenado. Entre las desventajas se tiene, que apunta a
valores discretos y entre sus intervalos existe un margen de error, y como la
memoria ROM acepta a su entrada solo valores sin signo y punto binario igual a
cero, no se puede obtener representaciones de la función para valores negativos y
como las localidades de memoria dependen del número de bits de entrada, para
datos de entrada que se requiere, por ejemplo, 16 bits de resolución se necesitaría
128 Kbytes de memoria lo que requiere mayores recursos de hardware. El número
de bytes se lo obtiene con la expresión (n/8)2n, donde n es el número de bits de
entrada [2].
Figura. 2.10 Función Sigmoidal_ROM en System Generator
6
Autor
0 si x < −2
0.1572 si − 2 ≤ x < −1
0.3340 si − 1 ≤ x < 0
1 / 2 si x = 0
f ( x) = 0.5734 si 0 < x ≤ 0.8 (2.8)
0.7356 si 0.8 < x < 1.5
0.8779 si 1.5 ≤ x ≤ 2.5
0.9509 si 2.5 < x ≤ 3.5
1 si 3.5 < x
La RNA a utilizarse consta de 7 entradas, que son los 7 segmentos de display, tiene
una capa y consta de 4 neuronas tipo perceptron para obtener las 4 salidas
necesarias de la red que muestran el dígito resultante en código BCD y podrá ser
visualizado por medio de 4 leds. Además de poder observar el resultado en código
BCD se utiliza un decodificador de BCD a 7 segmentos para también poder
visualizar el resultado de la red en uno de los display de la tarjeta. El tipo de función
de transferencia utilizado es la función hardlim puesto que las salidas deseadas
pueden ser cero o pueden ser uno.
e=t− y (2.9)
Por lo tanto:
Así mismo se procede a encontrar los nuevos valores de los bias (b) o ganancias.
0 1 0 0 1 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 0 1 0 0 0 0 0 0 0
X = 0 1 0 0 1 0 0 1 0 0 ; Matriz de Entrada
0 1 0 1 1 1 0 1 0 1
0 1 1 1 0 0 0 1 0 0
1 1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 1
0 0 0 0 1 1 1 1 0 0
t= ; Matriz salidas deseadas
0 0 1 1 0 0 1 1 0 0
0 1 0 1 0 1 0 1 0 1
Utilizando las ecuaciones (2.2), (2.9), (2.10) y (2.11) se ejecuta el entrenamiento de
la red para encontrar la matriz de pesos y bias adecuados para que la RNA
reconozca los dígitos deseados.
- 1 - 2 -1 -1 0 - 2 - 2
- 2 4 0 7 0 - 2 3
W = ; Matriz de Pesos
- 1 1 1 0 -1 2 0
- 1 1 -1 0 2 1 0
1
- 2
b = ; Matriz de bias
- 1
- 2
Como se dijo además de la RNA, el sistema esta formado por otros elementos
como son:
- Un decodificador de BCD a 7 segmentos, para visualizar la salida de la red
en un display, en adición a la visualización del resultado en los 4 leds.
Consta de un bloque M-Code (Ver código en Anexo C) y un bloque de
concatenación de 7 entradas. Ver figura 2.20.
Reconocimiento De La Voz
La voz hablada se ubica entre 100Hz y 160Hz para el hombre y para la mujer entre
200Hz y 320Hz; pero las consonantes introducen armónicos cuyas frecuencias van
hasta 5000Hz.
3.2 Metodología
Los principales problemas del reconocimiento de voz son: el reconocimiento del tipo
de voz y los distintos significados de las palabras. Por lo que en esta investigación,
se procedió a tratar de especificar soluciones usando una red neuronal artificial
perceptron multicapa con propagación hacia atrás.
Este tipo de redes conocidas también como Backpropagation son las más usadas
para el reconocimiento de patrones y como la voz tiene patrones, es muy posible
que esta sea uno de los elementos apropiados para encontrar una solución
correcta.
La red tipo perceptrón es una de las redes más sencillas pero de las más utilizadas,
tiene la característica de tener un aprendizaje supervisado, tener funciones de
transferencia tipo hardlim, hardlims, sigmoidal y de tener una topología feedforward
de una o más capas. La función sigmoidal es la función de activación más
penetrante y biológicamente creíble [2], y muy utilizada en el desarrollo de redes
Backpropagation.
Las redes neuronales artificiales son modelos computacionales que son inspirados,
por los principios de cómputo, realizados por las redes neuronales biológicas del
cerebro. Estas redes neuronales poseen características que sobrepasan algunas
limitaciones en los sistemas computacionales clásicos [9].
Como se puede captar las RNA poseen características que hacen de estas la mejor
opción y las aplicaciones que se han podido desarrollar utilizando las RNA son
diversas, pero para nuestro propósito son ideales para el reconocimiento de
patrones, como lo son la de la voz.
Capitulo IV
4.1 Metodología
4.2.1 Adquisición
L = ( Fm * Tm ) (4.13)
4.2.2 Tratamiento
∧
f ( n ) = f ( n ) − a * f ( n − 1) ; Donde a=0,95 (4.15)
Extracción señal útil: La señal útil se obtiene utilizando dos métodos, por
detección de extremos y por comparación de la amplitud de inicio y final de la
señal dado un valor de umbral.
4.3 Extracción de características de la Señal de Voz
En esta etapa se tiene como entradas las señales de voz tratadas, es decir, señales
estables y suaves. A estas señales se les extrae un conjunto de características o
parámetros, propios de la señal, con lo que se genera matrices de entrada y
también matrices de salidas o targets, las cuales sirven para el posterior
entrenamiento de la red neuronal, minimizando el numero de nodos de entrada de
las red neuronal, lo cual reduce la arquitectura de la red logrando unos tiempos de
entrenamiento menores.
0.54-0.46*cos 2π t
( ) → si -T ≤ t ≤ T
w (t ) = T 2 2 (4.16)
0 → para el resto de la señal
A medida que se van generando los valores de los parámetros por cada frame, de
cada señal analizada, son guardados en una matriz (características), al final de
dicho proceso se tendrá: características(n), donde (n) es el número de
características máximas de un patrón que representa el número de nodos de
entrada de la red. Además se debe generar una matriz (Out) de valores de salida o
targets especificados por el usuario para cada palabra que se quiere que el sistema
reconozca, estos representan el valor de salida en cada nodo de las redes
neuronales, esto que en el entrenamiento se debe presentar un valor de entrada
asociado a un valor de salida deseado.
4.4 Arquitectura y Entrenamiento de la Red Neuronal
4.3.2 Entrenamiento
(V.18)
Donde:
es el peso que interconecta la unidad i de la entrada con la unidad j de la
siguiente capa.
m es el número de unidades de la capa z
z es el número de la capa actual
es la función de transferencia de la capa actual
es la salida de la unidad i de la capa anterior, en caso de ser la primera
capa este seria el patrón de entrada.
(4.19)
Ahora se verifica la salida de la última capa con la salida deseada para verificar el
error en cada unidad.
(4.20)
El error en i-esimo patrón se define como la sumatoria de los errores en cada
unidad de salida [9].
(4.21)
Estos pasos se repiten para cada patrón del conjunto propuesto. Al final se toma el
error cuadrático de entrenamiento, normalizado que es [9].
(4.22)
Como en las capas ocultas no existe una salida deseada que comparar con la
salida de cada unidad se debe traer una parte del error de la capa de salida hacia
las capas ocultas, ahora los términos del error en la capa de salida son [9].
q
ϕ sj = ( d j − y j ) .θ ' s ∑ w zji .viz −1
i =1 (4.23)
Los términos de error para cada unidad en las capas ocultas son.
m
q
ϕ zj = θ ' z ∑ w zji .viz −1 .∑ ϕ sj .w zji
i =1 j =1
(4.24)
(4.25)
Donde la variable α se define como velocidad de aprendizaje, y su valor varia
entre 0 y 1. Ahora para las capas ocultas la actualización será [9].
(4.26)
Si
Si
Si
(4.27)
(4.28)
Figura. 4.28. Espacio de generalización, A) para una velocidad de aprendizaje baja;
B) para una velocidad de aprendizaje alta, se pueden observar las oscilaciones; C)
para una velocidad de aprendizaje alta pero adicionándole termino de momento [13]
5.1 Introducción
El desarrollo del sistema esta divido en dos partes, es decir, la primera parte que es
la extracción de características, se desarrolló en MATLAB 7.1, debido a que
desarrollarla en Sysgen, implica un mayor tiempo de realización y por otro lado no
es el objeto de estudio de esta tesis, y la segunda parte que es la RNA que sí está
desarrollada con la herramienta de diseño de hardware Sysgen 8.
Una vez que se ha obtenido un vector con los valores de los parámetros
característicos de la señal, este es exportado a workspace de MATLAB, para luego
ser leídos desde la plataforma Sytem Generator, que es la segunda parte del
sistema y en la que se implementa la red neuronal artificial en hardware, utilizando
una FPGA.
Una vez obtenida la grabación de la señal de voz útil, la que será tratada, ésta es
muestreada y a través de un filtro de primer orden, descrito en la ecuación 4.15
indicado en el capitulo 4.2.2, se elimina el nivel de DC suavizando el espectro e
inestabilidades en la manipulación de la señal para luego ser enventanada
utilizando el tipo de ventana hamming, y de cada trama obtenida extraer las
características.
.
.
.
start(AIVoice)
[d1,t1] = getdata(AIVoice);
wavwrite([d1,t1],11025,'grabacion')%Guarda en archivo .wav la señal
Como se indicó se puede escoger entre dos métodos para obtener la señal útil.
El primer método, de umbral, es por medio de definir un nivel bajo que será
comparado con cada muestra de la señal y si supera este umbral se determina el
inicio de la palabra; de igual forma para determinar el final, se define un nivel que al
ser superado indica el final de la palabra. Este valor se determina de forma práctica.
Preénfasis:
Para el inicio:
for i=500:1:Lo
if abs(X(i))> 0.0003
inicio=i;
break;
end
end
Para el final:
Result=[];
j=1;
for i=inicio:1:final
Result(j)=X(i);
j=j+1;
end
En el segundo método, cruces por cero, determina un número de cruces por cero
mínimos, una amplitud mínima de comienzo de la señal y una amplitud mínima de
final de la señal. Teniendo estos valores así:
Aquí se utiliza un filtro de orden bajo, donde sutil es la señal de voz obtenida de la
grabación.
Para extraer los parámetros característicos se puede escoger entre LCP (Linear
Predicting Code) y FFT (Fast Fourier Transform), como se puede observar en la
figura 5.30.
Figura. 5.30 Interfaz GUI para Extracción de Características LPC y FFT
Obtenida la señal de salida de toda la red, este valor es comparado con la señal de
salida deseada utilizando la ecuación 4.20, teniéndose este valor de error se
procede a encontrar el error de cada unidad en la capa de salida con la ecuación
4.23 y este error es llevado a cada unidad de la capa oculta para encontrar el error
esta capa según la ecuación 4.24. Una vez que se tiene los errores en cada capa
se procede actualizar los pesos de cada capa utilizando las formulas 4.25-4.28.
Figura 5.33.
Figura. 5.33 Actualización Pesos Capa de Salida y Obtención de Fracción
de Error a Propagarse en la Capa Oculta.
Función de
Transferencia Slices LUTs IOBs
Hardlim1 1 1 5
Hardlim2 5 8 5
Obtenidos los resultados de la función Sigmoid, a través del bloque ROM, y a través
del bloque logsig de Simulink (figura 6.39), que representa la ecuación (2.7), se
puede observar de los resultados que existe un margen de error en determinados
puntos (Fig. 6.40) y además no se puede representar valores negativos como ya se
dijo anteriormente.
1,2
0,8
logsig
0,6
Sig_ROM
0,4
0,2
0
-6 -4 -2 0 2 4 6 8
De los resultados, se tiene, que los datos de salida tienen cierto margen de error
con los valores de salida deseados ya que los resultados son una aproximación. El
número de bits de entrada también afecta, aumentando los recursos de hardware;
pero se tiene resultados aproximados para valores negativos de entrada lo que no
se obtiene por medio del bloque ROM.
Figura. 6.42 Bloque F_sig, por función definida a trozos
Valore s de e ntrada X
Obtenidos los resultados de los dos bloques realizados para la función sigmoid es
importante comparar los resultados y la cantidad de recursos que se necesitan para
implementarlos en hardware (figura 6.45), ya que la exactitud, el funcionamiento y
el coste son muy importantes. De éste análisis se puede elegir entre los dos
bloques dependiendo del tipo de requerimientos que se deseé tener al momento de
diseñar una RNA.
Sig_ROM & F_Sig & Logsig
1,2
0,8
Salida Sigmoid
0,6 Sig_ROM
F_Sig
0,4 Logsig
0,2
0
-6 -4 -2 0 2 4 6 8
-0,2
Valores de entrada X
∑ (H
2
1
(i ) − µ C )( H D (i ) − µ D )
2
N
i =1
C
R =
σ C ×σ D
(6.29)
Donde:
HC son los datos que se desea obtener
HD son los datos calculados
σC es la desviación estándar de los valores observados en campo
σD es la desviación estándar de los valores extraídos de la función definida a trozos
µC es la media de los valores deseados de la función
µD la media de de los valores extraídos de la función definida a trozos
N es número total de observaciones (entradas a la función).
Para calcular este valor, para las dos funciones se tiene primeramente las
desviaciones estándar y la media de cada función.
7
Un valor de R² igual a 1 nos indica una tendencia lineal perfecta entre los datos. Es adimensional.
Para la función Sigmoid ROM:
σC= 0.354099464
σD= 0.214760108
µC= 0.618639129
µD= 0.73236129
∑ (H
2
1
(i ) − µC )( H D (i) − µ D )
2 N
i =1
C
R = = 0.82
σ C ×σ D
∑ (H
2
1
(i ) − µC )( H D (i) − µ D )
2 N
i =1
C
R = = 0.93
σ C ×σ D
Por otro lado se encuentra el error cuadrático medio (RMSE8), que permite
comparar el ajuste entre los datos deseados (función sigmoid de simulink) y los
extraídos (funciones Sigmoid_ROM y F_Sig) [16].
8
Valores de RMSE iguales a 0 son óptimos ya que los errores no existirían y la relación sería perfecta,
pueden darse cualquier valor positivo
N
∑ (H
i =1
C (i ) − H D (i)) 2
RMSE =
N (6.30)
∑ (H
i =1
C (i ) − H D (i )) 2
RMSE = = 0.20
N
∑ (H
i =1
C (i ) − H D (i )) 2
RMSE = = 0.04
N
6.3.1 Simulación
Para la simulación se desarrolló una interfaz GUI (Interfaz Gráfica de Usuario) para
escoger el número de entrada a la RNA, teniendo dos opciones para hacerlo, ya
sea haciendo clic en el botón del dígito que se deseé que la RNA reconozca o
ingresando en cada editor de texto, los siete valores binarios que conforman el
display como se observa en la interfaz GUI de la figura 6.46.
Una vez ingresado el digito que se desea que la RNA reconozca, por medio del
botón Ir a Red, se abre inmediatamente el diseño de la red en Sysgen para iniciar la
simulación, figura 6.47. De la simulación se tiene la siguiente la tabla de resultados
Tabla 6.6 para los dígitos ingresados correctamente y para los que están
parcialmente incompletos. Como referencia se presenta la tabla 6.5 donde se
observa la representación de los dígitos en siete segmentos y código BCD. El
resultado de la simulación es obtenido en 2 segundos, pero este tiempo es
superado en la implementación como se comprueba más adelante.
Figura. 6.47 Simulación del sistema de reconocimiento.
Una vez definidos los parámetros del bloque System Generator generamos la
compilación del modelo realizado. Al cabo de unos minutos, se ha generado el
bloque de co-simulación, el cual lo conectamos a las respectivas entradas y salidas
para luego simular el modelo. Al simular el modelo ya con el bloque co-simulator, la
tarjeta debe estar debidamente conectada al PC y encendida, para que, al realizar
la simulación el modelo se compile dentro de la FPGA Spartan III y comprobar que
el funcionamiento en la FPGA sea el mismo que en la simulación de Sysgen. Figura
6.48.
Figura. 6.48 Co-Simulación del Sistema Reconocedor de Dígitos
El vector de entrada, que ingresa a la Red Neuronal, esta conformado por algunos
valores llamados parámetros característicos, que pueden ser del tipo LPC o FFT.
En la etapa de entrenamiento, se determina con que tipo de parámetro se obtiene
mejores resultados basándonos en obtener el menor tiempo de aprendizaje para
llegar al un valor mínimo de error deseado.
Lo que se desea es que la red sea entrenada para reconocer dos palabras
específicas, siendo estas: Luces y Abrir. Para éstas dos palabras se tomaron varios
patrones. Podemos observar en las figuras 6.53 a la 6.56, los parámetros
característicos obtenidos en el sistema, para 4 patrones, utilizando los dos
métodos que determinan la señal útil, así como la utilización de los dos métodos de
obtención de parámetros característicos. Donde corte1 es utilizando el método de
umbral, y corte2 utilizando el método de cruces por cero, para obtener la señal útil.
Figura. 6.53 Patrones Característicos FFT para la palabra Luces
Figura. 6.54 Patrones Característicos FFT para la palabra Aire
Figura. 6.55 Patrones Característicos LPC para la palabra Luces
Figura. 6.56 Patrones Característicos LPC para la palabra Aire
Si comparamos las gráficas de las dos palabras a reconocer, se puede observar a
simple inspección, la complejidad de reconocimiento que debe tener la red neuronal
para poder clasificar los parámetros característicos. Al usar parámetros LPC se
tiene mayor complejidad de separación lo que significa mayor complejidad de
reconocimiento de la red, mientras que con los parámetros FFT se tiene un mapa
menos complejo de separación entre regiones, que al momento del entrenamiento
se traduce en menos épocas de entrenamiento alcanzando la salida deseada con
un error muy reducido. Figuras 6.57 – 6.58.
Figura. 6.63 Variación de los algunos pesos de capa oculta hasta adaptarse.
El siguiente paso es comprobar si para los patrones de entrada, obtenidos
mediante la extracción de características, la red logra adaptar sus pesos para
que encuentre la salida deseada según el patrón ingresado. Si no se logra por
medio de la red propuesta se debe crear una nueva que implicaría en ir
aumentando el número de neuronas ocultas de la red. A medida que se va
aumentando el número de neuronas de la capa oculta, se encuentra con el
problema de las numerosas conexiones entre neuronas y el consumo de más
recursos hardware que son limitados.
Capitulo VII
CONCLUSIONES Y RECOMENDACIONES
7.1 Conclusiones
7.2 Recomendaciones
[6] http://es.wikipedia.org/wiki/ASIC
[8] Bonifacio Martín del Brío, Alfredo Sanz Molina. “Redes Neuronales y Sistemas
Difusos”, RA-MA, 2002
[11] Martin Pearson, Ian Gilhespy, Kevin Gurney, Chris Melhuish, Benjamin
Mitchinson, Mokhtar Nibouche, Anthony Pipe, A Real-Time FPGA based Biologically
Plausible Neural Network Processor, University of the West of England.
[14] http://weblidi.info.unlp.edu.ar/catedras/neuronales/04_Backprop.ppt.
if X == 256
f = xfix({xlSigned, 8, 6},1);
elseif X == 128
f = xfix({xlSigned, 8, 6},0.9509);
elseif X== 64
f = xfix({xlSigned, 8, 6},0.8779);
elseif X == 32
f = xfix({xlSigned, 8, 6},0.7356);
elseif X == 16
f = xfix({xlSigned, 8, 6},0.5756);
elseif X == 8
f = xfix({xlSigned, 8, 6},0.5);
elseif X == 4
f = xfix({xlSigned, 8, 6},0.334);
elseif X == 2
f = xfix({xlSigned, 8, 6},0.1572);
else
f = xfix({xlSigned, 8, 6},0);
end
ANEXO B. FUNCIONES DE TRANSFERENCIA
ANEXO C. DECODIFICADOR A 7 SEGMENTOS
elseif A == 1
d0 = 1;
d1 = 0;
d2 = 0;
d3 = 1;
d4 = 1;
d5 = 1;
d6 = 1;
elseif A== 2
d0 = 0;
d1 = 0;
d2 = 1;
d3 = 0;
d4 = 0;
d5 = 1;
d6 = 0;
elseif A == 3
d0 = 0;
d1 = 0;
d2 = 0;
d3 = 0;
d4 = 1;
d5 = 1;
d6 = 0;
elseif A == 4
d0 = 1;
d1 = 0;
d2 = 0;
d3 = 1;
d4 = 1;
d5 = 0;
d6 = 0;
elseif A == 5
d0 = 0;
d1 = 1;
d2 = 0;
d3 = 0;
d4 = 1;
d5 = 0;
d6 = 0;
elseif A == 6
d0 = 0;
d1 = 1;
d2 = 0;
d3 = 0;
d4 = 0;
d5 = 0;
d6 = 0;
elseif A == 7
d0 = 0;
d1 = 0;
d2 = 0;
d3 = 1;
d4 = 1;
d5 = 1;
d6 = 0;
elseif A == 8
d0 = 0;
d1 = 0;
d2 = 0;
d3 = 0;
d4 = 0;
d5 = 0;
d6 = 0;
elseif A == 9
d0 = 0;
d1 = 0;
d2 = 0;
d3 = 0;
d4 = 1;
d5 = 0;
d6 = 0;
else
d0 = 0;
d1 = 0;
d2 = 0;
d3 = 0;
d4 = 0;
d5 = 0;
d6 = 0;
end
ANEXO D. CÓDIGO PARA GRABAR LA VOZ POR MICRÓFONO
axes(handles.fig)
plot(0)
AIVoice = analoginput('winsound');%ingreso voz por micrófono
chan = addchannel(AIVoice,1);
duration = 0.5; %tiempo de duración de la grabación
set(AIVoice,'SampleRate',11025) %tasa de muestreo
ActualRate = get(AIVoice,'SampleRate');
set(AIVoice,'Timeout',5)
set(AIVoice,'SamplesPerTrigger',ActualRate*duration)
set(AIVoice,'TriggerChannel',chan)
set(AIVoice,'TriggerType','Software')
set(AIVoice,'TriggerCondition','Rising')
set(AIVoice,'TriggerConditionValue',0.2)
set(AIVoice,'TriggerRepeat',1)
start(AIVoice)
[d1,t1] = getdata(AIVoice);
wavwrite([d1,t1],11025,'grabacion') %Guarda en archivo .wav la señal
axes(handles.fig)
plot(t1,d1), grid on, hold on %Gráfica la señal de voz ingresada
axis([t1(1)-0.05 t1(end)+0.05 -0.8 0.8])
xlabel('Time
(sec.)','Fontname','Arial','Fontsize',10,'Fontangle','Italic','Fontw
eight','Bold','color',[1 1 1])
title('Señal de
Voz','Fontname','Arial','Fontsize',12,'Fontangle','Italic','Fontweig
ht','Bold','color',[1 1 1])
delete(AIVoice)
clear AIVoice
ANEXO E. CÓDIGO PARA OBTENER SEÑAL ÚTIL MÉTODO UMBRAL
X=wavread('G:\MATLAB71\work\Joha\neuronas\PRINCIPAL\grabacion.wav');
Lo=length(X);
for i=1000:1:Lo
if abs(X(i))>0.009
inicio=i;
break;
end
end
for i=1:1:Lo-100
if abs(X(Lo-i+1))>0.008
final=Lo-i-100;
break;
end
end
Result=[];
j=1;
for i=inicio:1:final
Result(j)=X(i);
j=j+1;
end
axes(handles.axes9)
plot(0)
plot(Result), grid on, hold on
title('señal
útil','Fontname','Arial','Fontsize',12,'Fontangle','Italic','Fontwei
ght','Bold','color',[1 1 1])
wavwrite(Result,'Vector')
ANEXO F. CÓDIGO PARA OBTENER SEÑAL ÚTIL
MÉTODO CRUCES POR CERO
sutil=wavread('G:\MATLAB71\work\Joha\neuronas\PRINCIPAL\grabacion.wa
v');
axes(handles.axes9)
plot(0)
plot(Result), grid on, hold on
title('señal útil', 'Fontname','Arial', 'Fontsize',12, 'Fontangle',
'Italic','Fontweight','Bold','color',[1 1 1])
wavwrite(Result,'Vector')
%*******************************************************************
*
%*******************************************************************
*
function ContCC = CrucesCero(sutilAux)
ContCC = 0;
SignVal = -1;
for i = 1 : length(sutilAux)
SignVal2 = sign(100 * sutilAux(i));
if (-1 * SignVal) == SignVal2
ContCC = ContCC + 1;
SignVal = SignVal2;
end
end
ContCC = ContCC;
%*******************************************************************
*
%*******************************************************************
*
function ContAP = Amplitud(sutilAux)
% Sumatoria del valor absoluto del vector sutilAux
sutilAux = abs(sutilAux);
sutilAux = sutilAux.*sutilAux;
ContAP = sum(sutilAux)/length(sutilAux);
ANEXO G. CÓDIGO PARA EXTRAER PARÁMETROS LPC
run ('G:\MATLAB71\work\Joha\neuronas\PRINCIPAL\GUI2.m')
axes(handles.axes1)
cla
Patron=wavread('G:\MATLAB71\work\Joha\neuronas\PRINCIPAL\Vector.wav'
);
% ************************************
TamTrama = 500; % Tamaño de trama
Overlap = 330; % Incremento de trama
ValoresLpc = 15; % Número de valores LPC
NumMuestras = length(Patron);
NumTramas = floor(((NumMuestras - TamTrama) / Overlap) + 1);
Begin = 0;
i = 1;
%*************************************
if NumTramas < 2
Patron = [];
for i = 1 : 1000
Patron(i) = 0;
end
NumTramas = 4;
end
for ContNumF = 1 : NumTramas
for n = 1 : TamTrama
FramePattern(i) = Patron(n + Begin)*(0.54 -
0.46*cos(6.2832*n/TamTrama));
i = i + 1;
n + Begin;
end
Begin = Begin + Overlap;
i = 1;
FramePattern = FramePattern + 0.00001;
LPCval = [];
LPCval = lpc(FramePattern, ValoresLpc);
for t = 2 : ValoresLpc + 1
LPCvalAux(t - 1) = LPCval(1, t);
end
LPCvalAux = abs(LPCvalAux)/max(abs(LPCvalAux));
VecResult(ContNumF) = sqrt(sum(LPCvalAux)/length(LPCvalAux));
end
caracteristicas = VecResult';
set(handles.listbox1,'String',caracteristicas);
savefile = 'caracteristicas.mat';
save(savefile, 'caracteristicas');
set(handles.listbox1,'String',caracteristicas)
axes(handles.axes1)
plot(caracteristicas),grid on, hold on
title('Caracteristicas LPC','Fontname','Arial','Fontsize',12)
ANEXO H. CÓDIGO PARA EXTRAER PARÁMETROS FFT
run ('G:\MATLAB71\work\Joha\neuronas\PRINCIPAL\GUI2.m')
axes(handles.axes1)
cla
Y1 = wavread('G:\MATLAB71\work\Joha\neuronas\PRINCIPAL\Vector.wav');
%*******************************************************************
**
TamTrama = 500; % Tamaño de Trama
Overlap = 330; % Incremento de trama
NumMuestras = length(Y1); % Número de Tramas
NumTramas = floor(((NumMuestras - TamTrama) / Overlap) + 1);
Begin = 0;
i = 1;
%*******************************************************************
**
k = 1;
for ContNumF = 1 : NumTramas
TramaPatron = [];
for n = 1 : TamTrama
TramaPatron(i) = Y1(n + Begin)*(0.54-0.46*cos(6.2832*n/TamTrama));
%Enventanado HAMMING
i = i + 1;
n + Begin;
end
Begin = Begin + Overlap;
i = 1;
Y = fft(TramaPatron,1024);
Y(1)=[];
kk=abs(Y);
power = abs(Y(1:floor(length(Y)/2))).^2;
nyquist = 11025/2;
freq = (1:length(Y)/2)/(length(Y)/2)*nyquist;
for xi = 1 : length(freq)
if freq(xi) < 100 | freq(xi) > 5000
power(xi) = 0;
end
end
[Amp, Pos] = max(power);
vecF(k) = freq(Pos)/nyquist;
k = k + 1;
end
caracteristicas = vecF';
set(handles.listbox1,'String',caracteristicas);
axes(handles.axes1)
plot(0)
plot(caracteristicas), grid on, hold on
title('Caracteristicas
FFT','Fontname','Arial','Fontsize',12,'Fontangle','Italic','Fontweig
ht','Bold','color',[1 1 1])
savefile = 'caracteristicas.mat';
save(savefile, 'caracteristicas')
1
Implementación de Funciones de
Transferencia y Neurona Perceptron en
FPGAs (Febrero 2008)
Johana E. Briceño S, jebricenox@gmail.com
y = f i ( ni ) (2a)
n
y = f ( ∑ Wi X i + b )
i =1 (2b)
Fig. 3 Función Hardlim con M-Code
y = f ( w11 X 11 + w12 X 12 + ...w1n X 1n + b)
(2b)
Se necesita unas cuantas líneas de código para describir la
función hardlim1, dentro del bloque M-Code, como se puede
B. Funciones de Transferencia observar:
Las funciones de transferencia f, determinan la salida total
de la neurona, la que puede ser una función lineal o no lineal function [FT] = Fhardlim(sums, bias)
de n, y es escogida dependiendo del tipo de problema a sums1= sums + bias
resolverse con la RNA. if sums1 >= 0
En la figura 2, se observa las funciones de transferencia ft1 = 1
diseñadas y luego implementadas en la FPGA, de lo que else
depende de un análisis tanto de la precisión de resultados ft1 = 0
como de los recursos de hardware que consumirían. end
FT = xfix({xlSigned, 2, 0},ft1);
Donde:
sums; valor de entrada, es la suma total de las entradas a la
neurona multiplicada por su respectiva matriz de pesos.
bias; valor de entrada, ganancia b de la neurona.
FT; Valor de salida, se describe según la expresión III.2b, y
se le definió formato tipo Xilinx fixed-point (xfix), valor
signed fixed-point (xlSigned) con 2 bits y puno binario 0.
III. DISEÑO
A. Diseño Funciones de Transferencia
Function Hardlim
Hardlim1 1 1 5
Hardlim2 5 8 5
Según los resultados del bloque Resource Estimator se Fig. 5 Función Sigmoidal con memoria ROM
concluye que la función hardlim1, que utiliza el bloque M-
Code, necesita menos recursos de hardware, que la función
hardlim2 que utiliza un comparador y un sumador. De acuerdo En la figura 5, se observa la función de transferencia
a este resultado es conveniente utilizar la función de sigmoid mediante tablas almacenadas en la memoria ROM, al
transferencia hardlim1, con el bloque M-Code, ya que inicializarla con el comando logsig de Matlab.
obtenemos los resultados deseados con menos recursos de Adicionalmente se utiliza el bloque Convert para asegurar el
hardware. número de bits que debe ingresar en la ROM. A este bloque le
Para la función hardlims se tiene las dos formas de llamaremos Sig_ROM.
implementación que se presentó para la función hardlim. Y de La segunda forma de desarrollarla es por medio de
acuerdo a los recursos de hardware obtenidos, es más aproximaciones lineales pice-wise, para aproximar la función
conveniente la función hardlims utilizando el bloque M-Code sigmoid a una serie de funciones lineales, donde una función
de Sysgen, cuyo código se describe como: f(x) es dada en diferentes subconjuntos de su dominio. Para
esto se determinó la ecuación (3)1, expresando así una función
function [FT] = Fhardlims(sums, bias) lineal a trozos (pice-wise).
sums1= sums + bias
if sums1 >= 0 0 si x < −2
ft1 = 1 0.1572 si − 2 ≤ x < −1
else
ft1 = -1 0.3340 si −1 ≤ x < 0
end 1 / 2 si x=0 (3)
FT = xfix({xlSigned, 2, 0},ft1);
f ( x) = 0.5734 si 0 < x ≤ 0.8
0.7356 si 0.8 < x < 1.5
Función Sigmoid 0.8779 si 1.5 ≤ x ≤ 2.5
0.9509 si 2.5 < x ≤ 3.5
1
Muchas de las mejores técnicas desarrolladas en análisis si 3.5 < x
numérico para determinar la función sigmoid y que,
exitosamente se las utiliza en software, no son eficaces ni Desarrollada la función 3 en SysGen, es como se observa en
fáciles de desarrollar en hardware puesto que utilizan la figura 6, donde se utilizó comparadores, un concatenador y
funciones exponenciales que son funciones no lineales y su un bloque M-Code en el que se describe la lógica, que nos
implementación es muy costosa, [4] de lo que se tiene que permite obtener el valor de la función. A este bloque le
tener cuidado puesto que los recursos de la FPGA son llamaremos F_Sig.
limitados.
Para realizar funciones no lineales como la sigmoid, en este
trabajo se procede de 2 maneras. Primeramente las funciones
se desarrollan en forma de tablas almacenadas en bloques
ROM, donde se inicializan usando los comandos de funciones
de transferencias que nos proporciona el Neural Network
Toolbox de Matlab, en la cual valores de entrada toman el
valor de la función solo para valores enteros, que pueden ser
guardados en la tabla; para valores no enteros (ejemplo: 1.5,
0.8) se aproxima al valor más cercano. Usando ROMs se evita
el desperdicio de localidades porque éstas dependen del 1
Autor
4
Sigmoid Sig_ROM 23 12 45 20
1,2
0,8
Fig. 9 Esquema completo de la neurona en Sysgen
S a l id a S ig m o i d
0,6 Sig_ROM
F_Sig
Según se requiera mayor número de entradas, se agregan
0,4 Logsig multiplicadores en paralelo y en igual forma se agregan
0,2
sumadores en cascada. Una vez que se tiene la neurona, de
entradas y función de transferencia deseada, se puede
0
-6 -4 -2 0 2 4 6 8
desarrollar una RNA utilizándola tantas veces como el diseño
-0,2 lo requiera.
Valores de entrada X
IV. IMPLEMENTACIÓN
Fig. 7 Comparación de resultados bloques Sig_ROM, F_Sig
y Logsig
Para comprobar el correcto funcionamiento de la neurona y
De la tabla II se concluye fácilmente que para una entrada de la función de transferencia, se implementará las funciones
de 8 bits, punto binario 4, el bloque F_Sig necesita más AND y XOR.
recursos de hardware que la función Sig_ROM, pero a La función AND es un problema linealmente separable,
diferencia de ésta, el bloque F_Sig, según la figura 7, obtiene como se constata en la figura 10, que se resuelve con una
5
1
P(2)
0.5
b = [-3]; bias
V. CONCLUSIONES
Se desarrolló tres funciones de transferencia que son la
hardlim, hardlims y sigmoid, utilizando para cada una, dos
formas diferentes de desarrollarlas en System Generator, lo
que nos permitió comparar los resultados de funcionamiento y
de cantidad de recursos necesarios para ser implementados en
hardware, de esta forma escoger la que consuma menos
recursos, ya que los recursos de la FPGA son limitados, pero
sin renunciar a obtener los resultados deseados.
La elección del bloque más conveniente para la función
hardlim depende solo de la cantidad de recursos que requieren
para su implementación en hardware, puesto que los
resultados obtenidos en ambas formas son correctos con lo que
basándonos en la tabla VII.3 se concluye que la función
hardlim, desarrollada por medio del bloque M-Code, es la más
apropiada para la implementación.
La función hardlim y hardlims consumen menos recursos
hardware que las funciones no lineales.
De las dos implementaciones para la función sigmoid, se
tiene que, la desarrollada con la memoria ROM consume
menos recursos de hardware pero genera un mayor margen de
error que la función definida a trozos, que consume mayor
recursos y obtiene mejores resultados. Ya que la exactitud de
resultados y coste, en términos de hardware, son importantes,
la elección depende de los requerimientos de diseño de la
RNA.
Se desarrolló la unidad básica de una red neuronal, como lo
es la neurona perceptron, misma que se desarrolló con un alto
grado de paralelismo, lo que permitió obtener en general una
RNA con verdaderas características de procesamiento en
paralelo, logrando obtener resultados en menor tiempo de
ejecución que las que se pueden obtener con sistemas
computacionales clásicos.
REFERENCES
[1] Yu Hen Hu (University of Wisconsin), Jenq-Neng Hwang (University
of Washington), Handbook of NEURAL NETWORK SIGNAL
PROCESSING
[2] Francisco José Palacios Burgos, Redes Neuronales con GNU/Linux,
http://softwarelibre.unsa.edu.ar/docs/descarga/2003/curso/htmls/redes_n
euronales
[3] Bonifacio Martín del Brío, Alfredo Sanz Molina. “Redes Neuronales y
Sistemas Difusos”, RA-MA, 2002
[4] AMOS R. OMONDI (Flinders University Adelaide, Australia),
JAGATH C. RAJAPAKSE (Nanyang Tecnological University,
Singapore), FPGA Implementations of Neural Networks
Revisado por:
Ing. Héctor F. Gómez A., Ingeniero en Sistemas Informáticos
y Computación, Especialista en Sistemas de Información
Geográfica, Universidad Técnica Particular de Loja.