No BSD License  

Highlights from
BPSK Simulator for Low Rate Transmisions

image thumbnail

BPSK Simulator for Low Rate Transmisions

by

 

01 Jun 2004 (Updated )

BPSK Simulator for didactical purposes. Systemic coding style.

representaFiltro.m
function retardo = representaFiltro(filtro, frec, RollOff, Orden, Bw, paramPLL, color)
%------------------------------------------------------------------------
%|  representaFiltro(filtro, frec, RollOff, Orden, Bw, paramPLL)
%------------------------------------------------------------------------
%|    Funcin que realiza lanza una ventana con las caracteristicas
%|  de un determinado filtro.
%|
%|       NO REALIZA VALIDACIN DE PARMETROS DE ENTRADA
%|
%|    Entradas:
%|       1.- FILTRO= entero que especifica el filtro a emplear:
%|                   1 = filtro coseno alzado
%|                   2 = filtro banda base
%|                   3 = filtro de portadora (FI).
%|                   4 = filtro de continua (DC)
%|                   5 = Ganancial en lao abierto del PLL.
%|         
%|       2.- FREC = vector fila de 3 elementos [Rb fi fs];  
%|       3.- ROLL_OFF = factor de Roll Off del coseno alzado.
%|       4.- ORDEN = vector fila de dos elemetos [Orden BB,Orden FI]
%|       5.- BW    = vector fila de dos elementos [Bw BB, Bw FI]
%|       6.- PARAM_PLL = vector fila de 3 elementos con los parametros
%|                       del PLL : [Kv wn Psi]
%|       7.- COLOR     = caracter con el color a emplear en el plot
%|                   
%-------------------------------------------------------------------------
%   Autor: Cesar Delgado
%   Fecha: 19-Abril-2.004
%-------------------------------------------------------------------------

fs = frec(3);
Rb = frec(1);
N  = 2^14; % N muestras de la respuesta impulsiva

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%% CALCULO DE LAS CTES. DE LOS FILTROS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

switch filtro,
    case 1, %%%%%%%%%% FILTRO COSENO ALZADO
        num   = rcosfir(RollOff,[-3 3],round(fs/Rb),1);
        den   = 1;
        Texto = sprintf('Respuesta en Frecuencia del Coseno Alzado: \\alpha = %3.2f Rb = %3.0f [bps]',RollOff, Rb);

    case 2, %%%%%%%%%% FILTRO BANDA BASE
        BwBB  = Bw(1)/frec(3);
        num   = fir1(Orden(1),2*BwBB);
        den   = 1;
        Texto = sprintf('Respuesta en Frecuencia del Filtro Banda Base: Orden = %3.0f Bw = %3.2f (kHz)',Orden(1), Bw(1)*1e-3);

    case 3, %%%%%%%%%% FILTRO FRECUENCIA INTERMEDIA
        BwFI  = [(frec(2) - Bw(2)/2), ...
                 (frec(2) + Bw(2)/2)]*(1/frec(3));
        num   = fir1(Orden(2),2*BwFI);
        den   = 1;
        Texto = sprintf('Respuesta en Frecuencia del Filtro de Portadora:Orden = %3.0f Bw = %3.0f (Hz)',Orden(2), Bw(2));

    case 4, %%%%%%%%%% FILTRO CONTINUA
        BwDC  = 2*frec(2)/frec(3); % fi/fs
        num   = fir1(max(Orden),2*BwDC,'high');
        den   = 1;
        Texto = sprintf('Respuesta en Frecuencia del Filtro de Continua: Orden = %3.0f Bw = %3.2f (kHz)',max(Orden), 2*frec(2)*1e-3);

    otherwise, %%%%%%%%%% FILTRO LEAD LAG DEL PLL

         %>>>>>>> 1.1.- Parametros del PLL
          pKv  = 1;
          pWn  = 2;
          pPsi = 3;
          
          %>>>>>>> 1.2.- Ctes. del Filtro Analogico
          Kd     = 5/(2*pi);
          K      = 2*pi*paramPLL(pKv)*Kd;
          TAU(1) = K/paramPLL(pWn)^2;
          TAU(2) = 2*paramPLL(pPsi)/paramPLL(pWn);        
          
          %>>>>>>> 1.3.- Ctes. del Filtro Digital
          
          cte = 2*fs;
          
          % Numerador [b0 , b1]
          num = [1+cte*TAU(2), 1-cte*TAU(2)]; 
    
          % Denominador [a0 , a1]
          den = [1+cte*TAU(1), 1-cte*TAU(1)];    
    
          % Normalizacin [b0/a0 , bi/a0 , 1 , a1/a0]          
          num   = num./den(1);
          den   = den./den(1); 
          if filtro ==5,
              Texto = sprintf('Respuesta en Frecuencia del Lead-Lag: {\\tau}_1=%3.2f msg. {\\tau}_2 =%3.2f msg.',TAU(1)*1e3, TAU(2)*1e3);      
          else,
              Texto = sprintf('Error de Fases del PLL : Kv= %3.2f kHz/V {\\omega}_n=%3.2f krad/sg. {\\xi} =%3.4f ',paramPLL(pKv)*1e-3, paramPLL(pWn)*1e-3, paramPLL(pPsi) ); 
          end;        
  end;

  
%if nargin > 1,    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% REPRESENTACION DE LA RESPUESTA DE LOS FILTROS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

     % 2.- Calculo de la respuesta Impulsiva
     %--------------------------------------
     imp = [1 zeros(1,N - 1)]; 
     h   = filter(num,den,imp); % Respuesta Impulsive
     if filtro>5, h   = filter(paramPLL(pKv),[1 -1],h); end;
     H   = fftshift(fft(h));
     mod = 10*log10(abs(H));
     fase = (180/pi)*unwrap(angle(H)); 
     H   = fftshift(fft(h));
     mod = 10*log10(abs(H));
     fase = (180/pi)*unwrap(angle(H)); 
     
     % 3.- Calculo de ejes de representacion
     %--------------------------------------
     t = 0:1/fs:(length(h)-1)/fs;                                  
     f  = -fs/2:fs/(N-1):fs/2;
     if (fs > 1e7) & (filtro < 5), 
         eje = f.*1e-6; 
         tituloX = 'Frecuencia (MHz)';
     elseif (fs > 1e4) & (filtro < 5),
         eje = f.*1e-3;
         tituloX = 'Frecuencia (kHz)';
     else,
         tituloX = 'Frecuencia (Hz)';
         eje = f;
     end;
     
     % 4.- Representaciones
     %---------------------
     %  4.1.- Eliminamos Secuencias de Bits de la pantalla
     subplot('position',[0.065, 0.47, 0.6, 0.04]);
     plot(0);
     axis off;
     subplot('position',[0.065, 0.94, 0.6, 0.04]);
     plot(0);
     axis off;
     
     %   4.2.- Respuesta en Amplitud
     enfocaEje([1 1], 1);
     if filtro == 5,
         minimo = min(mod);              
         a = find(mod > minimo*0.99);
         plot(eje(a), mod(a),color);    
     else,
         plot(eje, mod,color);    
     end;  
     
     ylabel('Ganancia (dB)');
     xlabel(tituloX);
     title (Texto,'FontWeight','Bold','FontAngle','Italic');  
     grid on;
     axis tight
     enfocaEje([1 1], 0);
     
     %   4.3.- Respuesta Impulsiva
     enfocaEje([1 1], 3);   
     a = max(find(h>(max(abs(h))/1000)));
     plot(t(1:a),h(1:a),'color',[0    0.5020    0.2510]);          
     xlabel('Tiempo (sg.)');
     ylabel('Amplitud (V)');
     Texto = sprintf('Respuesta Impulsiva');
     title (Texto,'FontWeight','Bold','FontAngle','Italic'); 
     grid on;
     axis tight
     
     %   4.4.- Respuesta de Fase
     enfocaEje([1 1], 4);
     plot(eje, fase, color);
     xlabel(tituloX);
     ylabel('Fase ()');
     Texto = sprintf('Desfase');
     title (Texto,'FontWeight','Bold','FontAngle','Italic');  
     grid on;  
     axis tight
     zoom on;
     
     % else
     %end;
 

Contact us