Simulación de filtros FIR Celda en VHDL y su implementación en un FPGA Apéndice F APÉNDICE F. Listado en Matlab clear, clc, close all, format short %-----Progama para cálculos los coeficientes Celda %-----Nombre del programa: coef_LatticeFILT.m num = [1 -2.45 1.3795 -.5335 .1131]; den=[1]; clc, op=1; while op==1 fprintf('OPCIONES\n'); fprintf(' [1] Mostrar Datos Iniciales\n [2] Mostrar Coeficientes FIR Celda\n'); fprintf(' [3] Modificar Datos\n [4] Recorvertir La Función\n [5] Salir\n'); fil=input('¿Qué elijes?: '); switch fil case {1} clc, disp('Numerador');disp(num) disp('Denominador');disp(den) case {2}, FIR_latfil(num); case {3}, clc fprintf('\nFormato de los datos: [D1 D2z^-1 D3z^-2... Dnz^-(n-1)]\n'); num=input('\n ¿Cuál es la función?: '); clc case {4}, num=reconvertir(num); case {5}, op=0;o_p=0; otherwise fprintf('\tSólo una de estas opciones\n'); pause(2) end end fprintf('\t\t\tA D I O S\n'); Tabla 17. Programa del cálculo de coeficientes. function FIR_latfil(num) %-----Programa que regresa el calculo de los coeficientes y enseña el resultado en punto flotante clc fprintf('\n\t\t\tF I L T R O F I R\n\n'); disp('COEFICIENTES') m=size(num); n=m(1,2); num=tf2latc(num) for i=1:n-1 fprintf('\t\t\tk(%d)= %1.4f\n',i,num(i,1)); coe2i754(i,:)= mimetodo(num(i,1)); fprintf('Binario\t\t%s \n\n',coe2i754(i,:)); end Tabla 18. Función latfil. function NUM = mimetodo(nu) NUM=0;nu2=nu;lman=6;nn=0; S=dec2bin(0);MAN=dec2bin(0,10); %-----Chequeo if nu<0 || nu==-inf S=dec2bin(1); end if abs(nu)==inf indx=16; elseif isnan(nu)==1 indx=16; MAN=dec2bin(rand(1)*1e3,7); elseif nu==0 indx=-15; else 69 Simulación de filtros FIR Celda en VHDL y su implementación en un FPGA Apéndice F if abs(nu)>0 && abs(nu)<=1 nu2=nu; con2=0; while abs(nu2)<1 nu2=nu2*2; con2=con2-1; end indx=con2; nu3=abs(nu2)-1; for i=1:lman nu3=nu3*2; if nu3<1 nn(i)=0; else nu3=nu3-1; nn(i)=1; end end MAN=num2str(nn,'%g'); else %parte entera nu2=abs(nu); con=1; while fix(nu2) ~= 1 && fix(abs(nu))>1 if mod(fix(nu2),2)==0 nn(con)=0; else nn(con)=1; end nu2=fix(nu2)/2; con=con+1; end nn=fliplr(nn); indx=con-1; %parte flotante nu3=abs(nu) - fix(abs(nu)); con2=con; for i=con2:lman nu3=nu3*2; if nu3<1 nn(con2)=0; else nu3=nu3-1; nn(con2)=1; end con2=con2+1; end MAN=num2str(nn,'%g'); end end expon=[indx+15]; EX=dec2bin(expon,5); NUM=[S EX MAN]; ndec=bin2dec(NUM); NHEX=dec2hex(ndec); fprintf('Sig\t Exp\t Mantisa\t Hex\t Decimal\n'); fprintf('%1s\t %5s\t %6s\t\t %4s\t %0d\n',S,EX,MAN,NHEX,ndec); Tabla 19. Función mimetodo. function num=reconvertir(num) %-----Programa que regresa de coeficientes Celda a función de transferencia clc fprintf('\n\t\t\tP O L I N O M I O\n\n'); num=latc2tf(num); m=size(num); n=m(1,2); fprintf('\t'); for i=1:n fprintf('%1.4f\t',num(i)); end fprintf('\n\n'); Tabla 20. Función reconvertir. 70