static int modifyBands(int max_band_previous, int * diff, int length) { int change=max_band_previous-diff[0]; /* counting previous operation */ if ( change > (diff[length-1] - diff[0]) / 2 ) { change = (diff[length-1] - diff[0]) / 2; } diff[0] += change; diff[length-1] -= change; Shellsort_int(diff, length); return(0); }/* End modifyBands */
int getFrameSync (dsd_opts * opts, dsd_state * state) { /* detects frame sync and returns frame type * 0 = +P25p1 * 1 = -P25p1 * 2 = +X2-TDMA (non inverted signal data frame) * 3 = -X2-TDMA (inverted signal data frame) * 4 = +DMR (non inverted signal data frame) * 5 = -DMR (inverted signal data frame) * 6 = +NXDN (non inverted data frame) * 7 = -NXDN (inverted data frame) * 8 = +D-STAR * 9 = -D-STAR * 10 = +D-STAR_HD * 11 = -D-STAR_HD * 12 = +DMR (non inverted signal voice frame) * 13 = -DMR (inverted signal voice frame) * 14 = +X2-TDMA (non inverted signal voice frame) * 15 = -X2-TDMA (inverted signal voice frame) * 16 = +NXDN (non inverted voice frame) * 17 = -NXDN (inverted voice frame) */ int i, t, dibit, sync, symbol, synctest_pos, lastt; char synctest[25]; char *synctest_p; char synctest_buf[10240]; int lmin, lmax, lidx; int lbuf[24], lbuf2[24]; for (i = 18; i < 24; i++) { lbuf[i] = 0; lbuf2[i] = 0; } // detect frame sync t = 0; synctest[24] = 0; synctest_pos = 0; synctest_p = synctest_buf; sync = 0; lmin = 0; lmax = 0; lidx = 0; lastt = 0; while (sync == 0) { t++; symbol = getSymbol (opts, state, 0); lbuf[lidx] = symbol; state->sbuf[state->sidx] = symbol; if (lidx == 23) { lidx = 0; } else { lidx++; } if (state->sidx == (state->ssize - 1)) { state->sidx = 0; } else { state->sidx++; } if (lastt == 23) { lastt = 0; state->rf_mod = 2; } else { lastt++; } //determine dibit state if (symbol > 0) { dibit = 49; // '1' } else { dibit = 51; // '3' } *synctest_p = dibit; if (t >= 18) { for (i = 0; i < 24; i++) { lbuf2[i] = lbuf[i]; } Shellsort_int (lbuf2, 24); lmin = (lbuf2[2] + lbuf2[3] + lbuf2[4]) / 3; lmax = (lbuf2[21] + lbuf2[20] + lbuf2[19]) / 3; if (opts->datascope && (lidx == 0)) { print_datascope(state, lbuf2, 24); } memcpy (synctest, (synctest_p - 23), 24); if ((memcmp (synctest, P25P1_SYNC, 24) == 0) || (memcmp (synctest, INV_P25P1_SYNC, 24) == 0)) { state->offset = synctest_pos; strcpy (state->ftype, "P25p1"); if (synctest[0] == '1') { state->lastsynctype = 0; } else { state->lastsynctype = 1; } goto update_sync_and_return; } if ((memcmp (synctest, DMR_MS_DATA_SYNC, 24) == 0) || (memcmp (synctest, DMR_BS_DATA_SYNC, 24) == 0)) { state->offset = synctest_pos; state->dmrMsMode = (synctest[22] == '1'); strcpy (state->ftype, "DMR "); if (opts->inverted_dmr == 0) { // data frame if (state->lastsynctype != 4) { state->firstframe = 1; } state->lastsynctype = 4; } else { // inverted voice frame if (state->lastsynctype != 13) { state->firstframe = 1; } state->lastsynctype = 13; } goto update_sync_and_return; } if ((memcmp (synctest, DMR_MS_VOICE_SYNC, 24) == 0) || (memcmp (synctest, DMR_BS_VOICE_SYNC, 24) == 0)) { state->offset = synctest_pos; state->dmrMsMode = (synctest[22] == '3'); strcpy (state->ftype, "DMR "); if (opts->inverted_dmr == 0) { // voice frame if (state->lastsynctype != 12) { state->firstframe = 1; } state->lastsynctype = 12; } else { // inverted data frame if (state->lastsynctype != 5) { state->firstframe = 1; } state->lastsynctype = 5; } goto update_sync_and_return; } if ((memcmp (synctest, X2TDMA_BS_DATA_SYNC, 24) == 0) || (memcmp (synctest, X2TDMA_MS_DATA_SYNC, 24) == 0)) { state->offset = synctest_pos; state->dmrMsMode = (synctest[22] == '1'); strcpy (state->ftype, "X2-TDMA "); if (opts->inverted_x2tdma == 0) { // data frame state->lastsynctype = 2; } else { // inverted voice frame if (state->lastsynctype != 15) { state->firstframe = 1; } state->lastsynctype = 15; } goto update_sync_and_return; } if ((memcmp (synctest, X2TDMA_BS_VOICE_SYNC, 24) == 0) || (memcmp (synctest, X2TDMA_MS_VOICE_SYNC, 24) == 0)) { state->offset = synctest_pos; state->dmrMsMode = (synctest[22] == '3'); strcpy (state->ftype, "X2-TDMA "); if (opts->inverted_x2tdma == 0) { // voice frame if (state->lastsynctype != 14) { state->firstframe = 1; } state->lastsynctype = 14; } else { // inverted data frame state->lastsynctype = 3; } goto update_sync_and_return; } if ((memcmp (synctest+6, NXDN_BS_VOICE_SYNC, 18) == 0) || (memcmp (synctest+6, NXDN_MS_VOICE_SYNC, 18) == 0) || (memcmp (synctest+6, NXDN_BS_DATA_SYNC, 18) == 0) || (memcmp (synctest+6, NXDN_MS_DATA_SYNC, 18) == 0)) { if (synctest[21] == '1') { state->lastsynctype = 6; } else { state->lastsynctype = 16; } if ((state->lastsynctype == 6) || (state->lastsynctype == 16)) { state->offset = synctest_pos; strcpy (state->ftype, "NXDN96 "); goto update_sync_and_return; } } if ((memcmp (synctest+6, INV_NXDN_BS_VOICE_SYNC, 18) == 0) || (memcmp (synctest+6, INV_NXDN_MS_VOICE_SYNC, 18) == 0) || (memcmp (synctest+6, INV_NXDN_BS_DATA_SYNC, 18) == 0) || (memcmp (synctest+6, INV_NXDN_MS_DATA_SYNC, 18) == 0)) { if (synctest[21] == '3') { state->lastsynctype = 7; } else { state->lastsynctype = 17; } if ((state->lastsynctype == 7) || (state->lastsynctype == 17)) { state->offset = synctest_pos; strcpy (state->ftype, "NXDN96 "); goto update_sync_and_return; } } if ((memcmp (synctest, DSTAR_SYNC, 24) == 0) || (memcmp (synctest, INV_DSTAR_SYNC, 24) == 0)) { state->offset = synctest_pos; strcpy (state->ftype, "D-STAR "); if (synctest[0] == '3') { state->lastsynctype = 8; } else { state->lastsynctype = 9; } goto update_sync_and_return; } if ((memcmp (synctest, DSTAR_HD_SYNC, 24) == 0) || (memcmp (synctest, INV_DSTAR_HD_SYNC, 24) == 0)) { state->offset = synctest_pos; strcpy (state->ftype, "D-STARHD"); if (synctest[0] == '1') { state->lastsynctype = 10; } else { state->lastsynctype = 11; } goto update_sync_and_return; } } if (exitflag == 1) { cleanupAndExit (opts, state); } if (synctest_pos < 10200) { synctest_pos++; synctest_p++; } else { // buffer reset synctest_pos = 0; synctest_p = synctest_buf; state->lastsynctype = -1; } if (state->lastsynctype != -1) { //if (synctest_pos >= 1800) { if (synctest_pos >= 9000) { if ((state->lastsynctype != -1) && !(opts->datascope)) { printf ("Sync: no sync\n"); } state->lastsynctype = -1; #if 1 state->max = 3000; state->min = -3000; state->umid = 1000; state->lmid = -1000; state->center = 0; #endif return (-1); } } } return (-1); update_sync_and_return: // recalibrate center/umid/lmid state->max = ((state->max) + (lmax)) / 2; state->min = ((state->min) + (lmin)) / 2; state->center = ((state->max) + (state->min)) / 2; state->umid = (((state->max) - state->center) * 5 / 8) + state->center; state->lmid = (((state->min) - state->center) * 5 / 8) + state->center; return state->lastsynctype; }
/******************************************************************************* Functionname: UpdateFreqScale ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ int UpdateFreqScale(unsigned char *v_k_master, int *h_num_bands, const int k0, const int k2, const int freqScale, const int alterScale) { int b_p_o = 0; float warp = 0; int dk = 0; /* Internal variables */ int two_regions = 0; int k1 = 0, i; int num_bands0; int num_bands1; int diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; int *diff0 = diff_tot; int *diff1 = diff_tot+MAX_OCTAVE; int k2_achived; int k2_diff; int incr = 0; /* counting previous operations */ if(freqScale==1) { b_p_o=12; } if(freqScale==2) { b_p_o=10; } if(freqScale==3) { b_p_o=8; } if(freqScale > 0) { if(alterScale==0) { warp=1.0; } else { warp=1.3f; } if(4*k2 >= 9*k0) { two_regions=1; k1=2*k0; num_bands0=numberOfBands(b_p_o, k0, k1, 1.0); num_bands1=numberOfBands(b_p_o, k1, k2, warp); CalcBands(diff0, k0, k1, num_bands0); Shellsort_int( diff0, num_bands0); if (diff0[0] == 0) { return (1); } cumSum(k0, diff0, num_bands0, v_k_master); CalcBands(diff1, k1, k2, num_bands1); Shellsort_int( diff1, num_bands1); if(diff0[num_bands0-1] > diff1[0]) { if(modifyBands(diff0[num_bands0-1],diff1, num_bands1)) { return(1); } } cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]); *h_num_bands=num_bands0+num_bands1; } else { two_regions=0; k1=k2; num_bands0=numberOfBands(b_p_o, k0, k1, 1.0); CalcBands(diff0, k0, k1, num_bands0); Shellsort_int( diff0, num_bands0); if (diff0[0] == 0) { return (1); } cumSum(k0, diff0, num_bands0, v_k_master); *h_num_bands=num_bands0; } } else { if (alterScale==0) { dk = 1; num_bands0 = 2 * ((k2 - k0)/2); } else { dk = 2; num_bands0 = 2 * (((k2 - k0)/dk +1)/2); } k2_achived = k0 + num_bands0*dk; k2_diff = k2 - k2_achived; for(i=0;i<num_bands0;i++) { diff_tot[i] = dk; } if (k2_diff < 0) { incr = 1; i = 0; } if (k2_diff > 0) { incr = -1; i = num_bands0-1; } /* diff_tot[] */ while (k2_diff != 0) { diff_tot[i] = diff_tot[i] - incr; /* ADD(1): pointer increment */ i = i + incr; k2_diff = k2_diff + incr; } cumSum(k0, diff_tot, num_bands0, v_k_master); *h_num_bands=num_bands0; } if (*h_num_bands < 1) { return(1); } return (0); }/* End UpdateFreqScale */
/******************************************************************************* Functionname: getStopFreq ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ static int getStopFreq(int fs, int stop_freq) { int result,i; int *v_stop_freq = NULL; int k1_min; int v_dstop[13]; int v_stop_freq_32[14] = {32,34,36,38,40,42,44,46,49,52,55,58,61,64}; int v_stop_freq_44[14] = {23,25,27,29,32,34,37,40,43,47,51,55,59,64}; int v_stop_freq_48[14] = {21,23,25,27,30,32,35,38,42,45,49,54,59,64}; /* counting previous operations */ switch(fs){ case 32000: k1_min = 32; v_stop_freq =v_stop_freq_32; break; case 44100: k1_min = 23; v_stop_freq =v_stop_freq_44; break; case 48000: k1_min = 21; v_stop_freq =v_stop_freq_48; break; default: k1_min = 21; /* illegal fs */ } /* v_dstop[] v_stop_freq[] */ for(i = 0; i <= 12; i++) { v_dstop[i] = v_stop_freq[i+1] - v_stop_freq[i]; } Shellsort_int(v_dstop, 13); result = k1_min; /* v_dstop[] */ for(i = 0; i < stop_freq; i++) { result = result + v_dstop[i]; } return result; }/* End getStopFreq */