#include "utran_control/interfaces/itf_types.h" #include "utran_control/src/uectrl.h" #include "itf_types.h" #include "ratem.h" int Un_Rate_Match_TrCH(char *input,char *output, struct ratem_h *control) { int X; int k,m; float e_ini; float e_plus; float e_minus; float e1,e2; float a1,a2; char bit; if (control->deltaNtti==0) { memcpy(output,input,sizeof(char)*control->long_tti); return 0; // no cal fer rate matching } X=control->long_tti; if (control->deltaNtti<0 && control->Code_Type==CODE_TURBO) { e_ini=X/3; e_plus=X/3; // s'han de multiplicar per 2 si �s la seq��ncia Y e_minus=abs((int) control->deltaNtti/2); // s'han de multiplicar per 2 si �s la seq��ncia Y } else { e_ini=1; e_plus=X; e_minus=abs(control->deltaNtti); } // --- en downlink --- \\ // longitud a l'entrada:= control->N // longitud a la sortida:= control->N + control->deltaNtti m=0; e1=e_ini; e2=e_ini; k=0; if (control->deltaNtti<0 && control->Code_Type==CODE_TURBO) { // ---- puncturing i code turbo ------ a1=2; a2=1; while (klong_tti) { bit=input[m]; if ((k+2)%3==0) { e1=e1-a1*e_minus; if (e1<=0) { e1=e1+a1*e_plus; output[k]=0; k++; e2=e2-a2*e_minus; } } else if ((k+1)%3==0) { e2=e2-a2*e_minus; if (e2<=0) { e2=e2+a2*e_plus; output[k]=0; k++; } } output[k]=bit; k++; m++; } } else { while(klong_tti) { bit=input[m]; a1=2; // ----- puncturing ara repetition----- if (control->deltaNtti<0) { e1=e1-a1*e_minus; if (e1<=0) { e1=e1+a1*e_plus; output[k]=0; k++; e1=e1-a1*e_minus; //output[k]=bit; //k++; } //else { output[k]=bit; k++; //} } // ------ repetition ara puncturing------ else { output[k]=bit; k++; e1=e1-a1*e_minus; while(e1<=0) { e1=e1+a1*e_plus; m++; } } m++; } } return 1; }