Está en la página 1de 7

VOCODER

I. Introducción
El VOCODER construye un codificador de voz LPC, es decir, realiza análisis y síntesis LPC en
un archivo de voz, lo que resulta en una aproximación de voz sintética a la voz original. El
análisis LPC utiliza un análisis de autocorrelación estándar para determinar los conjuntos de
coeficientes LPC, cuadro por cuadro, junto con la ganancia basada en cuadros, G. Un método de
análisis independiente (un detector de período de tono cepstral) clasifica cada cuadro del habla
como voz expresada (con un período determinado por la ubicación del pico cepstral en un rango
designado de períodos de tono) o un discurso sordo (simulado por un marco de ruido aleatorio)
designado como un período de tono de marco de 0 muestras. El análisis independiente
proporciona una función de excitación de dos estados para la parte de síntesis LPC del
procesamiento, que consiste en una serie de pulsos de tono (durante las tramas sonoras) y / o
secuencias de ruido (durante las tramas sonoras).

II. Modelo de Vocoder

Figure 1: Modelo matemático del Vocoder a implementar

III. Innovaciones u[n] y Coeficientes a[z]

1
Con nuestro audio, aplicaremos algunas fórmulas para encontrar los coeficientes e innovaciones de
nuestra señal, para captar nuestros polinomios P (z) y Q (z), a partir de ahí encontraremos nuestros
coeficientes Wk.

(1)

La ecuación (1) nos ayuda a calcular las innovaciones.

Figure 2: Innovaciones u[n]

(2)
(3)

(4)
(5)

En las ecuaciones 2 a 5, obtenemos los polinomiales P(z) y Q(z) de donde se obtienen los
coeficientes
En su implementación del código P nos permite eliminar el valor mayor y Q nos permite eliminar
el menor valor.

IV. Reconstrucción de la señal

2
Con los datos que se obtuvieron anteriormente en los distintos procesos, reconstruiremos la señal.

Figure 3: Modelo matemático para reconstruir la señal (voz)

V. Código
Como se observa en el código 1 llamamos a la grabación realizada anteriormente en el laboratorio,
una vez a través de código obtenemos su longitud, establecemos el número de ventanas y luego
realizamos la segmentación de la señal (voz).

clear all
[x0,fs] = audioread('Voz_1.wav');

L=length(x0);
nw = 160;
R = zeros(1,L-nw);

%segmentamos solo la
for i=1:L-nw
idx = i:nw+i;
R(i) = sqrt(sum(x0(idx).^2)/nw);
end
eta = 0.01;
x = x0(R>=eta);
Lx = length(x); nw = 160; eta=0.01;

Code 1: Segmentación de la voz

3
Figure 2 – Voz original y segmento de voz deseado

Como observamos en figura 2, con la función de segmentación, no solo dividimos la ventana,


también eliminamos parte de la señal que no será necesaria para analizar.

VI. Innovaciones, coeficientes y polinomios P y Q para cada ventana

En el código 2, observamos la función implementada para obtener las innovaciones, que


posteriormente nos ayudarán en el desarrollo de nuestro vocoder.

function [u]=innovaciones(xs,a)
xs=xs(:);
a=a(:);
xs1=[zeros(10,1);xs];
u=zeros(1
for i=1:160
u(i)=xs1(10+i:-1:i)'*[1;a];
end

Code 2 – Función para obtener las innovaciones

function a = coefficients_a(xn)
Rx = xcorr(xn);
[~, idx_max] =
R = toeplitz(Rx(idx_max:idx_max+9));
r = -Rx(idx_max+1:idx_max+1+9);
a = inv(R)*r;

Code 3 – Función para obtener los coeficientes


En el Código 3 se implementa la función para obtener los coeficientes y en el código 4 observamos
el llamado de las funciones implementadas para obtener los coeficientes e innovaciones.

for i=1:floor(Lx/nw)
idx = 1 + (i-1)*160:i*160;
xn = x(idx);
a = coefficients
(xn,a); %hallamos las innovaciones
xn_est=filter(1,[1;a],u);
sw_est = zeros(170,1);

Code 4 – Citación de funciones de coeficientes e innovaciones

4
VII. Coeficientes Wk (codificador) y coeficientes Ak (decodificador)

function wk = val_wk(a)

an = a(end:-1:1);
Pz = [1; a-an; -1];
Qz = [1; a+an; 1];

Pz_roots = roots(Pz);
Qz_roots = roots(Qz);
(idx)=[];

idx = real(Qz_roots)<=-0.99999;
Qz_roots(idx)=[];

for i=1:2:10
r11 = Pz_roots(i); r12 = Pz_roots(i+1);
z1 = [1/r11 -1]; z2 = [1/r12 -1];
fz = conv(z1, z2);
wk(i+1) = acos(-fz(2)/2);

r11 = Qz_roots(i); r12 = Qz_roots(i+1);


z1 = [1/r11 -1]; z2 = [1/r12 -1];
fz = conv(z1, z2);
wk(i) = acos(-fz(2)/2);
end

Code 5 – Función wk (codificador)


En el código 5 se enuncia la función que nos permitirá obtener los coeficientes wk en la
codificación, mientras que en el código 6, la función implementada nos permite obtener los
coeficientes ak para la decodificación.

function [a] = val_a(wk)


z=[];
[f,c] = size(wk)
for j=1:f

for i=10:-2:1
fz = [1 1 1];
fz(2) = -2*cos(wk(j,i));
z = roots(fz);
Pzr_roots(i,1) = z(2
fz(2) = -2*cos(wk(j,i-1));
z = roots(fz);
Qzr_roots(i,1) = z(2);
Qzr_roots(i-1,1) = z(1);
end

Qzroots = [-1 ; Qzr_roots];


Pzroots = [Pzr_roots ; 1];

Pzr = poly(Pzroots)';
Qzr = poly(Qzroots)';
5
a1 = (Pzr + Qzr)/2;
a(:,j) = a1(2:end-1)
end
Code 6 – Función ak (decodificador)

El Pitch que se implementa en el código 7, se establece entre los valores de 20 y 146.

%PITCH
[g,ptch]=max(Ru(179:end));

if (20<=ptch) && (ptch<=146)


T(i)=ptch;
s2_u(i)=g;
else
s2_u(i)=sqrt(Ru(160))/nw;
T(i)=0;
end

Code 7 – Pitch

En la figura 3 observamos la gráfica que nos representa la autocorrelación, con su valor máximo de
ganancia, que la ubicamos en 160.

Figure 3 – Autocorrelación de la señal con su máximo valor de ganancia

VIII. Reconstrucción de la señal


Para recuperar la señal, se utiliza la lógica propuesta en la figura 3, que, en su tramo final, una vez
pasado por el filtro LPC, obtenemos la señal reconstruida, que en este caso se guarda en s1 y se
programa como se observa en el código 8.

A = val_a(wk); %Obtenemos los coeficientes wk


s1 = [];
= impulse_train(T(i)); %
elseif(T(i)==0)
n = white_noise();
end
u = n*s2_u(i);
s_T = filter(1,[1;A(:,i)],u); %para recuperar la señal filtramos.
s1 = [s1 s_T];
end
sound(s1,8000)

6
Code 8 – Reconstrucción de la señal

Finalmente, al ejecutar todo el código, obtenemos una señal reconstruida (Figura 4), el cual a
efectos de la experiencia realizada, se observa una cantidad considerable de pérdida de la señal,
más allá de lo que ya se perdió en la segmentación, así mismo es necesario resaltar la importancia
de mantener la ganancia para recuperar los patrones formantes de nuestra señal cuando esta pasa
por un proceso de codificación y decodificación.

Figure 4 – Voz original y voz reconstruida

IX. Conclusiones:

1. La implementación del Vocoder, nos ayuda a comprender la importancia de codificar una


señal de voz, como el de ahorrar espacio en su almacenamiento o transportar de una forma
flexible, necesitando un ancho de banda cada vez menor.

2. No se necesita un filtro mayor a orden 13 para procesar la voz.

3. Basta con 160 ventanas como las implementadas en el código para obtener un buen resultado
en la decodificación d
4. La voz reconstruida tiene la característica de escucharse “robotizada”, debido al proceso que
sufre la señal, sobre todo al pasar por una serie de filtros basados en la secuencia original de
símbolos.

También podría gustarte