void blockEncoder( bool init, bool color_mode, int sampling, unsigned short imagewidth, unsigned short imageheight, unsigned char Standard_Luminance_Quantization_Table[64] , unsigned char Standard_Chromiance_Quantization_Table0[64] , unsigned char Standard_Chromiance_Quantization_Table1[64] , const unsigned char buffer[MAX_ROWBUF_WIDTH*3*8], pixel_queue_t& queue,bool flush ) { yuv_t yQ[64]; yuv_t uQ[64]; yuv_t vQ[64]; freq_t yfrqQ[64]; freq_t ufrqQ[64]; freq_t vfrqQ[64]; freq_t yquantQ[64]; freq_t uquantQ[64]; freq_t vquantQ[64]; bits_t yBitQ[MAX_HUFF]; bits_t uBitQ[MAX_HUFF]; bits_t vBitQ[MAX_HUFF]; bits_t emptyBitQ[1]; bitlen_t yBitLenQ[MAX_HUFF]; bitlen_t uBitLenQ[MAX_HUFF]; bitlen_t vBitLenQ[MAX_HUFF]; bitlen_t emptyBitLenQ[1]; unsigned char yLen, uLen, vLen, emptyLen; emptyLen=1; bool ydcten, udcten, vdcten, yqen, vqen, uqen, yhen, uhen, vhen; colorBuffer( color_mode, sampling, imagewidth, buffer, yQ, uQ, vQ, ydcten, udcten, vdcten); dct(ydcten, yQ,yfrqQ, yqen); dct(udcten, uQ,ufrqQ, vqen); dct(vdcten, vQ,vfrqQ, uqen); quant_y(yqen, Standard_Luminance_Quantization_Table, yfrqQ, yquantQ , yhen); quant_u(vqen, Standard_Chromiance_Quantization_Table0, ufrqQ, uquantQ, uhen); quant_v(uqen, Standard_Chromiance_Quantization_Table1, vfrqQ, vquantQ, vhen); huffman_Y (yhen, yquantQ, yBitQ, yBitLenQ, yLen); huffman_UV(uhen, uquantQ, uBitQ, uBitLenQ,U_DATA,uLen); huffman_UV(vhen, vquantQ, vBitQ, vBitLenQ,V_DATA,vLen); bitWriter(yBitQ, yBitLenQ,yLen,false, queue); bitWriter(uBitQ, uBitLenQ,uLen,false, queue); bitWriter(vBitQ, vBitLenQ,vLen,false, queue); bitWriter(emptyBitQ, emptyBitLenQ,emptyLen,false, queue); }
void *analyzer() { clock_t t1, t2; //short ana_arr[540] = {0}; float act_time,msec; unsigned char enc_speech[11]; unsigned char array1[176] = {0x00}; int b = 0, loc = 0, count_64blocks = 0; int i = 0; while(count != 0) { sem_wait(&id_analyzer); //sem_wait(&mutx); //if (count_64blocks == 0) t1 = clock(); memcpy(ana_arr, buff, 1080); sem_post(&empty); //t1 = clock(); num_frames = (int16_t) ((rate == RATE2400) ? 1 : NF); //for (i = 0; i < num_frames; i++) //{ // dc_rmv(&ana_arr[i * FRAME], &hpspeech[IN_BEG + i * FRAME], // dcdelin, dcdelout_hi, dcdelout_lo, FRAME); // //melp_ana(&hpspeech[i * FRAME], &melp_par[i], i); //} dc_rmv(&ana_arr[0], &hpspeech[IN_BEG + 0], dcdelin, dcdelout_hi, dcdelout_lo, FRAME); melp_ana(&hpspeech[0], &melp_par[0],0); dc_rmv(&ana_arr[FRAME], &hpspeech[IN_BEG + FRAME], dcdelin, dcdelout_hi, dcdelout_lo, FRAME); melp_ana(&hpspeech[FRAME], &melp_par[1], 1); dc_rmv(&ana_arr[2 * FRAME], &hpspeech[IN_BEG + 2 * FRAME], dcdelin, dcdelout_hi, dcdelout_lo, FRAME); melp_ana(&hpspeech[2 * FRAME], &melp_par[2], 2); /*sem_post(&start_melp_1ana); sem_post(&start_melp_2ana); sem_post(&start_melp_3ana); sem_wait(&melp_1ana); sem_wait(&melp_2ana); sem_wait(&melp_3ana);*/ sc_ana(melp_par); /* ======== Quantization ======== */ lpc[0] = ONE_Q12; lsf_vq(melp_par); pitch_vq(melp_par); gain_vq(melp_par); quant_u(&melp_par[0].jitter, &(quant_par.jit_index[0]), 0, MAX_JITTER_Q15, 2, ONE_Q15, 1, 7); quant_u(&melp_par[1].jitter, &(quant_par.jit_index[1]), 0, MAX_JITTER_Q15, 2, ONE_Q15, 1, 7); quant_u(&melp_par[2].jitter, &(quant_par.jit_index[2]), 0, MAX_JITTER_Q15, 2, ONE_Q15, 1, 7); //for (i = 0; i < NF; i++) // quant_u(&melp_par[i].jitter, &(quant_par.jit_index[i]), 0, // MAX_JITTER_Q15, 2, ONE_Q15, 1, 7); /* Quantize bandpass voicing */ quant_bp(melp_par, num_frames); quant_jitter(melp_par); /* Calculate Fourier coeffs of residual from quantized LPC */ //for (i = 0; i < num_frames; i++) //{ // /* The following fill() action is believed to be unnecessary. */ // //fill(melp_par[i].fs_mag, ONE_Q13, NUM_HARM); // // if (!melp_par[i].uv_flag) // { // lpc_lsp2pred(melp_par[i].lsf, &(lpc[1]), LPC_ORD); // zerflt(&hpspeech // [(i * FRAME + FRAME_END - (LPC_FRAME / 2))], lpc, // sigbuf, LPC_ORD, LPC_FRAME); // // window(sigbuf, win_cof, sigbuf, LPC_FRAME); // // find_harm(sigbuf, melp_par[i].fs_mag, melp_par[i].pitch, NUM_HARM, // LPC_FRAME); // } //} i = 0; if (!melp_par[i].uv_flag) { lpc_lsp2pred(melp_par[i].lsf, &(lpc[1]), LPC_ORD); zerflt(&hpspeech [(i * FRAME + FRAME_END - (LPC_FRAME / 2))], lpc, sigbuf, LPC_ORD, LPC_FRAME); window(sigbuf, win_cof, sigbuf, LPC_FRAME); find_harm(sigbuf, melp_par[i].fs_mag, melp_par[i].pitch, NUM_HARM, LPC_FRAME); } i = 1; if (!melp_par[i].uv_flag) { lpc_lsp2pred(melp_par[i].lsf, &(lpc[1]), LPC_ORD); zerflt(&hpspeech [(i * FRAME + FRAME_END - (LPC_FRAME / 2))], lpc, sigbuf, LPC_ORD, LPC_FRAME); window(sigbuf, win_cof, sigbuf, LPC_FRAME); find_harm(sigbuf, melp_par[i].fs_mag, melp_par[i].pitch, NUM_HARM, LPC_FRAME); } i = 2; if (!melp_par[i].uv_flag) { lpc_lsp2pred(melp_par[i].lsf, &(lpc[1]), LPC_ORD); zerflt(&hpspeech [(i * FRAME + FRAME_END - (LPC_FRAME / 2))], lpc, sigbuf, LPC_ORD, LPC_FRAME); window(sigbuf, win_cof, sigbuf, LPC_FRAME); find_harm(sigbuf, melp_par[i].fs_mag, melp_par[i].pitch, NUM_HARM, LPC_FRAME); } quant_fsmag(melp_par); //for (i = 0; i < num_frames; i++) // quant_par.uv_flag[i] = melp_par[i].uv_flag; quant_par.uv_flag[0] = melp_par[0].uv_flag; quant_par.uv_flag[1] = melp_par[1].uv_flag; quant_par.uv_flag[2] = melp_par[2].uv_flag; /* Write channel bitstream */ #if !SKIP_CHANNEL low_rate_chn_write(&quant_par); #endif /* Update delay buffers for next block */ v_equ(hpspeech, &(hpspeech[num_frames * FRAME]), IN_BEG); memcpy(enc_speech,chbuf,11); /*======================old content of melp thread======================*/ //melpe_a(enc_speech, buff); //fwrite(enc_speech,sizeof(char),11,fptr); //======================================================================= // ather_jawad work for 2400 baudrate //======================================================================= for (b=0; b<11; b++) { array1[loc] = enc_speech[b]; loc++; } count_64blocks = count_64blocks + 1; if(count_64blocks == 16) { loc = 0; memcpy(array2,array1,176); sem_post(&last); count_64blocks = 0; } t2 = clock() - t1; //printf("Time %d = %f\n\n",count_64blocks,(float)t2/CLOCKS_PER_SEC); //sem_post(&full); } pthread_exit(NULL); }
/**************************************************************************** ** ** Function: pitch_vq ** ** Description: Pitch values of three frames are vector quantized ** ** Arguments: ** ** melp_param *par ---- input/output melp parameters ** ** Return value: None ** *****************************************************************************/ void pitch_vq(struct melp_param *par) { register int16_t i; static BOOLEAN prev_uv_flag = TRUE; static int16_t prev_pitch = LOG_UV_PITCH_Q12; /* Q12 */ static int16_t prev_qpitch = LOG_UV_PITCH_Q12; /* Q12 */ const int16_t *codebook; int16_t cnt, size, pitch_index; int16_t temp1, temp2; int32_t L_temp; int16_t dcb[PITCH_VQ_CAND * NF]; /* Q12 */ int16_t target[NF], deltp[NF]; /* Q12 */ int16_t deltw[NF]; /* Q0 */ int16_t weights[NF]; /* Q0 */ int16_t indexlist[PITCH_VQ_CAND]; int32_t distlist[PITCH_VQ_CAND]; /* Q25 */ /* ---- Compute pitch in log domain ---- */ for (i = 0; i < NF; i++) target[i] = log10_fxp(par[i].pitch, 7); /* Q12 */ cnt = 0; for (i = 0; i < NF; i++) { if (par[i].uv_flag) weights[i] = 0; /* Q0 */ else { weights[i] = 1; cnt++; } } /* ---- calculate delta ---- */ for (i = 0; i < NF; i++) { if (prev_uv_flag || par[i].uv_flag) { deltp[i] = 0; deltw[i] = 0; } else { deltp[i] = melpe_sub(target[i], prev_pitch); deltw[i] = DELTA_PITCH_WEIGHT_Q0; } prev_pitch = target[i]; prev_uv_flag = par[i].uv_flag; } if (cnt == 0) { for (i = 0; i < NF; i++) par[i].pitch = UV_PITCH; prev_qpitch = LOG_UV_PITCH_Q12; } else if (cnt == 1) { for (i = 0; i < NF; i++) { if (!par[i].uv_flag) { quant_u(&target[i], &(quant_par.pitch_index), PIT_QLO_Q12, PIT_QUP_Q12, PIT_QLEV_M1, PIT_QLEV_M1_Q8, TRUE, 7); quant_u_dec(quant_par.pitch_index, &par[i].pitch, PIT_QLO_Q12, PIT_QUP_Q12, PIT_QLEV_M1_Q8, 7); } else par[i].pitch = LOG_UV_PITCH_Q12; } /* At this point par[].pitch temporarily holds the pitches in the */ /* log domain with Q12. */ prev_qpitch = par[NF - 1].pitch; /* Q12 */ for (i = 0; i < NF; i++) par[i].pitch = pow10_fxp(par[i].pitch, 7); /* Q7 */ } else if (cnt > 1) { /* cnt == 2, 3, ......, (NF - 1) */ /* ----- set pointer ----- */ if (cnt == NF) { /* All NF frames are voiced. */ codebook = pitch_vq_cb_vvv; size = PITCH_VQ_LEVEL_VVV; } else { codebook = pitch_vq_cb_uvv; size = PITCH_VQ_LEVEL_UVV; } /* This part changed !!! (12/13/99) */ /* ---- select candidate using static pitch distortion ---- */ wvq1(target, weights, codebook, NF, size, indexlist, distlist, PITCH_VQ_CAND); /* -- select index using static and delta pitch distortion -- */ temp1 = 0; for (i = 0; i < PITCH_VQ_CAND; i++) { L_temp = melpe_L_mult(indexlist[i], NF); L_temp = melpe_L_shr(L_temp, 1); temp2 = melpe_extract_l(L_temp); /* Now temp1 is (i*NF) and temp2 is (indexlist[i]*NF). */ dcb[temp1] = melpe_sub(codebook[temp2], prev_qpitch); /* Q12 */ v_equ(&dcb[temp1 + 1], &codebook[temp2 + 1], NF - 1); v_sub(&dcb[temp1 + 1], &codebook[temp2], NF - 1); temp1 = melpe_add(temp1, NF); } pitch_index = wvq2(deltp, deltw, dcb, NF, indexlist, distlist, PITCH_VQ_CAND); if (par[NF - 1].uv_flag) prev_qpitch = LOG_UV_PITCH_Q12; else prev_qpitch = codebook[pitch_index * NF + NF - 1]; /* Q12 */ for (i = 0; i < NF; i++) { if (par[i].uv_flag) par[i].pitch = UV_PITCH_Q7; else par[i].pitch = pow10_fxp(codebook[pitch_index * NF + i], 7); } quant_par.pitch_index = pitch_index; } }
void melp_ana(float sp_in[],struct melp_param *par) { int i; int begin; float sub_pitch; float temp,pcorr,bpthresh; float r[LPC_ORD+1],refc[LPC_ORD+1],lpc[LPC_ORD+1]; float weights[LPC_ORD]; /* Remove DC from input speech */ dc_rmv(sp_in,&speech[IN_BEG],dcdel,FRAME); /* Copy input speech to pitch window and lowpass filter */ v_equ(&sigbuf[LPF_ORD],&speech[PITCH_BEG],PITCH_FR); v_equ(sigbuf,lpfsp_del,LPF_ORD); polflt(&sigbuf[LPF_ORD],lpf_den,&sigbuf[LPF_ORD],LPF_ORD,PITCH_FR); v_equ(lpfsp_del,&sigbuf[FRAME],LPF_ORD); zerflt(&sigbuf[LPF_ORD],lpf_num,&sigbuf[LPF_ORD],LPF_ORD,PITCH_FR); /* Perform global pitch search at frame end on lowpass speech signal */ /* Note: avoid short pitches due to formant tracking */ fpitch[END] = find_pitch(&sigbuf[LPF_ORD+(PITCH_FR/2)],&temp, (2*PITCHMIN),PITCHMAX,PITCHMAX); /* Perform bandpass voicing analysis for end of frame */ bpvc_ana(&speech[FRAME_END], fpitch, &par->bpvc[0], &sub_pitch); /* Force jitter if lowest band voicing strength is weak */ if (par->bpvc[0] < VJIT) par->jitter = MAX_JITTER; else par->jitter = 0.0; /* Calculate LPC for end of frame */ window(&speech[(FRAME_END-(LPC_FRAME/2))],win_cof,sigbuf,LPC_FRAME); autocorr(sigbuf,r,LPC_ORD,LPC_FRAME); lpc[0] = 1.0; lpc_schur(r,lpc,refc,LPC_ORD); lpc_bw_expand(lpc,lpc,BWFACT,LPC_ORD); /* Calculate LPC residual */ zerflt(&speech[PITCH_BEG],lpc,&sigbuf[LPF_ORD],LPC_ORD,PITCH_FR); /* Check peakiness of residual signal */ begin = (LPF_ORD+(PITCHMAX/2)); temp = peakiness(&sigbuf[begin],PITCHMAX); /* Peakiness: force lowest band to be voiced */ if (temp > PEAK_THRESH) { par->bpvc[0] = 1.0; } /* Extreme peakiness: force second and third bands to be voiced */ if (temp > PEAK_THR2) { par->bpvc[1] = 1.0; par->bpvc[2] = 1.0; } /* Calculate overall frame pitch using lowpass filtered residual */ par->pitch = pitch_ana(&speech[FRAME_END], &sigbuf[LPF_ORD+PITCHMAX], sub_pitch,pitch_avg,&pcorr); bpthresh = BPTHRESH; /* Calculate gain of input speech for each gain subframe */ for (i = 0; i < NUM_GAINFR; i++) { if (par->bpvc[0] > bpthresh) { /* voiced mode: pitch synchronous window length */ temp = sub_pitch; par->gain[i] = gain_ana(&speech[FRAME_BEG+(i+1)*GAINFR], temp,MIN_GAINFR,2*PITCHMAX); } else { temp = 1.33*GAINFR - 0.5; par->gain[i] = gain_ana(&speech[FRAME_BEG+(i+1)*GAINFR], temp,0,2*PITCHMAX); } } /* Update average pitch value */ if (par->gain[NUM_GAINFR-1] > SILENCE_DB) temp = pcorr; else temp = 0.0; pitch_avg = p_avg_update(par->pitch, temp, VMIN); /* Calculate Line Spectral Frequencies */ lpc_pred2lsp(lpc,par->lsf,LPC_ORD); /* Force minimum LSF bandwidth (separation) */ lpc_clamp(par->lsf,BWMIN,LPC_ORD); /* Quantize MELP parameters to 2400 bps and generate bitstream */ /* Quantize LSF's with MSVQ */ vq_lspw(weights, &par->lsf[1], lpc, LPC_ORD); msvq_enc(&par->lsf[1], weights, &par->lsf[1], vq_par); par->msvq_index = vq_par.indices; /* Force minimum LSF bandwidth (separation) */ lpc_clamp(par->lsf,BWMIN,LPC_ORD); /* Quantize logarithmic pitch period */ /* Reserve all zero code for completely unvoiced */ par->pitch = log10(par->pitch); quant_u(&par->pitch,&par->pitch_index,PIT_QLO,PIT_QUP,PIT_QLEV); par->pitch = pow(10.0,par->pitch); /* Quantize gain terms with uniform log quantizer */ q_gain(par->gain, par->gain_index,GN_QLO,GN_QUP,GN_QLEV); /* Quantize jitter and bandpass voicing */ quant_u(&par->jitter,&par->jit_index,0.0,MAX_JITTER,2); par->uv_flag = q_bpvc(&par->bpvc[0],&par->bpvc_index,bpthresh, NUM_BANDS); /* Calculate Fourier coefficients of residual signal from quantized LPC */ fill(par->fs_mag,1.0,NUM_HARM); if (par->bpvc[0] > bpthresh) { lpc_lsp2pred(par->lsf,lpc,LPC_ORD); zerflt(&speech[(FRAME_END-(LPC_FRAME/2))],lpc,sigbuf, LPC_ORD,LPC_FRAME); window(sigbuf,win_cof,sigbuf,LPC_FRAME); find_harm(sigbuf, par->fs_mag, par->pitch, NUM_HARM, LPC_FRAME); } /* quantize Fourier coefficients */ /* pre-weight vector, then use Euclidean distance */ window(&par->fs_mag[0],w_fs,&par->fs_mag[0],NUM_HARM); fsvq_enc(&par->fs_mag[0], &par->fs_mag[0], fs_vq_par); /* Set MELP indeces to point to same array */ par->fsvq_index = fs_vq_par.indices; /* Update MSVQ information */ par->msvq_stages = vq_par.num_stages; par->msvq_bits = vq_par.num_bits; /* Write channel bitstream */ melp_chn_write(par); /* Update delay buffers for next frame */ v_equ(&speech[0],&speech[FRAME],IN_BEG); fpitch[BEGIN] = fpitch[END]; }