sintetizador de voz basado en lpc_v1.2
TRANSCRIPT
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 1
Resumen— Este trabajo presenta el diseño de un sistema de
síntesis de voz en tiempo real basado en coeficientes de
predicción lineal (LPC). Este sistema se encuentra
fundamentado en el detector de actividad de voz (VAD) para
determinar que segmentos de la señal que se quiere sintetizar
son sonoros y cuales no sonoros, se cimenta en el uso de la
autocorrelación para detectar el periodo fundamental de cada
segmento de la señal y en los coeficientes de predicción lineal
(LPC) para modelar el tracto vocal. Cada uno de los bloques
que conforman el sintetizador se realiza a través de la
herramienta MATLAB para luego efectuar las simulaciones
pertinentes.
Palabras clave— Sintetizador, detector de voz, filtro
preénfasis, segmento, autocorrelación, periodo, coeficientes,
error.
Abstract— This paper presents the design of a speech
synthesis system in real time based on linear prediction
coefficients, where this is based on the detector of voice
activity (VAD) to determine which segments of the signal that
you want to synthesize are sound and which do not sound, the
use of autocorrelation to detect the critical period of each
segment of the signal and linear prediction coefficients to
model the vocal tract. Each of the blocks that make up the
synthesizer is performed in MATLAB tool to perform the
relevant simulations.
Key words— Synthesizer, voice detector, preemphasis filter,
frame, autocorrelation, pitch, coefficients and error.
I. INTRODUCCIÓN
La síntesis de la señal vocal es la creación de voz
sintetizada, donde se desea que una máquina sea
capaz de expresarse emitiendo sonidos que se
puedan entender como palabras u oraciones. Esto
conlleva a la comprensión total del proceso del
habla, implicando la interacción de disciplinas en
las que está incluida la fisiología del órgano
humano así como también la lingüística.
La voz se produce en la laringe, que es una
estructura con unos cartílagos flexibles que son el
soporte de las cuerdas vocales. Estas cuerdas
vocales están formadas por unos músculos finos,
que dispuestos en posición horizontal forman una
especie de V. Para producir un sonido en concreto,
las cuerdas vocales se contraen o se alargan. Por
otro lado, también se da un cambio en la presión del
aire al salir a través de los pliegues vocales. Todo
ello produce una vibración que al resonar por la
laringe produce el sonido. Un sonido tiene tres
cualidades básicas; el tono o altura, volumen o
intensidad y el timbre o resonancia.
Al espacio situado entre dos cuerdas vocales se
llama glotis, variando este espacio el cuerpo
consigue dar al sonido las cualidades adecuadas de
tono y volumen. La cualidad del timbre la
determina la posición resonadora de la garganta,
boca y nariz, que son cavidades que modulan y
amplifican el sonido de la laringe.
II. PROCESAMIENTO DE VOZ
El procesamiento de voz es el estudio de la señal de
voz y las técnicas de procesado de estas señales.
Este procesamiento se divide en distintas categorías:
el reconocimiento de voz, mejora de la señal voz,
codificación de la señal voz y síntesis de voz.
A. Naturaleza de la señal vocal
El análisis de la señal vocal se lleva a cabo
mediante un modelo que describe el proceso del
habla, clasificando las señales en dos tipos:
o Las señales sonoras que presentan cierta
periodicidad como se muestra en la siguiente
figura:
Fig. 1. Periodicidad de un segmento sonoro
0 50 100 150 200 250-0.2
-0.15
-0.1
-0.05
0
0.05
0.1
0.15
Señal Sintetizada
Muestras (t=N/fs)
Am
pli
tud
Sintetizador de Voz Basado en LPC Gerardo Andrés López
Universidad del Quindío
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 2
o Las señales no sonoras también conocidas como
fricativas que presentan aleatoriedad en forma
de ruido blanco como se muestra en la siguiente
figura:
Fig. 2. Aleatoriedad de un segmento no sonoro
B. Extracción de características
La extracción de características intenta presentar el
contenido de la señal de voz de manera compacta,
de tal forma que la información propia de la señal se
preserva.
o Limitación en frecuencia
Para lograr esto se aplica un filtro de preénfasis que
amplifica las frecuencias más altas y comprime la
señal, donde la compresión es deseable para mejorar
la respuesta del detector de voz.
La señal de entrada s(n) es filtrada con el siguiente
filtro para obtener una señal pre-enfatizada:
�̂�(𝑛) = 𝑠(𝑛) − 𝛼𝑠(𝑛 − 1) (1)
Donde 𝛼 tiene un valor próximo a la unidad. [1]
o Segmentación
Usualmente el análisis de las características de la
señal de voz se desarrolla segmentando la señal en
bloques que se tratan individualmente. Para evitar
los efectos negativos provocados al tomar un
segmento que contenga una transición de una zona
de la señal cuasi-estacionaria (casi estacionaria) a la
siguiente, se usa la técnica del solapamiento de
segmentos.
La siguiente ecuación permite el cálculo de
muestras para cada segmento:
𝑁 = (𝑚𝑢𝑒𝑠𝑡𝑟𝑎𝑠/𝑠𝑒𝑔𝑢𝑛𝑑𝑜) ∗ 𝑙𝑜𝑛𝑔𝑖𝑡𝑢𝑑 𝑑𝑒𝑙 𝑓𝑟𝑎𝑚𝑒 (2)
Las siguientes ecuaciones representan la señal en
segmentos, sin solapar y con solapamiento
respectivamente:
𝑓𝑗 = {𝑥(𝑖)}𝑖=(𝑗−1)𝑁+1𝑗𝑁
(3) − 𝑎
𝑓𝑗 = {𝑥(𝑖)}𝑖=(𝑗−1)𝑁+1𝑗𝑁−(𝑗−1)𝑁
(3) − 𝑏
o Enventanado Se aplica a cada segmento una función ventana, que
suaviza los bordes del intervalo haciendo que estos
tiendan a cero, y resalta la parte central acentuando
las propiedades características del segmento:
𝑆′𝑓𝑟𝑎𝑚𝑒(𝑛) = 𝑆𝑓𝑟𝑎𝑚𝑒(𝑛) ∗ 𝑉(𝑛) ,0 ≤ 𝑛 ≤ 𝑁 − 1 (4)
La función ventana más comúnmente utilizada en el
análisis de la señal de voz, es la llamada ventana
Hamming, su mayor virtud radica en que mantiene
un buen equilibrio entre su duración temporal y su
resolución en frecuencia.
o Detección de voz
La detección de voz se lleva a cabo a través de los
detectores de actividad de voz (VAD), estos pueden
esquematizarse mediante el diagrama de bloques
mostrado en la figura 3. La decisión del VAD se
realiza en base a la información suministrada por las
características de cada frame y finalmente, esta
decisión se suaviza en el tiempo.
Fig. 3. Diagrama de bloques del VAD
En este caso la detección de voz se lleva a cabo a
través del detector de actividad de voz (VAD)
propuesto por el artículo Dynamical Energy-Based
Speech/Silence Detector for Speech Enhancement
Applications. Se declara actividad de voz (VAD =
0 50 100 150 200 250-1.5
-1
-0.5
0
0.5
1
1.5x 10
-3
Muestras (t=N/fs)
Am
pli
tud
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 3
1) si los valores medidos superan los umbrales. De
lo contrario, sino se detecta ninguna actividad (es
decir, ruido), se declara como silencio (VAD = 0).
o Sonoridad y pitch
Una vez establecido qué segmentos son sonoros
utilizando el VAD, se procede a determinar el pitch
o periodo fundamental a partir de la función de
autocorrelación determinada por la siguiente
ecuación:
𝑅(𝜏) =1
𝑁∑ 𝑆𝑗 ∗ 𝑆𝑗−𝜏
𝑁
𝑗=1
(6)
Si el segmento es periódico, la función de
autocorrelación también lo será, esto se traducirá en
un valor máximo para aquellos retardos iguales al
período de la señal, por lo tanto, el máximo global
corresponde al retardo nulo, mientras que el
segundo máximo debiese corresponder al retardo
igual al período fundamental [2].
o Modelado del tracto vocal
La idea fundamental es que a partir de una
determinada muestra de la voz o trama y aplicando
un modelo determinado para la generación de la
misma, se obtiene un conjunto de parámetros que
definen el modelo. Ese modelo corresponde a un
modelo de predicción lineal LPC (Linear Predictive
Coding), donde el tracto vocal, se puede describir
por un filtro todo polo de respuesta impulsiva
infinita (IIR) con una función de transferencia dada
por:
𝐻(𝑧) =𝑏0
1 + ∑ 𝑎𝑘𝑧−𝑘𝑃𝑘=1
(7)
Donde 𝑏02 es la varianza del ruido blanco de entrada
o error de predicción.
La ecuación en diferencias del sistema que modela
el tracto vocal resulta en:
𝑠(𝑛) = ∑ 𝑎𝑘𝑠(𝑛 − 𝑘)
𝑃
𝑘=1
+ 𝐺𝑢(𝑛) (8)
El término de la sumatoria, puede interpretarse
como un predictor lineal en el cual la muestra de
salida se puede generar mediante una combinación
lineal de P muestras anteriores, donde se puede
calcular el error de predicción e(n) como:
𝑠′(𝑛) = ∑ 𝑎𝑘𝑠(𝑛 − 𝑘)
𝑃
𝑘=1
(9)
𝑒(𝑛) = 𝑠(𝑛) − 𝑠′(𝑛) = 𝐺𝑢(𝑛) (10)
Una vez determinado el filtro, este tiene dos
posibles señales de entrada que dependerán del tipo
de señal, sonora o no sonora. Para señales sonoras
la excitación será un tren de impulsos de frecuencia
controlada, mientras que para las señales no sonoras
la excitación será ruido aleatorio, donde la
combinación de estas señales modela el
funcionamiento de la glotis.
Fig. 4. Modelo de producción de voz
Este diagrama enseña el proceso de producción de
voz, donde los parámetros del tracto vocal se
calculan a través de la función LPC suministrada
por la herramienta MATLAB.
III. DESCRIPCIÓN DE BLOQUES
Los siguientes bloques describen cada uno de los
algoritmos que conforman el sistema sintetizador de
voz; el algoritmo de preénfasis para comprimir la
señal en amplitud, el algoritmo para determinar qué
segmentos de la señal son sonoros y cuales son
fricativos, el algoritmo que calcula la
autocorrelación para la detección del pitch y el
algoritmo que modela el tracto vocal para sintetizar
la señal voz.
A. Filtro de preénfasis
Este bloque tiene como función realizar la
traducción de la ecuación (1) (ecuación en
diferencias del filtro) al correspondiente código
MATLAB.
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 4
Señal de entrada
Señal preenfatizada
Filtro de preénfasis
Fig. 5. Diagrama de bloques del filtro de preénfasis
B. Detector de actividad de voz
El siguiente diagrama de bloques extraído del
artículo Dynamical Energy-Based Speech/Silence
Detector for Speech Enhancement Applications,
describe el algoritmo empleado para determinar qué
segmentos de la señal, son sonoros y cuáles no.
Fig. 6. Diagrama de flujo del VAD
El algoritmo caracteriza su comportamiento a través
de la energía de raíz media cuadrática (RMSE) de
un segmento de voz; la estimación del umbral se
basa en la observación de que la energía a corto
plazo exhibe distintos picos y valles
correspondientes a períodos de actividad o de
silencio de la voz.
C. Detector de Pitch
El detector de pitch se basa en el cálculo de la
autocorrelación de cada segmento extraído de la
señal, para luego buscar los dos picos máximos que
permitan determinar el periodo fundamental.
Cálculo de
autocorrelaciónBúsqueda del pico maximo
S[n]R[τ ] Pico máximo
Posición Fig. 7. Diagrama de bloques del detector de pitch
El siguiente diagrama de flujo contiene los detalles
de cómo determinar el pitch:
signal frame
N=length(signal frame); index=0max=0
Calculate R[τ ]
R[τ ]>max
max=R[τ ]; index=τ
τ++
return index & max
τ>N-
+
-+
Fig. 8. Diagrama de flujo del detector de pitch
D. Modelo del tracto vocal
Este bloque representa el filtro final con el que se
obtiene la señal sintetizada, este recibe los
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 5
parámetros producidos por la función lpc (Linear
Predictor Coefficients) de MATLAB y el tipo de
excitación; tren de impulsos, con periodo igual a la
frecuencia fundamental calculada en el bloque
anterior, para segmentos sonoros y ruido para
segmentos no sonoros.
Filtro todo polo IIR
Tren de impulsos
Ruido
Parámetros del tracto vocal
Voz Sintetizada
Fig. 9. Diagrama de bloques del modelo del tracto vocal
IV. RESULTADOS MATLAB
Después de haber establecido cada uno de los
bloques que conforman el sistema, se procede a
realizar la experimentación con la señal grabada
“sintetizador de voz” a una frecuencia de muestreo
de 8000Hz durante dos segundos.
A. Bloque de preénfasis
La siguiente figura enseña la señal de entrada
graficada con respecto al número de muestras en
contraste con la misma señal pero procesada por el
filtro de preénfasis.
Fig. 10. Señal de entrada sin filtro y con filtro de preénfasis
Se observa la compresión del rango dinámico de la
señal a partir de la utilización de dicho filtro, cuyo
objetivo no es más que facilitar la decisión del
VAD, realzar las frecuencias altas y suavizar el
espectro.
B. Bloque VAD
Para llevar a cabo la detección de los segmentos
sonoros y no sonoros se aplica el algoritmo VAD
descrito anteriormente, donde a partir del cálculo
del valor cuadrático de la energía, del
establecimiento del valor máximo y mínimo de la
energía y del umbral establecido para cada frame se
obtienen las siguientes curvas características:
Fig. 11. Energía RMS, energía mínima y umbral de energía
Fig. 12. Energía RMS y energía máxima
Los parámetros anteriores, representados en las
gráficas, son el fundamento de la decisión del VAD,
lo que da lugar al resultado de la figura 13, se
observa la alta sensibilidad del VAD frente frames
de la señal que presentan una amplitud cercana al
umbral que se establece, lo que se traduce en un
valor binario clasificatorio (como voz o ruido) para
esos frames sin ser realmente frames de voz:
0 2000 4000 6000 8000 10000 12000 14000 16000-1
-0.5
0
0.5
1
Señal de Entrada
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-0.5
0
0.5
1
Señal con Filtrado de Preénfasis
Muestras
Am
pli
tud
0 20 40 60 80 100 120 1400
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
Energías de la Señal de Entrada y Umbral de Energía
Segmentos
Am
pli
tud
Energía de la señal
Energía mínima
Umbral de energía
0 20 40 60 80 100 120 1400
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
Energía de la Señal de Entrada y su Energía Máxima
Segmentos
Am
pli
tud
Energía de la señal
Energía máxima
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 6
Fig. 13. Detector de actividad de voz
Para reducir la sensibilidad del VAD al nivel de
ruido se utiliza un valor de cota superior para el
nivel del umbral, lo que produce el siguiente
resultado:
Fig. 14. Energía RMS, energía mínima y umbral de energía
Fig. 15. Detector de actividad de voz
El incremento del umbral supone una mejora en el
momento de sintetizar la señal, puesto que
segmentos que no son sonoros no serán excitados
con el tren de impulsos, como si ocurre inicialmente
con el VAD calculado (figura 13), donde ciertos
segmentos no sonoros serán excitados con el tren de
impulsos y no con ruido, como debiera ocurrir.
C. Bloque sintetizador
Este bloque calcula la frecuencia fundamental de
cada segmento clasificado como sonoro por el
VAD. Se emplea el filtro todo polo IIR, que
representa el tracto vocal, para sintetizar la señal de
voz a partir de los coeficientes lpc extraídos con la
herramienta MATLAB y la excitación que
corresponda, tren de impulsos para segmentos
sonoros y ruido para segmentos no sonoros.
Inicialmente se sintetiza la señal haciendo uso de un
nivel de umbral reducido en el VAD para enseñar lo
anteriormente expuesto:
Fig. 16. Sintetizador de voz
Para luego incrementar el umbral y obtener el
siguiente resultado:
Fig. 17. Sintetizador de voz
0 2000 4000 6000 8000 10000 12000 14000 16000-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
Gráfica del VAD y de la Señal de Entrada
Muestras
Am
pli
tud
0 20 40 60 80 100 120 1400
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
Energías de la Señal de Entrada y Umbral de Energía
Segmentos
Am
pli
tud
Energía de la señal
Energía mínima
Umbral de energía
0 2000 4000 6000 8000 10000 12000 14000 16000-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
Gráfica del VAD y de la Señal de Entrada
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-1
0
1
Señal de Entrada
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-0.5
0
0.5
1
Señal Preénfasis y VAD
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-0.1
0
0.1
Señal Sintetizada
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-1
0
1
Señal de Entrada
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-0.5
0
0.5
1
Señal Preénfasis y VAD
Muestras
Am
pli
tud
0 2000 4000 6000 8000 10000 12000 14000 16000-0.1
0
0.1
Señal Sintetizada
Muestras
Am
pli
tud
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 7
Observándose una señal sintetizada con menos
ruido con respecto a la del umbral inicial (figura
17).
Fig. 18. Voz sintetizada
IV. CONCLUSIONES
Se comprendió en términos generales el proceso de
sintetizado de una señal de voz, entendiendo de qué
manera una de las técnicas más usadas en el
procesamiento de señales permite, de modo
eficiente, parametrizar cualquier señal en un
conjunto pequeño de patrones o coeficientes que
admiten la reconstrucción adecuada de dicha señal.
Haciendo uso del método de detección de pitch a
través de la autocorrelación se logra obtener, de
manera sencilla, la frecuencia fundamental de cada
segmento, donde su baja complejidad
computacional hace de este el método ideal para
entender por qué ciertos segmentos de voz
presentan características estacionarias
caracterizadas por un periodo fundamental.
Establecer un umbral adecuado en el algoritmo que
realiza el cálculo de segmentos sonoros y no
sonoros permite al sistema ejecutar una mejor
discriminación sobre los frames que representan voz
y sobre los que representan ruido, obteniéndose una
reconstrucción de la señal de voz más fidedigna.
Matlab como herramienta para el procesamiento de
señales es indispensable, a través de esta es posible
realizar un adecuado análisis de la voz,
determinando a partir de pequeños segmentos de la
misma, características o patrones importantes con
respecto a su naturaleza, patrones que permiten
determinar de manera adecuada, en conjunto con
otras técnicas, la señal de excitación de nuestro
sistema sintetizador. Gracias a la versatilidad en el
manejo de vectores de MATLAB, fue posible
realizar cada subsistema del sintetizador sin mayor
dificultad; la parte de preénfasis de la señal, el
establecimiento del algoritmo VAD, el cálculo del
periodo fundamental a través de la autocorrelación,
el cálculo de los coeficientes lpc y el
establecimiento del filtro todo polo IIR.
Permitiendo de esta manera ahondar en la
comprensión de la forma en la que un tipo de señal
puede ser analizada y procesada.
REFERENCIAS
[1]http://hera.ugr.es/tesisugr/16128503.pdf, pág. 50
[2]http://www.tesis.uchile.cl/tesis/uchile/2009/robles_i/s
ources/robles_i.pdf, pág. 23
0 2000 4000 6000 8000 10000 12000 14000 16000-0.1
-0.05
0
0.05
0.1
0.15
Voz Sintetizada
Muestras
Am
pli
tud
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 8
ANEXOS
A continuación se presenta la traducción de los algoritmos, realizados en Matlab, en lenguaje C:
A. Filtro LPC void filter_lpc(float error, float *coef, float *signal_x)
{
short i, k;
float x_n=0, y_n=0, signalpc=0;
float y[numcoef+1];
for(k=0; k<numcoef+1; k++) y[k] = 0.0;
for(k=0; k<N; k++) output_filter[k] = 0.0;
for(i=N; i>0; i--){
x_n = error*signal_x[i];
y_n = y[0]*coef[1];
for(k=numcoef-1; k>0; k--){
y_n = y_n + coef[k+1]*y[k];
y[k] = y[k-1];
}
signalpc = x_n - y_n;
y[0] = signalpc;
output_filter[i-1] = signalpc;
}
}
B. Función de sintetizado void dsp_main()
{
uint32_t k;
uint32_t j, i, m;
float max_abs;
//buffer que almacena el numero total de coeficientes por cada frame
float buffer_coef[numcoef+1];
//vector que almacena la señal sintetizada en punto flotante
float synthesizer[size_signal_total];
//vector que almacena el absoluto de toda la señal sintetizada
float synthesizer_abs[size_signal_total];
//vector que almacena la señal sintetizada en punto fijo
int16_t synthesizer_int[size_signal_total];
//creacion de ficheros para almacenar los resultados
char name[] = "fichero.xls";
char name2[] = "fichero2.xls";
char name3[] = "fichero3.xls";
for(k=0; k<size_signal_total; k++) synthesizer[k] = 0.0;
//el siguiente algoritmo es una traduccion de lo realizado en MATLAB
for(j=0; j<size_pitch; j++){
if(Npitch_total[j] != 0){
printf("frame sonoro\n");
//se genera la señal de excitacion
pulse_train(N, Npitch_total[j]);
//se almacenan los coeficientes en el buffer
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 9
for(k = j*(numcoef+1), i=0; k<=(numcoef+1)*j+numcoef; k++, i++)
buffer_coef[i] = coef_total[k];
// se aplica el filtro que representa el tracto vocal
filter_lpc(sqrt(error_total[j]), buffer_coef, dirac_train);
for(k = j*Nsub, i=0; k<=(j+1)*N-j*Nsub; k++, i++)
synthesizer[k] = output_filter[i];
}
else{
printf("frame NO sonoro\n");
//ruido aleatorio para excitar los frames no sonoros
for(i=0; i<N; i++)
noise[i] = (float)rand()/(float)RAND_MAX-0.5;
//se almacenan los coeficientes en el buffer
for(k = j*(numcoef+1), i=0; k<=(numcoef+1)*j+numcoef; k++, i++)
buffer_coef[i] = coef_total[k];
// se aplica el filtro que representa el tracto vocal
filter_lpc(sqrt(error_total[j]), buffer_coef, noise);
for(k = j*Nsub, i=0; k<(j+1)*N-j*Nsub; k++, i++)
synthesizer[k] = output_filter[i];
}
}
//se calcula el valor absoluto de la señal
for(k=0; k<size_signal_total; k++)
synthesizer_abs[k] = fabs(synthesizer[k]);
//se calcula el maximo absoluto de la señal
max_abs = max_pos(synthesizer_abs, sizeof(synthesizer_abs)/sizeof(float));
if(max_abs>=1)
m = floor(16 - 1 - log2(max_abs));
else
m = 15;
//se pasa el vector que contiene la señal sintetiza a punto fijo
for(k=0; k<size_signal_total; k++)
synthesizer_int[k] = (short)round(synthesizer[k]*pow(2, m));
//se escribe en ficheros la informacion generada
write_file_float(synthesizer, sizeof(synthesizer)/sizeof(float), name);
write_file_int(synthesizer_int, sizeof(synthesizer_int)/sizeof(int16_t), name2);
write_file_float(synthesizer_abs, sizeof(synthesizer_abs)/sizeof(float), name3);
}
Obteniéndose el siguiente resultado, tanto en punto flotante como en punto fijo:
-0,1
-0,05
0
0,05
0,1
0,15
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
Sintetizador de Voz, punto flotante
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 10
-4000
-3000
-2000
-1000
0
1000
2000
3000
4000
5000
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
Sintetizador de Voz, punto fijo