1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
void UseDVBTCic(DVBTCic *DC)
{
int nombre_etages,decim,interp;
float decimation,interpolation;
// float entree[200];
float entree[20]={0.020011, 0.005800, -0.013472,-0.034863, -0.074317, -0.073456, 0.124578, -0.122345, 0.698567, 0.122112, 0.987654, 0.146928, -0.147963, 0.258258, 0.321321, 0.556465, 0.258923, 0.121212, 0.369741, 0.321987};
int i,j;
printf("\nEntrez le Nombre d'étages du CIC :");
scanf("%d",&nombre_etages);
printf("\nEntrez le Rapport de décimation:");
scanf("%d",&decim);
printf("\nEntrez le Rapport d'interpolation :");
scanf("%d",&interp);
float sortie_decim[20/decim];
float sortie_interp[20*interp];
for(i=0;i<20;i++) /*Remplissage du signal d'entrée*/
{ //entree[i]=i;
printf(" %f",entree[i]);
}
CicNum_stages(DC, nombre_etages); /*Initialisation de la structure du CIC en fonction du nombre d'étages*/
printf("\n");
for(i=0;i<20;i++)
{
if(i%decim == 0)
{
decimation=CicDecimate(DC,entree[i],1); /*Utilisation du CIC Décimation*/
sortie_decim[i/decim]=decimation;
}
}
printf("\ndécimation :");
for(i=0;i<20/decim;i++)
{
printf(" %f",sortie_decim[i]);
}
for (i=0;i<20;++i)
{
interpolation=CicInterpolate(DC,entree[i],1); /*Utilisation du CIC Interpolation*/
sortie_interp[i*interp]=interpolation;
for(j=1;j<interp;j++)
{
sortie_interp[j+interp*i]=interpolation;
}
}
printf("\ninterpolation :");
for(i=0;i<20*interp;i++)
{
printf(" %f",sortie_interp[i]);
}
return;
}
void CicNum_stages(DVBTCic *DC, int n)
{
DC->stages = n;
free(DC->nacc);
free(DC->diff);
free(DC->prev);
/* DC->nacc=(float*)malloc(sizeof(int)*(n));
DC->diff=(float*)malloc(sizeof(int)*(n));
DC->prev=(float*)malloc(sizeof(int)*(n));
*/
DC->nacc=(float*)malloc(sizeof(int)*(n));
DC->diff=(float*)malloc(sizeof(int)*(n));
DC->prev=(float*)malloc(sizeof(int)*(n));
return;
}
float CicDecimate(DVBTCic *DC, float in, int dump)
{
int i;
DC->nacc[0]+= in;
for(i=0;i<(DC->stages-1);i++)
{
DC->nacc[i+1] += DC->nacc[i];
}
if(dump)
{
DC->diff[0]=DC->nacc[DC->stages-1]-DC->prev[0];
DC->prev[0]=DC->nacc[DC->stages-1];
for(i=1;i<DC->stages;i++)
{ DC->diff[i]= DC->diff[i-1]-DC->prev[i];
DC->prev[i]=DC->diff[i-1];
}
}
return(DC->diff[DC->stages-1]);
}
float CicInterpolate(DVBTCic *DC, float in, int dump)
{
int i;
if(dump)
{
DC->diff[0]=in-DC->prev[0];
DC->prev[0]=in;
for(i=1;i<DC->stages;i++)
{ DC->diff[i]= DC->diff[i-1]-DC->prev[i];
DC->prev[i]=DC->diff[i-1];
}
DC->nacc[0]+=DC->diff[DC->stages-1];
}
for(i=0;i<(DC->stages-1);i++)
{
DC->nacc[i+1] += DC->nacc[i];
}
return(DC->nacc[DC->stages-1]);
} |