/* filter_tap_c subroutine * computation of coefficient of fir filter * for Root Raised Cosine function * Raised Cosine function * Gaussian function * * Copyright (C) 2007-2009 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; }