⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dl_sc_alloc.c

📁 802.16e物理层下行子载波分配。严格按照802.16e实现。
💻 C
📖 第 1 页 / 共 2 页
字号:

				/* 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 + -