Low level routine
fr - eng


filter_tap_c - common communication digital filters coefficients computational routine

Module

Parameters

File content


/* filter_tap_c subroutine
 * computation of coefficient of fir filter
 * for Root Raised Cosine function
 *     Raised Cosine function
 *     Gaussian function
 *
 * Copyright (C) 2007-2011 Alan Layec
 *
 * This file is part of modnumlib.
 *
 * modnumlib is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * modnumlib is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with modnumlib; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

/* REVISION HISTORY :
 * $Log$
 */

#include <math.h>

#include "modnum_lib.h"

/* filter_tap_c : calcul des coefficients des
 *                réponses impulsionnelles :
 *            - filtre en racine de cosinus sur-élevé
 *            - filtre en cosinus sur-élevé
 *            - filtre gaussien
 *
 * Entrées :
 * n       : taille du vecteur de sortie
 *           (le nombre de coefficients)
 *
 * typ     : le type de réponse impulsionnelle (scalaire)
 *            1  : rrcf
 *            2  : rcf
 *            3  : gauss
 *
 * ne      : nombre d'échantillons par symbole (scalaire)
 *
 * param   : le facteur de retombée pour typ=1|typ=2 (scalaire)
 *           ou le produit BT pour la cas typ=3
 *
 * Sorties :
 * y       : coefficients de la réponse impusionnelle (vecteur)
 *
 * Dépendances :
 * math.h
 */

void filter_tap_c(int *n,int *typ,int *ne,double *param,double *y)
{
 /*Déclaration des variables compteurs*/
 int i;

 /*Déclaration des variables locales*/
 double d_n;
 double d_ne;
 double t_Ts;
 double r;
 double BT;

 /*convertion des variables entières en variables double*/
 d_n  = (double)(*n);
 d_ne = (double)(*ne);

 /*sélection du type de la fenêtre*/
 switch((*typ))
 {
  /*rrcf*/
  case 1 :  /*récupération du facteur de retombée*/
            r = (*param);

            /*calcul de la valeur des coefficients*/
            for(i=0;i<(*n);i++) {
              /*calcul des valeurs du vecteur t_Ts*/
              /*t_Ts = (1.0/d_ne) * ((double)i - d_n/2.0);*/
              t_Ts = (1.0/d_ne) * ((double)i - d_n/2.0) + 0.5/d_ne;

              /*test limites*/
              if (t_Ts==0.0) {
                y[i] = 1.0 - M_PI/(4.0*r)*(r-1.0);
              }
              else if ((Abs(t_Ts*r))==0.25) {
                y[i] = sqrt(2.0)/8.0 *\
                        ((M_PI * cos(M_PI/(4.0*r)) + M_PI * sin(M_PI/(4.0*r)))\
                         + 2.0*(sin(M_PI/(4.0*r)) - cos(M_PI/(4.0*r))));
              }
              else {
                y[i] = (cos((1.0+r)*M_PI*t_Ts) + sin((1.0-r)*M_PI*t_Ts)/ \
                        (4.0*r*t_Ts))/ \
                         (1.0-(4.0*r*t_Ts)*(4.0*r*t_Ts));
              }
              /**/
              y[i] = 4.0*((r/M_PI) * y[i]);
            }
            break;

 /*rcf*/
  case 2 :  /*récupération du facteur de retombée*/
            r = (*param);

            /*calcul de la valeur des coefficients*/
            for(i=0;i<(*n);i++) {
              /*calcul des valeurs du vecteur t_Ts*/
              /*t_Ts = (1.0/d_ne) * ((double)i - d_n/2.0);*/
              t_Ts = (1.0/d_ne) * ((double)i - d_n/2.0) + 0.5/d_ne;

              /*test limites*/
              if (t_Ts==0.0) {
                y[i] = cos(M_PI*r*t_Ts)/\
                        (1.0 - (2.0*r*t_Ts)*(2.0*r*t_Ts));
              }
              else if ((Abs(t_Ts*r))==0.5) {
                y[i] = (M_PI/4.0)*\
                        sin(M_PI*t_Ts)/(M_PI*t_Ts);
              }
              else {
                y[i] = cos(M_PI*r*t_Ts)/(1.0 - (2.0*r*t_Ts)*(2.0*r*t_Ts))*\
                        sin(M_PI*t_Ts)/(M_PI*t_Ts);
              }
            }
            break;

  /*gauss*/
  case 3 :  /*récupération du produit bande-période symbole*/
            BT = (*param);

            /*calcul de la valeur des coefficients*/
            for(i=0;i<(*n);i++) {
              /*calcul des valeurs du vecteur t_Ts*/
              /*t_Ts = (1.0/d_ne) * ((double)i - d_n/2.0);*/
              t_Ts = (1.0/d_ne) * ((double)i - d_n/2.0) + 0.5/d_ne;

              y[i] = sqrt(2.0*M_PI/log(2.0)) *\
                      exp(-2.0/log(2.0) * (BT*M_PI*t_Ts)*(BT*M_PI*t_Ts));

              /**/
              y[i]= (1.0/d_ne)*(BT*y[i]);
            }
            break;

  /*do nothing*/
  default : break;
 }
 return;
}

Authors

A. Layec