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>