Ajoutez ici un paragraphe pour la description de la fonction
/* 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;
}