Hi List!<br><br>I am studying the AMR codec in GSM.but I met some problem.<br><br>I use burst_id to capture TCH in my test network,and in my programmm, <br>I use the firsrt 8 bits of a TCH block to decide whether it is a tch or not <br>
and also get the codec mode of a AFS,and than other operations,but it is <br>not to work , I am struggled to this, any one can help me? <br>this is my code:<br><br>static void process_tch_amr(struct osmocom_ms *ms,struct l1ctl_burst_ind *bi)<br>
{<br> int16_t rx_dbm;<br> uint16_t arfcn;<br> uint32_t fn,B;<br> uint8_t cbits, tn, lch_idx;<br> int ul, bid, i, k, length;<br> sbit_t *bursts, mC[456];<br> ubit_t steal_bit[2], bt[114],convu[260],convd[260],EFRBits[244],EFRAMR[8 + 244];<br>
<br> pbit_t voice[33];<br> unsigned char mode;<br><br> arfcn = ntohs(bi->band_arfcn);<br> rx_dbm = rxlev2dbm(bi->rx_level);<br><br> fn = ntohl(bi->frame_nr);<br> ul = !!(arfcn & ARFCN_UPLINK);<br>
<br> cbits = bi->chan_nr >> 3;<br> tn = bi->chan_nr & 7;<br><br> B = -1;<br> <br> if((fn%13)%4 == 0) flag= 1;<br><br> if(!flag) return;<br><br> B = count_tch % 8;<br><br> if (B == -1)<br>
return;<br><br><br> if (B == 0){<br> for(i=0; i<4; i++){<br> memset(app_state.mI[i], 0x00, 114);<br> }<br> }else if(B == 4){<br> for(i=4; i<8; i++){<br> memset(app_state.mI[i], 0x00, 114);<br>
} <br> }<br><br> /* Unpack (ignore hu/hl) */<br> osmo_pbit2ubit_ext(bt, 0, bi->bits, 0, 57, 0);<br> osmo_pbit2ubit_ext(bt, 57, bi->bits, 57, 57, 0);<br><br> /* Convert to softbits */<br>
for (i=0; i<114; i++)<br> app_state.mI[B][i] = bt[i] ? - (bi->snr >> 1) : (bi->snr >> 1);<br> <br> count_tch++;<br><br> // Deinterleaves i[] to c[]<br> if((B % 4 ==3)&&(count_tch >= 7)){<br>
if(B == 3)<br> {<br> tch_deinterleave(mC, 4);<br> }else{<br> tch_deinterleave(mC, 0);<br> }<br><br> //abstract the codec mode<br> for(i = 0;i<8;i++)<br>
{<br> //printf("%x ",mC[i]);<br> if(mC[i] < 0)<br> mode = ( mode | (1 << i));<br> else<br> mode = ( mode & (~(1 << i))); <br>
}<br> //printf("mode %x\n",mode);<br><br> switch(mode){<br> case CODEC_MODE_1:<br> printf("codec 1\n");<br> i = find_speech_mode(app_state.amr_arg.amr_acs, 1);<br>
break; <br> case CODEC_MODE_2:<br> printf("codec 2\n");<br> i = find_speech_mode(app_state.amr_arg.amr_acs, 2); <br> break;<br> case CODEC_MODE_3:<br>
printf("codec 3\n");<br> i = find_speech_mode(app_state.amr_arg.amr_acs, 3); <br> break;<br> case CODEC_MODE_4:<br> printf("codec 4\n");<br>
i = find_speech_mode(app_state.amr_arg.amr_acs, 4); <br> break;<br> default:<br> {<br> //printf("unkown codec\n");<br> return;<br>
}<br> }<br> <br> memset(voice,0,32);<br> switch( 1 << i ){<br> case gsm690_4_75:<br> printf("codec gsm690_4_75\n");<br> osmo_conv_decode(&conv_tch_afs_4_75, &mC[8], convu);<br>
memcpy(convd,convu,39);<br> memcpy(convd,&convu[45],56);<br> tch_map(gsm690_4_75_bitorder, gsm690_4_75_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x04, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_4_75_len, 1); <br><br> break; <br> case gsm690_5_15:<br> printf("codec gsm690_5_15\n");<br> osmo_conv_decode(&conv_tch_afs_5_15, &mC[8], convu);<br>
memcpy(convd,convu,49);<br> memcpy(convd,&convu[55],54);<br> tch_map(gsm690_5_15_bitorder, gsm690_5_15_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x0c, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_5_15_len, 1); <br><br> break;<br> case gsm690_5_90:<br> printf("codec gsm690_5_90\n");<br> osmo_conv_decode(&conv_tch_afs_5_9, &mC[8], convu);<br>
memcpy(convd,convu,55);<br> memcpy(convd,&convu[61],63);<br> tch_map(gsm690_5_9_bitorder, gsm690_5_90_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x14, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_5_90_len, 1); <br> <br> break;<br> case gsm690_6_70:<br> printf("codec gsm690_6_70\n");<br> osmo_conv_decode(&conv_tch_afs_6_7, &mC[8], convu);<br>
memcpy(convd,convu,55);<br> memcpy(convd,&convu[61],79);<br> tch_map(gsm690_6_7_bitorder, gsm690_6_70_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x1c, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_6_70_len, 1); <br> <br> break;<br> case gsm690_7_40:<br> printf("codec gsm690_7_40\n");<br> osmo_conv_decode(&conv_tch_afs_7_4, &mC[8], convu);<br>
memcpy(convd,convu,61);<br> memcpy(convd,&convu[67],87);<br> tch_map(gsm690_7_4_bitorder, gsm690_7_40_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x24, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_7_40_len, 1); <br> <br> break;<br> case gsm690_7_95:<br> printf("codec gsm690_7_95\n");<br> osmo_conv_decode(&conv_tch_afs_7_95, &mC[8], convu);<br>
memcpy(convd,convu,75);<br> memcpy(convd,&convu[81],84);<br> tch_map(gsm690_7_95_bitorder, gsm690_7_95_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x2c, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_7_95_len, 1); <br> break;<br> case gsm690_10_2:<br> printf("codec gsm690_10_2\n");<br> osmo_conv_decode(&conv_tch_afs_10_2, &mC[8], convu);<br>
memcpy(convd,convu,65);<br> memcpy(convd,&convu[71],139);<br> tch_map(gsm690_10_2_bitorder, gsm690_10_2_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x34, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_10_2_len, 1);<br> break;<br> case gsm690_12_2:<br> printf("codec gsm690_12_2\n");<br> osmo_conv_decode(&conv_tch_afs_12_2, &mC[8], convu);<br>
memcpy(convd,convu,81);<br> memcpy(convd,&convu[87],163);<br> tch_map(gsm690_12_2_bitorder, gsm690_12_2_len, EFRAMR + 8,convd);<br> fillField(EFRAMR, 0, 0x3c, 8);<br>
length = osmo_ubit2pbit_ext(voice, 0, EFRAMR, 0, 8 + gsm690_12_2_len, 1);<br> break;<br> default:<br> {<br> printf("unkown gsm690 codec\n");<br> return;<br>
}<br> } <br><br> printf("length is %d\n",length);<br> printf("voice[0] is %x\n",voice[0]);<br> fwrite(voice, 1, length, d_speech_file);<br> }<br> <br><br>