No BSD License  

Highlights from
BPSK Simulator for Low Rate Transmisions

image thumbnail
from BPSK Simulator for Low Rate Transmisions by César Delgado González
BPSK Simulator for didactical purposes. Systemic coding style.

representaFiltro(filtro, frec, RollOff, Orden, Bw, paramPLL, color)
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 at files@mathworks.com