📄 dl_sc_alloc.c
字号:
/* get the physical index of current group */
tmp_j = idic_group_seg [i][1];
/* big group have 6 subchannels */
if((tmp_i == 1) && (tmp_j % 2 == 0))
{
/* get the start physical index of current big group */
tmp_k = tmp_j * 5;
/* renumber suchannel order of big group */
for(j = 0; j < sc_per_subchn_pusc; j++)
{
sc_subchn_seg_pusc[suchn_nb_seg_pusc][j] = sc_subchn_pusc[tmp_k][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+1][j] = sc_subchn_pusc[tmp_k+1][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+2][j] = sc_subchn_pusc[tmp_k+2][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+3][j] = sc_subchn_pusc[tmp_k+3][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+4][j] = sc_subchn_pusc[tmp_k+4][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+5][j] = sc_subchn_pusc[tmp_k+5][j];
}
/* every big group have 6 subchannels */
suchn_nb_seg_pusc = suchn_nb_seg_pusc + 6;
}
/* small group have 4 subchannels */
else if((tmp_i == 1) && (tmp_j % 2 == 1)) //small group have 4 subchannels
{
/* get the start physical index of current small group */
tmp_k = (tmp_j/2) * 10 + 6;
/* renumber suchannel order of small group */
for(j = 0; j < sc_per_subchn_pusc; j++)
{
sc_subchn_seg_pusc[suchn_nb_seg_pusc][j] = sc_subchn_pusc[tmp_k][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+1][j] = sc_subchn_pusc[tmp_k+1][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+2][j] = sc_subchn_pusc[tmp_k+2][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+3][j] = sc_subchn_pusc[tmp_k+3][j];
}
/* every small group have 4 subchannels */
suchn_nb_seg_pusc = suchn_nb_seg_pusc + 4;
}
}
}
/* use all subchannels */
else if(zone_use_all_sc == 1)
{
//renumber group
/* renumber group */
/* decide the first group based on zone_PRBS_ID */
for(i = 0; i < 6; i ++)
{
tmp_j = (i + 2 * zone_PRBS_ID)%6;
idic_group_seg [i][0] = idic_group_seg_tmp[tmp_j][0];
idic_group_seg [i][1] = idic_group_seg_tmp[tmp_j][1];
}
/* renumber subchannels */
for (i = 0; i < nb_group_pusc; i++)
{
/* get the physical index of current group */
tmp_j = idic_group_seg [i][1];
/* big group have 6 subchannels */
if(tmp_j % 2 == 0)
{
/* get the start physical index of current big group */
tmp_k = tmp_j * 5;
/* renumber suchannel order of big group */
for(j = 0; j < sc_per_subchn_pusc; j++)
{
sc_subchn_seg_pusc[suchn_nb_seg_pusc][j] = sc_subchn_pusc[tmp_k][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+1][j] = sc_subchn_pusc[tmp_k+1][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+2][j] = sc_subchn_pusc[tmp_k+2][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+3][j] = sc_subchn_pusc[tmp_k+3][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+4][j] = sc_subchn_pusc[tmp_k+4][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+5][j] = sc_subchn_pusc[tmp_k+5][j];
}
/* every big group have 6 subchannels */
suchn_nb_seg_pusc = suchn_nb_seg_pusc + 6;
}
/* small group have 4 subchannels */
else if(tmp_j % 2 == 1)
{
/* get the start physical index of current small group */
tmp_k = (tmp_j/2) * 10 + 6;
/* renumber suchannel order of small group */
for(j = 0; j < sc_per_subchn_pusc; j++)
{
sc_subchn_seg_pusc[suchn_nb_seg_pusc][j] = sc_subchn_pusc[tmp_k][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+1][j] = sc_subchn_pusc[tmp_k+1][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+2][j] = sc_subchn_pusc[tmp_k+2][j];
sc_subchn_seg_pusc[suchn_nb_seg_pusc+3][j] = sc_subchn_pusc[tmp_k+3][j];
}
/* every small group have 4 subchannels */
suchn_nb_seg_pusc = suchn_nb_seg_pusc + 4;
}
}
}
#ifdef DEBUG_OUT_FILE
/* output order renumbered suchannel subcarriers */
for(i = 0; i < suchn_nb_seg_pusc; i ++) //used subchannels number
{
fprintf(fp_scallc_PUSC_10M,"suchannel %5d :",i);
for(j = 0; j < sc_per_subchn_pusc; j++) //subcarrier number of every subchannel
{
if(j == sc_per_subchn_pusc - 1)
fprintf(fp_scallc_PUSC_10M,"%4d \n",sc_subchn_seg_pusc[i][j]);
else
fprintf(fp_scallc_PUSC_10M,"%4d",sc_subchn_seg_pusc[i][j]);
}
}
#endif
/* return physical sucarriers of subchannel */
for(i = 0; i < suchn_nb_seg_pusc; i++) //used subchannels number
{
for(j = 0; j < sc_per_subchn_pusc; j++) //subcarrier number of every subchannel
{
*datasc_index_addr = sc_subchn_seg_pusc[i][j];
datasc_index_addr ++ ;
}
}
#ifdef DEBUG_OUT_FILE
fclose(fp_scallc_PUSC_10M);
#endif
return 1;
}
/*
* *************************************************************************************
* function: dl_subcarrier_alloc_fusc module
* parameters:
* UINT16 * datasc_index_addr, //matrix of data subcarrier of subchannel:[MAXSUBCHN_NUM][MAX_SC_NUM_SUBCHN]
* UINT16 * pilotsc_index_addr, //sequence of pilot subcarrier of symbol:[MAX_PILOT_NUM_SYM]
* UINT16 * data_physc_index_addr,//sequence of data subcarrier of symbol:[MAX_DATASC_NUM]
* UINT16 zone_dl_permbase, //permbase of zone
* UINT16 symbol_parity, //symbol parity
* return: int 1
* description: downlink FUSC zone subchannel subcarriers allocation module module
* -------------------------------------------------------------------------------------
*/
int dl_subcarrier_alloc_fusc
(
UINT16 * datasc_index_addr,
UINT16 zone_dl_permbase,
UINT16 symbol_parity
)
{
/*
***************************************************************************************
* basic parameter definition
***************************************************************************************
*/
/* pilot variable position for even symbol for FUSC 1024 FFT */
UINT16 variableset0_fusc_even[36] = {
0,24,48,72,96,120,144,168,192,216,240,264,288,
312,336,360,384,408,432,456,480,504,528,552,
576,600,624,648,672,696,720,744,768,792,816,
840
};
/* pilot variable position for odd symbol for FUSC 1024 FFT */
UINT16 variableset0_fusc_odd[36] = {
6,30,54,78,102,126,150,174,198,222,246,270,294,
318,342,366,390,414,438,462,486,510,534,558,
582,606,630,654,678,702,726,750,774,798,822,
846
};
/* pilot constant position for FUSC 1024 FFT */
UINT16 constantset0_fusc[6] = {9,153,297,441,585,729};
/* pilot variable position for even symbol for FUSC 1024 FFT*/
UINT16 variableset1_fusc_even[35] ={
36,108,180,252,324,396,468,540,612,684,756,
828,12,84,156,228,300,372,444,516,588,660,
732,804,60,132,204,276,348,420,492,564,636,
708,780
};
/* pilot variable position for odd symbol for FUSC 1024 FFT*/
UINT16 variableset1_fusc_odd[35] ={
42,114,186,258,330,402,474,546,618,690,762,
834,18,90,162,234,306,378,450,522,594,666,
738,810,66,138,210,282,354,426,498,570,642,
714,786
};
/* pilot constant position for FUSC 1024 FFT*/
UINT16 constantset1_fusc[5] = {81,225,369,513,657};
/* permutaion base sequence for FUSC 1024 FFT*/
UINT16 permubase_fusc_1024[16] = {6,14,2,3,10,8,11,15,9,1,13,12,5,7,4,0};
/* basic parameter for FUSC 1024 FFT */
UINT16 nb_sc_subchn_fusc = 48; //subcarrier number of a subchannel
UINT16 nb_subchn_fusc = 16; //subchannel number
/*
***************************************************************************************
* variable definition
***************************************************************************************
*/
/* data type variable for FUSC permutiaon 1024 FFT size */
UINT16 sc_all_fusc[851]; //subcarrier of all for fusc include dc subcarrier
UINT16 sc_pilot_fusc[82]; //pilot subcarrier of fusc
UINT16 sc_data_fusc[768]; //data subcarrier of fusc
UINT16 sc_data_indx_fusc; //data subcarrier index of fusc
UINT16 sc_subchn_fusc[16][48]; //data subcarrier of subchannel for fusc
#ifdef DEBUG_OUT_FILE
FILE *fp_scallc_FUSC_10M; //file pionter of ouput file
#endif
/* tempory variable */
UINT16 tmp_subchn_index;
UINT16 tmp_permubase16[16];
UINT16 tmp_k;
UINT16 nk,nk_m;
UINT16 i,j,k;
/*
***************************************************************************************
* function definition
***************************************************************************************
*/
/*------------------------ 10 M bandwidth -------------------------------*/
/*------------------------ separate data from pilot subcarrier --------------------*/
#ifdef DEBUG_OUT_FILE
/*creat scallc_FUSC_10M.txt file to store the debug informaiton of FUSC 10M*/
fp_scallc_FUSC_10M = fopen("scallc_FUSC_10M.txt","w");
#endif
/* initial pilot flag sequence*/
for (i = 0; i < 851; i++)
sc_all_fusc[i] = 0;
/* seperate pilot subcarriers from all subcarriers and put pilot flag */
for (i = 0; i < 82; i++)
{
/* add variableset0 fusc pilot sequence */
if(i >= 0 && i < 36)
{
if(symbol_parity == 0) //even
sc_pilot_fusc[i] = variableset0_fusc_even[i];
else //odd
sc_pilot_fusc[i] = variableset0_fusc_odd[i];
}
/* add constantset0 fusc pilot sequence */
else if(i >= 36 && i < 42)
sc_pilot_fusc[i] = constantset0_fusc[i - 36];
/* add variableset1 fusc pilot sequence */
else if(i >= 42 && i < 77)
{
if(symbol_parity == 0) //even
sc_pilot_fusc[i] = variableset1_fusc_even[i - 42];
else //odd
sc_pilot_fusc[i] = variableset1_fusc_odd[i - 42];
}
/* add constantset1 fusc pilot sequence */
else if(i >= 77 && i < 82)
{
sc_pilot_fusc[i] = constantset1_fusc[i - 77];
}
/* put pilot flag bit of correspond subcarrier */
sc_all_fusc[sc_pilot_fusc[i]] = 1;
}
#ifdef DEBUG_OUT_FILE
/* print title of data subcarrier in debug file */
fprintf(fp_scallc_FUSC_10M,"\n /*******************************the data subcarriers ***************************/\n");
#endif
/* reset data subcarrier's index */
sc_data_indx_fusc = 0;
/* choose and flag data subcarrier */
for (i = 0; i < 851; i ++ )
{
/* when sc_all_fusc[i] is 1 the subcarrier is pilot and when i = 425 the subcarrier is DC */
if((sc_all_fusc[i] == 0) && (i != 425))
{
/* transform the relative position of data subcarrier into physical positon */
sc_data_fusc[sc_data_indx_fusc] = i + 87;
sc_data_indx_fusc++ ;
}
}
/*------------------------ generate subchannel subcarrier -------------------------------*/
/* assign subcarriers of subchannels */
for(i = 0; i < nb_subchn_fusc; i++) //there are 16 subchannels in all
{
#ifdef DEBUG_OUT_FILE
fprintf(fp_scallc_FUSC_10M,"subchannel %5d :\n",i);
#endif
/* initial permubase sequence of FUSC */
for (j = 0; j < 16 ; j++)
{
tmp_permubase16[j] = permubase_fusc_1024[j];
}
/* shift the permubase sequence */
for(j = 0; j < i; j++)
{
tmp_k = tmp_permubase16[0];
for (k = 0; k < 15; k++)
{
tmp_permubase16[k] = tmp_permubase16[k + 1];
}
tmp_permubase16[15] = tmp_k;
}
/* compute the subchannel subcarrier's physical position */
for(j = 0; j < nb_sc_subchn_fusc ; j++) //every subchannel have 48 subcarriers
{
/* nk_m = (k+13*s) mod Nsubcarriers */
nk = (j + 13*i) % nb_sc_subchn_fusc;
/* nk_m = nk mod Nsubchannels */
nk_m = nk % nb_subchn_fusc;
/* subcarrier (k, s) = Nsubchannels . nk +{ps[nk mod Nsubchannels]+ DL_PermBase} mod Nsubchannels */
tmp_subchn_index = nb_subchn_fusc * nk + (tmp_permubase16[nk_m] + zone_dl_permbase) % nb_subchn_fusc;
sc_subchn_fusc[i][j] = sc_data_fusc[tmp_subchn_index];
#ifdef DEBUG_OUT_FILE
/* output subcarrier of subchannel */
if (j % 12 == 11)
fprintf(fp_scallc_FUSC_10M,"%4d\n",sc_subchn_fusc[i][j]);
else
fprintf(fp_scallc_FUSC_10M,"%4d",sc_subchn_fusc[i][j]);
#endif
}
}
#ifdef DEBUG_OUT_FILE
fclose(fp_scallc_FUSC_10M);
#endif
/* return physical sucarriers of subchannel */
for(i = 0; i < nb_subchn_fusc; i ++) //there are 16 subchannels in FUSC
{
for(j = 0; j < nb_sc_subchn_fusc; j++) //every subchannel have 48 subcarriers
{
*datasc_index_addr = sc_subchn_fusc[i][j];
datasc_index_addr ++ ;
}
}
return 1;
}
/*====================================================================*/
void main()
{
UINT16 first_dl_flag;
UINT16 zone_use_all_sc;
UINT16 zone_dl_permbase;
UINT16 zone_PRBS_ID;
UINT16 fch_bitmap[6]={1,1,1,1,1,1};
UINT16 symbol_parity;
UINT16 segment_id;
UINT16 pusc_datasc_index_addr[30][24];
UINT16 data_physc_index_addr[60];
UINT16 fusc_datasc_index_addr[16][48];
first_dl_flag = 1;
zone_use_all_sc = 0;
zone_dl_permbase = 4;
zone_PRBS_ID = 2;
symbol_parity = 0;
segment_id = 0;
dl_subcarrier_alloc_pusc(
&pusc_datasc_index_addr[0][0],
data_physc_index_addr,
first_dl_flag,
zone_use_all_sc,
zone_dl_permbase,
zone_PRBS_ID,
fch_bitmap,
symbol_parity,
segment_id);
/*
dl_subcarrier_alloc_fusc(
&fusc_datasc_index_addr[0][0],
zone_dl_permbase,
symbol_parity);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -