Modelado Estadístico y Procesamiento de Señales de Voz: Aplicaciones y Evaluación
Práctica 1: Modelado y Estimación de Señales de Voz
Modelo 1: Espacio de Muestreo Discreto
Es un modelo muy sencillo que considera la generación de muestras de señal de voz como un experimento aleatorio con un espacio de muestreo discreto S, formado por los 256 valores distintos que puede tomar una muestra mi y que se encuentran en el rango S = {m1 = −127, m2 = −126,…, m255 = 127, m256 = 128}. Determine una ley de probabilidad ai = P[s(n) = mi] para este experimento aleatorio, usando la base de datos formada por los ficheros de voz “aage3201r.8bi”, “tsge3270r.8bi”, “euge0013r.8bi”, “vege1850r.8bi” (contienen enteros con signo de 8 bits, cada uno de los cuales corresponde al valor de una muestra). Los ficheros no tienen ningún tipo de cabecera.
% Abrimos y dibujamos cada muestra
f1=fopen('aage3201r.8bi','r');
s1=fread(f1,'int8')
plot(s1)
f2=fopen('euge0013r.8bi','r');
s2=fread(f2,'int8')
plot(s2)
f3=fopen('tsge3270r.8bi','r');
s3=fread(f3,'int8')
plot(s3)
f4=fopen('vege1850r.8bi','r');
s4=fread(f4,'int8')
plot(s4)
% Unimos los vectores s1, s2, s3 y s4 en un solo vector de muestras s
s=[s1;s2;s3;s4]
% Creamos un vector x que almacena los valores enteros desde –127 a 128.
x=-127:1:128;
% Calculamos el número de veces que se repite una muestra en dicho intervalo determinado anteriormente
frec=hist(s,x);
% Obtenemos el número de muestras que tenemos
ntotal=length(s);
% Calculamos la probabilidad de s
prob=frec/ntotal;
% Comprobamos que las probabilidades suman 1
sum(prob);
plot(prob)
% Creamos un nuevo vector p, con los valores del vector prob.
p=prob
% Bucle que recorre las posiciones del vector p, y sustituye aquellos que valen cero, por 10e-6.
for
k=1:1:256;
if
p(k)==0,
p(k)=10e-6;
end
end
% Normalizamos el nuevo vector de probabilidades p
p=p/sum(p);
Tabla de Probabilidades (Modelo 1)
Modelo 2: Cadena de Markov de Primer Orden
Es un modelo más sofisticado que considera la producción de una secuencia de muestras de señal de voz como un experimento aleatorio secuencial formado por experimentos dependientes que pueden ser modelados como una cadena de Markov de primer orden.
En este tipo de modelado se ha de determinar el valor de las probabilidades condicionales aij = P[s(n) = mj | s(n − 1) = mi], i,j = 1,2,…,256. Se ha de obtener, por tanto, una matriz de probabilidades condicionales de dimensión 256 × 256. Para ello se usa la misma base de datos indicada anteriormente.
% Creamos una matriz de ceros
matrizp = zeros(256);
k=256;
% Bucle de procesamiento
for
i=1:1:(ntotal-1)
a=s(i);
b=s(i+1);
d=matrizp(128+a,128+b);
matrizp(128+a,128+b)=d+1;
end
% Bucle que cambia los 0 por 10e-6
for
j=1:1:k
for
k=1:1:k
if
(matrizp(j,k)==0)
matrizp(j,k)=10e-6;
end
end
end
% Obtenemos la matriz normalizada
for
i=1:k;
matrizp(i,:)=matrizp(i,:)/sum(matrizp(i,:));
end
Tabla de Probabilidades Condicionales (Modelo 2)
Con los dos modelos estadísticos desarrollados en el apartado anterior, realice las siguientes 4 estimaciones estadísticas para cada una de las muestras de voz que falten en el receptor.
Estimación 1: Máxima Probabilidad (Modelo 1)
Basada en el primer modelo. Estimaremos la muestra que falta s(n) como s(n) dada por:
s(n) = mi que hace máxima la P[s(n) = mi], i = 1,2,…,256
% Abrimos la 5ª muestra
f5=fopen('aage3201r.8bi','r');
s5=fread(f5,'int8')
% Asignamos la muestra s5
muestra1=s5;
% Escogemos el valor que más se repite
[maximo,posicion]=max(p);
maxim=posicion-128;
% Longitud de la muestra
n=length(muestra1)
% Bucle que sustituye al azar una de cada 10 muestras por el valor que más se repite
for
k=1:10:n;
va=rand(1,10);
[vmax1,pos1]=max(va);
muestra1(k-1+pos1)=maxim;
end
Estimación 2: Valor Promedio (Modelo 1)
Basada en el primer modelo. Estimaremos la muestra que falta s(n) como s(n) dada por:
% Asignamos la muestra s5
muestra2=s5;
% Eliminamos un valor de cada 10 muestras
for n=1:10:(length(muestra2)-10)
sx=muestra2(n:n+9);
% Eliminaremos la posición que ocupe el valor máximo
va=rand(1,10);
[valor,posicion]=max(va);
% Bucle que recorre las 256 posiciones y sustituye el valor que falta por el valor promedio
sx(posicion)=0;
for i=1:1:256
sx(posicion)=sx(posicion)+round((i-128)*p(i));
end
muestra2(n:n+9)=sx;
end
Estimación 3: Máxima Probabilidad Condicional (Modelo 2)
Basada en el 2º modelo. Supongamos que hemos recibido la muestra mr en el instante n−1, es decir, s(n−1) = mr. Estimaremos la muestra que falta en el instante siguiente s(n) como s(n) dada por:
s(n) = mj que hace máxima la P[s(n) = mj | s(n − 1) = mr], j = 1,2,…,256
% Asignamos muestra s5
muestra3=s5;
% Sustituimos muestras escogidas al azar por el valor esperado
% después de la muestra anterior a la sustituida
for
n=1:10:(length(muestra3)-10)
sx=muestra3(n:n+9);
% Creamos un vector de 10 posiciones de manera aleatoria donde la
% posición que ocupe el valor máximo será la que eliminemos en el
% archivo transmitido
va=rand(1,10);
[valor,posicion]=max(va);
sx(posicion)=0;
if
posicion~=1
a=sx(posicion-1);
[prob,posicionmax]=max(matrizp(a+128,:));
sx(posicion)=(posicionmax-128);
else
post=0;
prob1=0;
prob2=0;
% Bucle que busca la máxima probabilidad mediante la fórmula de Bayes.
% El número que corresponde a la
% posición de la columna será el que mayor probabilidad condicional
% tiene y rellenaremos el hueco con él.
for
k=1:256
a=sx(posicion+1);
prob1=matrizp(a+128,k);
prob1=prob1*p(sx(posicion+1)+128);
prob1=prob1/p(k);
if
prob1>prob2
prob2=prob1;
post=k;
end
end
sx(posicion)=post-128;
end
muestra3(n:n+9)=sx;
end
Estimación 4: Valor Esperado (Modelo 2)
Basada en el 2º modelo. Supongamos que hemos recibido la muestra mr en el instante n−1, es decir, s(n−1) = mr. Estimaremos la muestra que falta en el instante siguiente s(n) como s(n) dada por:
muestra4=s5;
m=zeros(1,256);
% Sustituimos muestras escogidas al azar por el valor esperado
% después de la muestra anterior a la sustituida
for
k=1:256
for
j=1:256
m (k)=m (k)+((j-128)*matrizp(k,j));
end
end
% Sustituimos una muestra al azar de cada 10 y la sustituimos por el valor
% que más se repite
for
k=1:10:50500
a=rand(1,10);
[valorm,posicion]=max(a);
% Almacenamos en la variable valor el valor de la muestra que vamos a
% sustituir
valor=muestra4(i-1+pos);
% Sustituimos la muestra elegida por el valor esperado
muestra4(i-1+pos)=m (valor-1+128);
end
3. Evaluación de la Calidad de la Señal
Se va a llevar a cabo a continuación una evaluación objetiva y subjetiva de la calidad de la señal de estas 4 señales de voz. Para la evaluación objetiva, utilizad la denominada relación señal-ruido (SNR) que viene definida por:
donde Nmuestras es el número total de muestras del fichero “euge0019r.8bi”.
% Calculamos la relación señal-ruido
snr1=10*(log10((sum(s5.^2))/sum((s5-muestra1).^2)))
snr1 = 10.0582
snr2=10*(log10((sum(s5.^2))/sum((s5-muestra2).^2)))
snr2 = 9.9296
snr3=10*(log10((sum(s5.^2))/sum((s5-muestra3).^2)))
snr3 = 16.0601
snr4=10*(log10((sum(s5.^2))/sum((s5-muestra4).^2)))
snr4=19.908
Desde el punto de vista objetivo, el método con el que hemos obtenido mejor relación señal-ruido es la **Estimación 4**.
Desde el punto de vista subjetivo, cualquiera de las dos estimaciones del **Modelo 2** se escuchan mejor que las dos primeras, ya que al escuchar dichos archivos el ruido es mayor en las dos primeras.
Práctica 2: Verificación de Hipótesis de Distribución
1. Descripción del Problema
Vamos a considerar el valor de las muestras de una señal como una variable aleatoria continua donde una muestra m puede tomar cualquier valor real −inf < m < inf. Después de realizar el experimento aleatorio consistente en la generación de muestras de dicha señal, hemos obtenido los datos experimentales contenidos en el fichero “muestras”. Deseamos verificar si alguna de las dos hipótesis siguientes es aceptable:
1. ¿Es una hipótesis aceptable que los datos experimentales se ajustan a una función de densidad de probabilidad Laplaciana, con varianza igual a la determinada a partir de los datos experimentales?
La forma de una distribución Laplaciana es:
con y media cero.
2. ¿Es una hipótesis aceptable que los datos experimentales se ajustan a una función de densidad de probabilidad Gaussiana, con media y varianza iguales a las determinadas a partir de los datos experimentales? La forma de una distribución Gaussiana es:
donde μ es la media y σ² es la varianza.
2. Aproximación Gráfica Inicial
Podemos inicialmente ver qué hipótesis es la más probable realizando una verificación gráfica de la PDF aproximada que se deriva de los datos y la PDF de la hipótesis. Para ello se va a usar el comando hist
. Este comando nos proporciona un histograma i
en una serie de intervalos (i = 1,…,n) a partir de las realizaciones de la variable aleatoria del fichero “muestras”. Obtener dicho histograma para n = 50 intervalos de la variable aleatoria y normalizar el histograma por el número total de realizaciones. La razón de la normalización es facilitar la comparación del histograma con la PDF correspondiente. Los intervalos tomados para el histograma están centrados en los puntos xi (i = 1,2,…,50) y tienen un ancho δx que puede obtenerse como la distancia entre 2 centros consecutivos (xi, xi−1). El histograma normalizado i
es una aproximación a la probabilidad.
Lo que puede aproximarse (para δx pequeño) como
2.1. Obtención y Superposición de PDFs
1. Obtener los valores aproximados de la PDF a partir del histograma como fx(xi)= i/δx y superponer la gráfica resultante con la PDF Gaussiana y la PDF Laplaciana.
¿Cuál de ellas se ajusta mejor?
2.2. Código MATLAB para la Aproximación Gráfica
% Guardamos en la variable s el fichero de muestras del experimento
% aleatorio
f=fopen('muestras');
s=fread(f,'single');
% Función de Densidad de Probabilidad
% Histograma del vector leído
[,x]=hist(s,50);
% Dividimos entre el número total de muestras para calcular la probabilidad
p=./length(s)
% Calculamos el ancho de cada intervalo, calculando la diferencia
% entre 2 centros consecutivos.
ax=x(2)-x(1)
% Calculamos la PDF dividiendo las probabilidades entre el ancho anterior calculado
pdf=p./ax
% Representamos la PDF
figure(1)
plot(x,pdf,'g'),title('pdf')
hold off
% Función de Densidad de Probabilidad Laplaciana
% La alfa se relaciona con la varianza de la siguiente forma:
alfa=sqrt(2/var(s))
% Definimos la función Laplaciana
laplaciana=(alfa/2)*exp(-alfa.*abs(x))
% Representamos la función Laplaciana en rojo
figure(2)
plot(x,laplaciana,'r'),title('funcion laplaciana')
hold off
% Función de Probabilidad Gaussiana
% Asignamos a la variable media la media de las muestras
media=mean(s)
% Definimos la función Gaussiana
gausiana=(exp(-(x-media).^2/2*var(s)))/sqrt(2*pi*var(s))
% Representamos la función Gaussiana en azul
figure(3)
plot(x,gausiana,'b'),title('funcion gaussiana')
hold off
% Representamos las 3 PDF en una misma gráfica
figure(4)
plot(x,pdf,'g',x,laplaciana,'r',x,gausiana,'b'),legend('pdf de la señal','pdf laplaciana','pdf gausiana')
hold off
Las representaciones gráficas obtenidas son las siguientes:
Si observamos las gráficas obtenidas tomando 50 intervalos, la aproximación de la PDF que más se ajusta a la PDF experimental es la PDF Gaussiana; por el contrario, la PDF Laplaciana dista bastante. Por tanto, gráficamente podemos determinar que nuestra distribución se corresponde con una distribución Gaussiana.
Tabla de Valores de la PDF Aproximada
x | |
-4,6092 | 2,09e-05 |
-4,4321 | 4,18e-05 |
-4,2550 | 8,37e-05 |
-4,07796 | 6,27e-05 |
-3,9008 | 0,00012549 |
-3,72380 | 0,00035556 |
-3,546 | 0,0006902 |
-3,36964 | 0,00127583 |
-3,19256 | 0,00223793 |
-3,0154 | 0,00445495 |
-2,8383 | 0,00700661 |
-2,66131 | 0,01100142 |
-2,48423 | 0,01827993 |
-2,30715 | 0,02668787 |
-2,13007 | 0,04063834 |
-1,95299 | 0,05887644 |
-1,77590 | 0,08098387 |
-1,59882 | 0,10947044 |
-1,42174 | 0,14565384 |
-1,24466 | 0,18411699 |
-1,06758 | 0,22912662 |
-0,89050 | 0,27367611 |
-0,71342 | 0,30824903 |
-0,53633 | 0,34727689 |
-0,35925 | 0,37557523 |
-0,18217 | 0,38774791 |
-0,00509 | 0,39971144 |
0,171986 | 0,3899231 |
0,34906 | 0,37377652 |
0,52614 | 0,35022594 |
0,70323 | 0,31084252 |
0,88031 | 0,26807082 |
1,05739 | 0,22969133 |
1,234475 | 0,18758892 |
1,41155 | 0,14839373 |
1,5886 | 0,11390448 |
1,76571 | 0,08336821 |
1,942 | 0,06029868 |
2,11988 | 0,04149587 |
2,2969 | 0,02840292 |
2,47404 | 0,01861458 |
2,6511 | 0,01160797 |
2,82820 | 0,00723668 |
3,00528 | 0,0043922 |
3,18237 | 0,00299088 |
3,35945 | 0,00144315 |
3,53653 | 0,00062746 |
3,71361 | 0,00046014 |
3,8906 | 0,00023007 |
4,0677 | 0,00010458 |
3. Test Formal de Hipótesis (Chi-Cuadrado)
La aproximación gráfica inicial nos sirve para acotar el número de PDFs sobre las que realizar el test de hipótesis formal. En nuestro caso, y aunque de la aproximación gráfica ya se pueda inferir cuál de las 2 hipótesis tiene más posibilidades de verificarse, aun así se va a realizar el test chi-cuadrado (χ²) descrito en clase para las 2 hipótesis y así confirmar formalmente las conclusiones derivadas de la aproximación gráfica. Utilice las tablas `tablaxi2a` y `tablaxi2b`, donde `k` son los grados de libertad de la variable chi-cuadrado (v en la notación de las tablas indicadas). La relación entre `k` y el número de intervalos disjuntos `k0` en que hemos de particionar el espacio de muestreo Sx = (−inf,+inf) viene dada por k = k’− 1 − r, donde `r` es el número de parámetros que han sido determinados a partir de datos experimentales en la PDF que queremos verificar.
3.1. Código MATLAB para el Test Chi-Cuadrado
% Test formal
% Vamos a establecer 30 intervalos equiprobables.
% Para ello, ordenamos el vector de muestras de menor a mayor
% con la función sort
vord=sort(s);
% Creamos una matriz de límites
lim=[];
% Al extremo superior del último intervalo le vamos a asignar
% el valor de infinito, y al extremo inferior del primer intervalo
% le asignamos -inf, para trabajar sobre toda la recta real.
lim(1)=-inf;
lim(31)=inf;
% Buscamos el punto medio de todos los intervalos
% y lo almacenamos en la lista de límites
for
i=1:29
lim(i+1)=(vord(i*9000)+vord(i*9001))/2;
end
% Distribución Laplaciana
% Número de intervalos
n=30;
% Definimos x como una variable simbólica
syms x;
% Definimos la función de una distribución Laplaciana
laplaciana=(alfa/2)*exp(-alfa*abs(x));
% Inicializamos variable donde almacenamos distorsión Laplaciana
disl=0;
% Bucle que crea un vector con las probabilidades de los 30 intervalos
% para la distribución Gaussiana
for
k=1:n
% Vector de probabilidades para la distribución Gaussiana
probl(k)=double(int(laplaciana,lim(k),lim(k+1)));
% Calculamos la distorsión para el caso de la Gaussiana
disl=disl+((9000-(270000*probl(k)))^2)/(270000*probl(k));
end
% Distribución Gaussiana
% Definimos x como una variable simbólica
syms x;
% Definimos la función de una distribución Laplaciana
gausiana=exp(-((x-media)^2)/(2*var(s)))/(sqrt(2*pi*var(s)));
% Inicializamos la variable donde almacenamos la distorsión Laplaciana
disg=0;
% Vector de probabilidades para la distribución Laplaciana
for
k=1:n
probg(k)=double(int(gausiana,lim(k),lim(k+1)));
% Calculamos d^2 para el caso de la Laplaciana
disg=disg+((9000-(270000*probg(k)))^2)/(270000*probg(k));
end
% Devolvemos vector de probabilidades Laplaciana y Gaussiana
probl;
probg;
% Devolvemos distorsión Gaussiana y Laplaciana
disl;
disg;
3.2. Tabla de Intervalos
k | Intervalos | |
1 | -inf | -1.8222 |
2 | -1.8222 | -1.4896 |
3 | -1.4896 | -1.2731 |
4 | -1.2731 | -1.1044 |
5 | -1.1044 | -0.9644 |
6 | -0.9644 | -0.8417 |
7 | -0.8417 | -0.7286 |
8 | -0.7286 | -0.6235 |
9 | -0.6235 | -0.5257 |
10 | -0.5257 | -0.4319 |
11 | -0.4319 | -0.3428 |
12 | -0.3428 | -0.2558 |
13 | -0.2558 | -0.1697 |
14 | -0.1697 | -0.0843 |
15 | -0.0843 | -0.0000 |
16 | -0.0000 | 0.0826 |
17 | 0.0826 | 0.1673 |
18 | 0.1673 | 0.2540 |
19 | 0.2540 | 0.3405 |
20 | 0.3405 | 0.4313 |
21 | 0.4313 | 0.5240 |
22 | 0.5240 | 0.6229 |
23 | 0.6229 | 0.7273 |
24 | 0.7273 | 0.8415 |
25 | 0.8415 | 0.9688 |
26 | 0.9688 | 1.1094 |
27 | 1.1094 | 1.2807 |
28 | 1.2807 | 1.4985 |
29 | 1.4985 | 1.8298 |
30 | 1.8298 | inf |
3.3. Tabla de Probabilidades (Distribución Gaussiana)
Intervalo | Probabilidad |
1 | 0,0337518325584329 |
2 | 0,0337426811562730 |
3 | 0,0332046819905547 |
4 | 0,0331640576790732 |
5 | 0,0326784640901912 |
6 | 0,0325644685476501 |
7 | 0,0331515943521773 |
8 | 0,0333901059853964 |
9 | 0,0331451432698851 |
10 | 0,0334240204848963 |
11 | 0,0330413231360093 |
12 | 0,0332397110833122 |
13 | 0,0336625984599466 |
14 | 0,0339011034647270 |
15 | 0,0336630630121833 |
16 | 0,0330399274379861 |
17 | 0,0336040781241257 |
18 | 0,0339356669801157 |
19 | 0,0330907023855498 |
20 | 0,0337095670486594 |
21 | 0,0330635588723258 |
22 | 0,0335454701022795 |
23 | 0,0332258881331427 |
24 | 0,0335369250782934 |
25 | 0,0337503631224946 |
26 | 0,0327100184780547 |
27 | 0,0334672351469967 |
28 | 0,0330807587434817 |
29 | 0,0332303835684471 |
30 | 0,0332846075073385 |
3.4. Tabla de Probabilidades (Distribución Laplaciana)
Intervalo | Probabilidad |
1 | 0,0377100300973726 |
2 | 0,0227326702454530 |
3 | 0,0217259131123053 |
4 | 0,0222229878233864 |
5 | 0,0229270362270100 |
6 | 0,0242119812847763 |
7 | 0,0263549556558574 |
8 | 0,0285941028675144 |
9 | 0,0307462461052962 |
10 | 0,0337570484227637 |
11 | 0,0365037188820241 |
12 | 0,0403571313435910 |
13 | 0,0451862117224353 |
14 | 0,0506429186939219 |
15 | 0,0563058130229352 |
16 | 0,0553228822058929 |
17 | 0,0503211419188233 |
18 | 0,0456557637705647 |
19 | 0,0402505731341540 |
20 | 0,0372780002640454 |
21 | 0,0334057034895904 |
22 | 0,0311246764952672 |
23 | 0,0284478980100655 |
24 | 0,0266467112012476 |
25 | 0,0250394112701557 |
26 | 0,0228774569660483 |
27 | 0,0223608375284000 |
28 | 0,0216005210438973 |
29 | 0,0223819703834947 |
30 | 0,0373076868117103 |
3.5. Resultados del Test Chi-Cuadrado
Calculamos los grados de libertad con la siguiente fórmula: k=k’−1−r
Hipótesis Laplaciana:
Para este caso tenemos que k = 30−1−1 = 28.
El parámetro `r` vale 1, ya que para este caso solo hemos determinado 1 parámetro a partir de los datos experimentales: la varianza. `k’` es el número de intervalos, es decir, 30.
Nos vamos a la tabla proporcionada, a la fila 28. La columna depende del grado de exigencia que tomemos; nosotros vamos a tomar un grado de exigencia α=0.02. El valor de la tabla es 45.419.
Nuestra distribución Laplaciana calculada en la práctica era:
2.5722×104
Por tanto, podemos decir que la distribución de nuestras muestras no se ajusta a una distribución Laplaciana.
Hipótesis Gaussiana:
Para este caso tenemos que k = 30−2−1 = 27.
El parámetro `r` vale 2, ya que para este caso hemos determinado 2 parámetros a partir de los datos experimentales: la varianza y la media.
Por tanto, debemos mirar en la fila 27 de la tabla proporcionada. El grado de exigencia es el mismo que el anterior tomado α=0.02. El valor de la tabla es 44.140.
Nuestra distribución Gaussiana calculada en la práctica era:
29.8276
Con lo cual la hipótesis basada en la variable Gaussiana no es muy buena, aunque mejor que la Laplaciana.
3.6. Conclusión del Test
Podemos concluir que la hipótesis que más se aproxima, tanto gráfica como analíticamente, es la Gaussiana.
Práctica 3: Caracterización de Procesos Aleatorios
Primera Parte: Caracterización de Variables Conjuntamente Gaussianas
- a) En el fichero
gaussdim8
tiene mil realizaciones de una variable vectorial Gaussiana de dimensión 8. - b) Determine el vector de medias `m` y la matriz de covarianza `K` de dicha variable vectorial Gaussiana a partir de las mil realizaciones.
Matriz de Covarianza
Vector de Medias
- c) ¿Son independientes entre sí las 8 variables?
No son independientes, pues la matriz de covarianzas tendría que ser diagonal.
- d) Si no son independientes entre sí, encuentre una transformación lineal `A` de la variable vectorial `x` que dé lugar a otra variable aleatoria vectorial Gaussiana y cuyas variables sean independientes entre sí. Para ello, utilice la función
eig
de MATLAB. Dicha función, al aplicarla sobre una matriz simétrica `K`, nos devuelve una matriz `B` que contiene los autovectores de `K` y una matriz diagonal `D` que contiene los autovalores de `K`, `[B,D] = eig(K)`, verificándose que BTKB = D. Determine las medias y las varianzas de las 8 nuevas variables Gaussianas independientes.
Diagonalizamos y obtenemos los siguientes resultados para el vector de medias y matriz de covarianza.
Matriz de Covarianza Final
Vector de Media Final
Código Fuente en MATLAB:
% Primera Parte: Caracterización de variables conjuntamente Gaussianas.
% Cargamos y leemos los archivos
f1=fopen('gaussdim8','r');
s=fread(f1,'single');
% Matriz de datos (columnas = variables, filas = realizaciones de cada
% variable)
% Inicializamos matriz a cero
realizaciones=zeros(mil,8);
% Bucle que almacena por filas las realizaciones de cada variable
for
i=1:mil
for
j=1:8
realizaciones(i,j)=s((i-1)*8+j);
end
end
% Medias de cada variable
% Inicializamos vector de medias
media=zeros(1,8);
% Bucle que almacena en un vector (media) las medias de cada variable
for
j=1:8
for
i=1:mil
media(j)=media(j)+realizaciones(i,j)/mil;
end
end
% Normalizamos el vector media
media=media/mil;
% Matriz de covarianzas
% Inicializamos dicha matriz
cov=zeros(8,8);
% Bucle que calcula la covarianza y la va almacenando en cada posición de la
% matriz
for
j=1:8
for
i=1:8
for
l=1:mil
cov(i,j)=cov(i,j)+((realizaciones(l,j)-media(j))*(realizaciones(l,i)-media(i)));
end
end
end
% Normalizamos la matriz de covarianzas
cov=cov/mil;
% Diagonalizamos la matriz de covarianza para convertir las 8 variables
% Gaussianas en independientes
diag=eig(cov);
covfinal=b'*cov*b;
mediafinal=b'*media';
Segunda Parte: Procesos Aleatorios
- a) En el fichero
signal1
se encuentran 2000 realizaciones de un muestreo en 128 instantes de tiempo de un proceso aleatorio Gaussiano x(n) discreto en el tiempo. - b) Determine la media mx(n) y la función de autocorrelación rx(n1, n2) de dicho proceso aleatorio a partir de las 2000 realizaciones que tiene del proceso aleatorio.
Código Fuente en MATLAB:
% Segunda Parte: Procesos aleatorios.
% Eliminamos todas las variables anteriormente creadas
clear all
% Leemos y cargamos el fichero signal1
f1=fopen('signal1','r');
s1=fread(f1,'single');
% Construimos la matriz de datos
matriz=zeros(2000,128);
for
i=1:2000
for
j=1:128
matriz(i,j)=s1((i-1)*128+j);
end
end
% Calculamos la media de las 2000 realizaciones de cada instante
mx=zeros(1,128);
for
j=1:128
for
i=1:2000
mx(j)=mx(j)+matriz(i,j);
end
end
mx=mx/2000;
% Construimos los vectores de autocorrelación para diferencia de tiempo = 0, 1, 2
for
v=1:1:128
rx0(v)=(1/2000)*sum(matriz(:,v).*matriz(:,v));
if
v<128
rx1(v)=(1/2000)*sum(matriz(:,v).*matriz(:,v+1));
if
v<127
rx2(v)=(1/2000)*sum(matriz(:,v).*matriz(:,v+2));
end
end
end
% Representamos la función de autocorrelación para los distintos tiempos
figure;
plot(rx0)
figure;
plot(rx1)
figure;
plot(rx2);
Media mx(n)
0.0012 0.0231 0.0114 0.0071 0.0010 0.0342 0.0376 0.0435 0.0149 0.0211 0.0363
0.0139 0.0296 0.0071 0.0147 0.0454 0.0259 0.0485 0.0799 0.1255 0.1286 0.1490
0.1585 0.1296 0.1067 0.0757 0.0749 0.1019 0.1098 0.1338 0.0892 0.1108 0.0718 0.0805
0.0109 -0.0114 -0.0364 -0.0175 -0.0313 0.0062 -0.0256 -0.0348 -0.0299 -0.0177 -0.0168
-0.0231 -0.0414 -0.0314 -0.0360 -0.0203 -0.0142 -0.0300 0.0062 0.0377 0.0178 0.0122
0.0111 0.0268 0.0400 0.0535 0.0421 0.0425 0.0565 0.0663 0.0223 0.0156 0.0016
0.0286 0.0156 -0.0033 0.0085 0.0286 0.0587 0.0586 0.0878 0.0728 0.0720 0.0822
0.0452 0.0585 0.0466 0.0621 0.0847 0.0796 0.0740 0.0549 0.0537 0.0610 0.0857
0.0828 0.0788 0.0625 0.0793 0.0682 0.0664 0.0622 0.0601 0.0373 -0.0364 -0.0454
-0.0396 -0.0196 -0.0206 -0.0368 -0.0137 -0.0341 -0.0402 -0.0306 -0.0132 0.0051 0.0070
0.0167 0.0065 -0.0026 -0.0127 -0.0234 0.0004 -0.0236 -0.0209 -0.0042 -0.0449 -0.0500
-0.0677 -0.0126 -0.0456 -0.0431 -0.0593 -0.0840
¿Es razonable afirmar que es un proceso estacionario en sentido amplio?
Las medias son aproximadamente iguales y próximas a cero.
Y observando las gráficas, apreciamos que la función de autocorrelación se mantiene constante mientras la diferencia de tiempo sea igual.
Por lo tanto, podemos afirmar que es un proceso estacionario en sentido amplio.
- c) En el fichero
signal1erg
se encuentra una única realización del mismo proceso aleatorio, pero del que hemos tomado ahora un muestreo en 128000 instantes de tiempo. Determine la media temporal mt y la función de autocorrelación temporal rt(k) de dicha realización. ¿Es razonable afirmar que el proceso aleatorio es ergódico en la media y en la autocorrelación?
Código en MATLAB
% Eliminamos de nuevo todas las variables para este apartado
clear all
% Leemos y cargamos el fichero signal1erg
f=fopen('signal1erg','r');
s=fread(f,'single');
mediat=0;
% Bucle que calcula la media temporal
for
i=1:128000
mediat=mediat+s(i);
end
mediat=mediat/128000;
% Calculamos la autocorrelación para 256 valores
rtk=zeros(1,256);
for
i=0:255
for
j=1:128000-i
rtk(i+1)=rtk(i+1)+s(j)*s(j+i);
end
end
rtk=rtk/128000;
Calculamos la media temporal y obtenemos que es igual a 0.0429
Tabla de la Función de Autocorrelación
- d) Si la pregunta anterior ha sido afirmativa, utilice la función rt(k) para determinar la densidad de potencia espectral Sx(f) del proceso aleatorio. Represente Sx(f) frente a la frecuencia en Hz, teniendo en cuenta que el proceso aleatorio corresponde a una señal muestreada a 8 kHz.
Código Fuente en MATLAB
% Transformada de Fourier de la función de densidad de potencia espectral
ft=fft(rtk,256);
% Intervalo de frecuencias
f=4000*((0:127)/128);
% Representamos la densidad de potencia espectral
plot(f,10*log10(abs(ft(1:128))));