is my decode for efr decode right?

bob avwiseav at gmail.com
Thu Nov 22 08:51:38 UTC 2012


Hi, list

I write a decode for efr decode for TCH,but there some bug, and I have not a
debug device, Can someone help me find the problem, Thanks!

static void process_tch_efr(struct osmocom_ms *ms,struct l1ctl_burst_ind
*bi)
{
	int16_t rx_dbm;
	uint16_t arfcn;
	uint32_t fn,B;
	uint8_t cbits, tn, lch_idx;
	int ul, bid, i, k, length;
	sbit_t *bursts, mC[456];
	ubit_t steal_bit[2],
bt[114],convu[189],convd[189],tch_raw[260],TCHW[260],EFRBits[244],EFRAMR[8 +
244];

	pbit_t voice[33];
	/* Get params (Only for SDCCH and SACCH/{4,8,F,H}) */
	arfcn  = ntohs(bi->band_arfcn);
	rx_dbm = rxlev2dbm(bi->rx_level);

	fn     = ntohl(bi->frame_nr);
	ul     = !!(arfcn & ARFCN_UPLINK);

	cbits  = bi->chan_nr >> 3;
	tn     = bi->chan_nr & 7;

	B  = -1;

	if((fn%13)%4 == 0) flag= 1;

	if(!flag) return;

	//B = count_tch % 8;
	B = (fn % 13) % 8;
	printf("fn % 26 = %d, fn % 13 = %d,B = %d\n",fn%26 ,fn%13 ,B);
	
	if (B == -1)
		return;

	/* Unpack (ignore hu/hl) */
	osmo_pbit2ubit_ext(bt,  0, bi->bits,  0, 57, 0);
	osmo_pbit2ubit_ext(bt, 57, bi->bits, 57, 57, 0);
	//osmo_pbit2ubit_ext(steal_bit, 0 , bi->bits, 114 , 2 , 0);
	//printf("steal_bit %x , %x\n",steal_bit[0],steal_bit[1]);
	
	/* save stealing flags */
        hl[B] = !!(bi->bits[14] & 0x10); // hl 57
        hu[B] = !!(bi->bits[14] & 0x20); // hu 58
	printf("steal_bit %x , %x\n", hl[B],hu[B]);

	/* Convert to softbits */
	for (i=0; i<114; i++)
		app_state.mI[B][i] = bt[i] ? - (bi->snr >> 1) : (bi->snr >> 1);

	count_tch++;
	// Deinterleave according to the diagonal "phase" of B.
	// See GSM 05.03 3.1.3.
	// Deinterleaves i[] to c[]
	if((B % 4 ==3)&&(count_tch >= 7)){

		if(B == 3)
		{
			if(!hl[0] && !hl[1] && !hl[2] && !hl[3] && !hu[4] && !hu[5] && !hu[6] &&
!hu[7])
			{
				tch_deinterleave(mC, 4);
			}
			else if(hl[0] && hl[1] && hl[2] && hl[3] && hu[4] && hu[5] && hu[6] &&
hu[7])
			{
				printf(" may be FACCH.\n");
				return;
			}else{
				printf("not a speech frame.\n");
				return;
			}
		}else{
			if(!hl[4] && !hl[5] && !hl[6] && !hl[7] && !hu[0] && !hu[1] && !hu[2] &&
!hu[3])
			{
				tch_deinterleave(mC,0);
			}
			else if(hl[4] && hl[5] && hl[6] && hl[7] && hu[0] && hu[1] && hu[2] &&
hu[3])
			{
				printf(" may be FACCH.\n");
				return;
			}else{
				printf("not a speech frame.\n");
				return;
			}
		}

		//mC is soft bit, and must convert to ubit type
		for (k = 0; k < 78; k++) {

			if(mC[378 + k] < 0){
				tch_raw[182 + k] = 1;
			}else{
				tch_raw[182 + k] = 0;
			}

		}
	
		osmo_conv_decode(&conv_tch_afs_12_2, mC, convu);

		// 3.1.2.1
		// copy class 1 bits u[] to d[]
		for (k = 0; k <= 90; k++) {
			convd[2*k] = convu[k];
			convd[2*k+1] = convu[184-k];
		}
		
		memcpy(tch_raw,convd,182);	// the last 78 bit has been stored!

		//now only process EFR or AMR 12_2, fix me!
		tch_unmap(gsm660_bitorder, 260, TCHW, tch_raw);

		// Remove repeating bits and CRC to get raw EFR frame (244 bits)
		for (k=0; k<71; k++)
		EFRBits[k] = TCHW[k];
	
		for (k=73; k<123; k++)
		EFRBits[k-2] = TCHW[k];
	
		for (k=125; k<178; k++)
		EFRBits[k-4] = TCHW[k];
	
		for (k=180; k<230; k++)
		EFRBits[k-6] = TCHW[k];
	
		for (k=232; k<252; k++)
		EFRBits[k-8] = TCHW[k];

		// Map bits as AMR 12.2k
		tch_map(gsm690_12_2_bitorder, 244, EFRAMR + 8,EFRBits);
	
		fillField(EFRAMR, 0, 0x3c, 8);

		length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_12_2_len, 0);

		fwrite(voice, 1, length, d_speech_file);
	}
	
}



--
View this message in context: http://baseband-devel.722152.n3.nabble.com/is-my-decode-for-efr-decode-right-tp4025448.html
Sent from the baseband-devel mailing list archive at Nabble.com.




More information about the baseband-devel mailing list