clc
clear
close all


fileID_a = fopen('LPC_Caliente.txt'); %cargar el archivo de texto de LPC
filas = load ('Filas_Caliente.txt');
columnas = 15;
formatSpec = '%d %f';
sizeA = [filas columnas];
AudioP = load ('Caliente.txt');


S3 = fscanf(fileID_a,formatSpec,sizeA);
bb = S3;

%input('press')
%---------------------------------------------------------------------------%
%Cargar nuevo audio de comparacion y hacer su LPC
%---------------------------------------------------------------------------%

t_end = 3;
Fsc = 50000;
nBits = 24;
Nchannel = 1;
Gain = 1024;
nm = Fsc*30e-3;
Noise_level = 1500;
nbits = 2^14;
Offset = 2047;


recObj = audiorecorder(Fsc, nBits, Nchannel);%comando para declarar la grabacion de voz
recObj.StartFcn = 'disp('' Start speaking '')';%mensaje para a grabar voz


input('Press to record voice');%input para empezar grabar voz
recordblocking(recObj, t_end);%comando para grabacion
disp('End of recording. Playing back ...');%mensaje para terminar grabacion
Audio = Gain*(getaudiodata(recObj)) + Offset;%comando para terminar grabacion
fileID =  fopen('Comparar.txt','w');% comando para crear archivo de texto de formato de escritura
fprintf(fileID, '%d\n', Audio);%se sobre escribe en el archivo txt los datos de audio obtenidos, se usa el %d para que cada dato ocupe una fila
fclose(fileID);%se cierrar la escritura en el archivo de texto
%play(recObj)% reproduccion del audio obtendio
%plot(Audio)%graficacion del audio

AudioC = load ('Comparar.txt'); %cargar el archivo de texto

% figure('Name','Señales de voz a comparar')
% subplot(2,1,1),plot(AudioC),title('Señal de Voz a Comparar'),xlabel('Numero de muestras'),ylabel('Amplitud de las muestras'),grid
% subplot(2,1,2),plot(AudioP),title('Señal de Voz de referencia'),xlabel('Numero de muestras'),ylabel('Amplitud de las muestras'),grid

%input('Press to continue');%input para empezar grabar voz

jj = 0;
S = zeros(1,Fsc*t_end); %Vector donde se guarda la Señal de Voz de entrada
for i = 1:1:Fsc*t_end
    S(i) = AudioC(i,:);%creacion vector que tendra los archivos de audio
end

N = length(S);

%[Ns, Ssr, Eav, E] = Eliminacion(S, N, nm);%funcion de elminiacion
[Ssr, longPal] = detectorExtremos(S);


Ns = length(Ssr);



%regla de 3 con el tiempo de grabación
%Fs = 50e3; %Frecuencia de muestreo a utilizar, para este caso la voz.
To = N/Fsc; %Tiempo de grabación-> Señal de Entrada
Tg = Ns*To/N; %Tiempo de grabación-> Señal recortada

[Spp] = Pre_enfasis(Ssr,Ns);

scrsz = get(0,'ScreenSize');

figure('Name','Señal de Voz completa y Recortada','Position',[0 48 scrsz(3) scrsz(4)/1.205])
subplot(3,1,1),plot(S),title('Señal de Voz'),xlabel('Numero de muestras'),ylabel('Amplitud de las muestras'),grid
subplot(3,1,2),plot(Ssr),title('Señal de Voz sin ruido'),xlabel('Numero de muestras'),ylabel('Amplitud de las muestras'),grid
subplot(3,1,3),plot(Spp),title('Señal de Voz filtrada por preenfasis'),xlabel('Numero de muestras'),ylabel('Amplitud de las muestras'),grid

x = fix(Ns/nm);
y = 15;
%primera posible solucion
%x = filas/2;

a = zeros(2*x,y);
aj = zeros(1,y);
aj1 = zeros(1,y);

%aj1=0;
for j=1:x
    
 [Sw,Swc,Seg] = Segmentacion(j,Spp,nm, nbits);
 [rxx0, rxx1, Swn, Swcn, auto] = Autocorrelacion(nm, Sw, Swc);
 m = length(rxx0);
 b = (2*j)-1;
 v = (2*j);
 rxx0b = rxx0(m:-1:1);
 a(b,1) = fix(rxx0(2)/(rxx0(1)/8));
 Ki = fix(rxx0(2)/(rxx0(1)/8));
 f1=4096;
 rxx1b = rxx1(m:-1:1);
 a(v,1) = fix(rxx1(2)/(rxx1(1)/8));
 Ki1 = fix(rxx1(2)/(rxx1(1)/8));
 for i = 2:m-1
     Ni = rxx0(i+1)-(rxx0b(i))'*Ki;
     Di = rxx0(1)-(rxx0(i))'*Ki;
     Ki = ceil(Ni/floor(Di/f1));
     
     Ni1 = rxx1(i+1)-(rxx1b(i))'*Ki1;
     Di1 = rxx1(1)-(rxx1(i))'*Ki1;
     Ki1 = ceil(Ni1/floor(Di1/f1));
     for h = 1:i-1
         aaj = floor((Ki*a(b,i-h))/f1);
         aj(h) = (a(b,h))-aaj;
         aj(i) = Ki;
         aaj1 = floor((Ki1*a(v,i-h))/f1);
         aj1(h) = (a(v,h))-aaj1;
         aj1(i) = Ki1;
     end
     a(b,:) = aj;
     a(v,:) = aj1;
 end 
end




% figure('Name','Hamming')
% subplot(3,1,1),plot(Spp),xlim([0 1500]),title('Segmento de la señal de voz'),xlabel('Numero de muestras'),ylabel('Amplitud'),grid
% subplot(3,1,2),plot(Sw),title('Segmento con enventanado Normal'),xlabel('Numero de muestras'),ylabel('Amplitud'),grid
% subplot(3,1,3),plot(Swc),title('Segmento con enventanado complementario'),xlabel('Numero de muestras'),ylabel('Amplitud'),grid
% 
l=0;

lpc=zeros(1,2*x*y);
for i = 1:1:2*x
    for k = 1:1:y
        l=l+1;
        lpc(l) = a(i,k);
    end
end

[m,n] = size(a);

% scrsz = get(0,'ScreenSize');
% figure('Name','Coeficientes','Position',[0 420 scrsz(3) scrsz(4)/1.205])
% plot(lpc,'-o','MarkerFaceColor','r'),title('Coeficientes LPC SEÑAL DE VOZ 1'),xlabel('Número de Segmentos'),ylabel('Amplitud de los Coeficientes'),grid
%    
% 
% figure('Name','LPC')
% plot(lpc,'-o','MarkerFaceColor','r'),xlim([0 15]),title('Coeficientes LPC'),xlabel('Número de Coeficientes'),ylabel('Amplitud de los Coeficientes'),grid
aa = a;



if filas > m
    for i=m+1:1:filas
        for k=1:1:columnas
           aa(i,k) = 0; 
        end
    end
end

%---------------------------------------------------------------------------%
%--------------------Coerralacion de Pearson-------------------------------
%---------------------------------------------------------------------------%

Ccp = zeros(1,filas);%se usa el tamaño de x como referencia, por tanto es el nuevo audio o viejo a usar como mejor opcion?
x1 = zeros(1,y);
y1 = zeros(1,y);

for i=1:filas
    for j=1:y 
    x1(j) = bb(i,j);%cada fila de valores 
    y1(j) = aa(i,j);%cada fila de valores 
    end
    
xm1=(mean(x1)); %xm1=fix(mean(bb(i,:))); Hace el valor promedio de cada fila para cada arregloe aa y bb que se pasaron a x1 y y1
ym1=(mean(y1)); %ym1=fix(mean(aa(i,:))); Hace el valor promedio de cada fila para cada arregloe aa y bb que se pasaron a x1 y y1

% Covarianza y Desviación Estándar
Sxy1 = 0;
vx1 = 0;
vy1 = 0; 

    for k = 1:1:y
        xiXm = x1(k)-xm1;
        yiYm = y1(k)-ym1;
        Sxy1 =Sxy1+(floor(xiXm/y)*yiYm);%Ecuanción de Covarianza
        vx1 = vx1 + xiXm^2; %Ecuación de Varianza
        vy1 = vy1 + yiYm^2;
    end
dx1 = fix(sqrt(vx1)/(y-1)); %Ecuación de Desviación Estándar 
dy1 = fix(sqrt(vy1));       %Ecuación de Desviación Estándar        
dxdy1 = dx1*dy1;
Ccp(i) =fix((Sxy1)/(dxdy1/nbits));
%*+*+*+Datos para Quartus II*+*+*+ -> Para crear las memorias ROM 
    %for q = 1:1:y
    %    Xm(i,q)=floor((x1(q)-xm1)/y); %Resta para el cálculo de la covarianza entre elc omando end
    %end
D(i)=floor(sqrt(vx1)/(y-1)); %Desviación estandar del comando de referencia 
end
c=0; %cantidaddecoeficientesquesuperanelumbraldeigualdad 
for u = 1:filas
    if Ccp(u) >= 15291
        c=c+1;
    end
end
 
porcen=c*100/(filas); %Porcentaje de Coeficientes de Pearson que superan el umbral de comparación 

if porcen > 94
disp('Comando Válido')
else
disp('Comando NO Válido')
end

name = 'con un porcentaje de ';
X = [name , num2str(porcen)];
disp(X)

% figure('Position',[0 48 scrsz(3) scrsz(4)/1.205])
% plot(Ccp,'-o','MarkerFaceColor','y'),title('Coeficientes de Correlación de Pearson'),xlabel('Número de Coeficientes de Pearson'),ylabel('Amplitud de los Coeficientes'),grid
%  
% format long
% fileIDCcp =  fopen('Ccp.txt','w');% comando para crear archivo de texto de formato de escritura
% fprintf(fileIDCcp, '%d\n', Ccp);%se sobre escribe en el archivo txt los datos de audio obtenidos, se usa el %d para que cada dato ocupe una fila
% fclose(fileIDCcp);
