#include "utran_control/src/uectrl.h" #include "itf_types.h" #include "ratem.h" int Rate_Match_TrCH_downlink(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); } 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 (mlong_tti) { bit=input[m]; if ((m+2)%3==0) { e1=e1-a1*e_minus; if (e1<=0) { e1=e1+a1*e_plus; } else { output[k]=bit; k++; } } else if ((m+1)%3==0) { e2=e2-a2*e_minus; if (e2<=0) { e2=e2+a2*e_plus; } else { output[k]=bit; k++; } } else { output[k]=bit; k++; } m++; } } else { while(mlong_tti) { bit=input[m]; a1=2; // ----- puncturing ----- if (control->deltaNtti<0) { e1=e1-a1*e_minus; if (e1<=0) { e1=e1+a1*e_plus; } else { output[k]=bit; k++; } } // ------ repetition ------ else { output[k]=bit; k++; e1=e1-a1*e_minus; while(e1<=0) { e1=e1+a1*e_plus; output[k]=bit; k++; } } m++; } } return 1; } int Rate_Match_TrCH_uplink(char *input,char *output, struct ratem_h *control) { int X; int k,m; int e_ini; int e_plus; int e_minus; int e1,e2; int 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 (mlong_tti) { bit=input[m]; if ((m+2)%3==0) { e1=e1-a1*e_minus; if (e1<=0) { e1=e1+a1*e_plus; } else { output[k]=bit; k++; } } else if ((m+1)%3==0) { e2=e2-a2*e_minus; if (e2<=0) { e2=e2+a2*e_plus; } else { output[k]=bit; k++; } } else { output[k]=bit; k++; } m++; } } else { while(mlong_tti) { bit=input[m]; a1=2; // ----- puncturing ----- if (control->deltaNtti<0) { e1=e1-a1*e_minus; if (e1<=0) { e1=e1+a1*e_plus; } else { output[k]=bit; k++; } } // ------ repetition ------ else { output[k]=bit; k++; e1=e1-a1*e_minus; while(e1<=0) { e1=e1+a1*e_plus; output[k]=bit; k++; } } m++; } } return 1; }