is my decode for efr decode right?
bob
avwiseav at gmail.com
Thu Nov 22 09:51:38 CET 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