⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 melp_chn.c

📁 MELPe 1200 bps, fixed point
💻 C
📖 第 1 页 / 共 3 页
字号:
		}

		unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[1][0]), 4, 1, 0);
		if ((uv1 != 1) && (uv2 != 1) && (cuv == 1)){
		    unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][0]),
						8, 1, 0);
			unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][1]),
						6, 1, 0);
			unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][2]),
						6, 1, 0);
			unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][3]),
						6, 1, 0);
			unpack_code(&bit_ptr, &bit_cntr, &dontcare, 3, 1, 0);
		} else {
		    unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][0]),
						8, 1, 0);
			unpack_code(&bit_ptr, &bit_cntr, &(qpar->lsf_index[2][1]),
						6, 1, 0);
		}
	}

	/* ====== Unpacking gain information ====== */
	unpack_code(&bit_ptr, &bit_cntr, &(qpar->gain_index[0]),
				GAIN_VQ_BITS, 1, 0);

	/* ====== Unpacking voicing information ====== */
	for (i = 0; i < NF; i++){
    	if (!qpar->uv_flag[i])
			unpack_code(&bit_ptr, &bit_cntr, &(qpar->bpvc_index[i]), 2, 1, 0);
	}
	if (cnt == 2)
	    unpack_code(&bit_ptr, &bit_cntr, &prot_bp1, 2, 1, 0);
	else if (cnt == 1){
	    unpack_code(&bit_ptr, &bit_cntr, &prot_bp2, 2, 1, 0);
		unpack_code(&bit_ptr, &bit_cntr, &prot_bp1, 2, 1, 0);
	} else if (cnt == 0){                                              /* UUU */
	    for (i = 0; i < NF; i++)
			unpack_code(&bit_ptr, &bit_cntr, &(qpar->bpvc_index[i]), 2, 1, 0);
	}

	/* ====== Unpacking Fourier magnitudes information ====== */
	unpack_code(&bit_ptr, &bit_cntr, &(qpar->fs_index), FS_BITS, 1, 0);

	/* ====== Unpacking jitter information ====== */
	unpack_code(&bit_ptr, &bit_cntr, &(qpar->jit_index[0]), 1, 1, 0);

	/* ====== FEC decoding ====== */
	erase = low_rate_fec_decode(qpar, erase, lsp_check);

	/* ====== Decode pitch information ====== */
	if (flag_dec_pitch == 1){
	    if (cnt == 0){
			for (i = 0; i < NF; i++)
		    	par[i].pitch = LOG_UV_PITCH_Q12;
		} else if (cnt == 1){
		    for (i = 0; i < NF; i++){
		    	if (!par[i].uv_flag)
			    	quant_u_dec(qpar->pitch_index, &par[i].pitch, 
							PIT_QLO_Q12, PIT_QUP_Q12, PIT_QLEV_M1_Q8, 7);
				else
					par[i].pitch = LOG_UV_PITCH_Q12;
				par[i].pitch = pow10_fxp(par[i].pitch, 7);
			}
		} else if (cnt > 1){
		    index = qpar->pitch_index;

			/* ----- set pointer -----*/
			if( cnt == NF )
				codebook = pitch_vq_cb_vvv;
			else
				codebook = pitch_vq_cb_uvv;
			
			for (i = 0; i < NF; i++){
				if (par[i].uv_flag == 1)
					par[i].pitch = UV_PITCH_Q7;
				else
					par[i].pitch = pow10_fxp(codebook[index*NF + i], 7);
			}
		}
	} else if (flag_dec_pitch == 2){
	    codebook = pitch_vq_cb_uvv;    /* = pitch_vq_cb_uvu = pitch_vq_cb_vvu */
		index = qpar->pitch_index;
		for (i = 0; i < NF; i++)
	    	par[i].pitch = pow10_fxp(codebook[index*NF + i], 7);
	}

	/* ====== Decode LSF information ====== */
	if (flag_dec_lsp){
		if ((uv1 == 1) && (uv2 == 1) && (cuv == 1)){
			deqnt_msvq(&(par[0].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[0], LPC_ORD);
			deqnt_msvq(&(par[1].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[1], LPC_ORD);
			deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[2], LPC_ORD);
		} else if ((uv1 == 1) && (uv2 == 1) && (cuv != 1)){
			deqnt_msvq(&(par[0].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[0], LPC_ORD);
			deqnt_msvq(&(par[1].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[1], LPC_ORD);
			deqnt_msvq(&(par[2].lsf[0]), lsp_v_256x64x32x32, 4, melp_v_cb_size,
					   qpar->lsf_index[2], LPC_ORD);
		} else if ((uv1 == 1) && (uv2 != 1) && (cuv == 1)){
			deqnt_msvq(&(par[0].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[0], LPC_ORD);
			deqnt_msvq(&(par[1].lsf[0]), lsp_v_256x64x32x32, 4, melp_v_cb_size,
				       qpar->lsf_index[1], LPC_ORD);
			deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[2], LPC_ORD);
		} else if ((uv1 != 1) && (uv2 == 1) && (cuv == 1)){
			deqnt_msvq(&(par[0].lsf[0]), lsp_v_256x64x32x32, 4, melp_v_cb_size,
					   qpar->lsf_index[0], LPC_ORD);
			deqnt_msvq(&(par[1].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[1], LPC_ORD);
			deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
					   qpar->lsf_index[2], LPC_ORD);
		} else {
		    if ((uv1 != 1) && (uv2 != 1) && (cuv == 1))
			    /* ---- Interpolation [4 inp + (8+6+6+6) res + 9 uv] ---- */
				deqnt_msvq(&(par[2].lsf[0]), lsp_uv_9, 1, melp_uv_cb_size,
						   qpar->lsf_index[0], LPC_ORD);
			else
				deqnt_msvq(&(par[2].lsf[0]), lsp_v_256x64x32x32, 4, 
						   melp_v_cb_size,	qpar->lsf_index[0], LPC_ORD);

			i = qpar->lsf_index[1][0];
			for (j = 0; j < LPC_ORD; j++){
				/*	ilsp1[j] = inpCoef[i][j] * qplsp[j] +
						   (1.0 - inpCoef[i][j]) * par[2].lsf[j]; */
				intfact = inpCoef[i][j];                               /* Q14 */
				L_acc = L_mult(intfact, qplsp[j]);                     /* Q14 */
				intfact = sub(ONE_Q14, intfact);
				L_acc = L_mac(L_acc, intfact, par[2].lsf[j]);
				ilsp1[j] = extract_h(L_shl(L_acc, 1));                 /* Q15 */
				/*	ilsp2[j] = inpCoef[i][j+10] * qplsp[j] +
						   (1.0 - inpCoef[i][j + LPC_ORD]) * par[2].lsf[j]; */
				intfact = inpCoef[i][j + LPC_ORD];                     /* Q14 */
				L_acc = L_mult(intfact, qplsp[j]);                     /* Q14 */
				intfact = sub(ONE_Q14, intfact);
				L_acc = L_mac(L_acc, intfact, par[2].lsf[j]);
				ilsp2[j] = extract_h(L_shl(L_acc, 1));                 /* Q15 */
			}

			if ((uv1 != 1) && (uv2 != 1) && (cuv == 1))
				deqnt_msvq(res, res256x64x64x64, 4, res_cb_size,
						   qpar->lsf_index[2], 20);
			else
				deqnt_msvq(res, res256x64x64x64, 2, res_cb_size,
						   qpar->lsf_index[2], 20);

			/* ---- reconstruct lsp ---- */
			for (i = 0; i < LPC_ORD; i++){
				/*	par[0].lsf[i] = (res[i] + ilsp1[i]); */
				temp1 = shr(res[i], 2);
				par[0].lsf[i] = add(temp1, ilsp1[i]);                  /* Q15 */
				/*	par[1].lsf[i] = (res[i + LPC_ORD] + ilsp2[i]); */
				temp2 = shr(res[i + LPC_ORD], 2);
				par[1].lsf[i] = add(temp2, ilsp2[i]);                  /* Q15 */
			}
		}

		/* --- FEC LSP check --- */
		if (uv1 == 1 && uv2 == 1 && cuv == 1){
		    if (lsp_check[0] == 1 && lsp_check[1] == 1 && lsp_check[2] == 1){
			    for (i = 0; i < LPC_ORD; i++){
					par[0].lsf[i] = prev_par->lsf[i];
					par[1].lsf[i] = prev_par->lsf[i];
					par[2].lsf[i] = prev_par->lsf[i];
				}
			} else if (lsp_check[0] == 1 && lsp_check[1] == 1 &&
					   lsp_check[2] == 0){
			    for (i = 0; i < LPC_ORD; i++){
			        par[0].lsf[i] = add(mult(prev_par->lsf[i], X0667_Q15), 
										mult(par[2].lsf[i],X0333_Q15));
					par[1].lsf[i] = add(mult(prev_par->lsf[i], X0333_Q15), 
										mult(par[2].lsf[i], X0667_Q15));
				}
			} else if (lsp_check[0] == 1 && lsp_check[1] == 0 &&
					   lsp_check[2] == 1){
			    for (i = 0; i < LPC_ORD; i++){
					par[0].lsf[i] = add(shr(prev_par->lsf[i], 1), 
										shr(par[1].lsf[i], 1));
					par[2].lsf[i] = par[1].lsf[i];
				}
			} else if (lsp_check[0] == 0 && lsp_check[1] == 1 &&
					   lsp_check[2] == 1){
			    for (i = 0; i < LPC_ORD; i++){
					par[1].lsf[i] = par[0].lsf[i];
					par[2].lsf[i] = par[0].lsf[i];
				}
			} else if (lsp_check[0] == 1 && lsp_check[1] == 0 &&
					   lsp_check[2] == 0){
			    for (i = 0; i < LPC_ORD; i++)
					par[0].lsf[i] = add(shr(prev_par->lsf[i], 1),
										shr(par[1].lsf[i], 1));
			} else if (lsp_check[0] == 0 && lsp_check[1] == 1 &&
					   lsp_check[2] == 0){
			    for (i = 0; i < LPC_ORD; i++)
			    	par[1].lsf[i] = add(shr(par[0].lsf[i], 1),
										shr(par[2].lsf[i], 1));
			} else if (lsp_check[0] == 0 && lsp_check[1] == 0 &&
					   lsp_check[2] == 1){
			    for (i = 0; i < LPC_ORD; i++){
			    	par[2].lsf[i] = par[1].lsf[i];
				}
			}
		}

		/* ---- stable checking ---- */
		if (!lspStable (par[0].lsf, LPC_ORD))
			lspSort (par[0].lsf, LPC_ORD);
		if (!lspStable(par[1].lsf, LPC_ORD))
		    lspSort (par[1].lsf, LPC_ORD);
		if (!lspStable(par[2].lsf, LPC_ORD))
		    lspSort (par[2].lsf, LPC_ORD);

		/* ---- Save for next frame ---- */
		v_equ(qplsp, par[NF - 1].lsf, LPC_ORD);
	} else {
	    for (i = 0; i < NF; i++)
	    	v_equ(par[i].lsf, prev_par->lsf, LPC_ORD);
		v_equ(qplsp, par[NF - 1].lsf, LPC_ORD);
	}

	/* ====== Decode gain information ====== */
	index = qpar->gain_index[0];
	for (i = 0; i < NF; i++){
		for (j = 0; j < NUM_GAINFR; j++)
			par[i].gain[j] = gain_vq_cb[index*NUM_GAINFR*NF + i*NUM_GAINFR + j];
	}

	/* ====== Decode voicing information ====== */
	for (i = 0; i < NF; i++){
	    index = inv_bp_index_map[qpar->bpvc_index[i]];
		q_bpvc_dec(&(par[i].bpvc[0]), index, qpar->uv_flag[i], NUM_BANDS);
	}

	/* ====== Decode Fourier magnitudes information ====== */
	if (cnt != 0){
		index = qpar->fs_index;
		v_equ(par[last].fs_mag, &(fsvq_cb[NUM_HARM*index]), NUM_HARM);
		v_equ(weighted_fsmag, par[last].fs_mag, NUM_HARM);
	}

	if (cnt > 1){
		if (prev_uv){                                  /* U {UVV,VUV,VVU,VVV} */
			for (i = 0; i < last; i++)
				if (!par[i].uv_flag)
					v_equ(par[i].fs_mag, par[last].fs_mag, NUM_HARM);
		} else {
			if (par[0].uv_flag)                                      /* V UVV */
				v_equ(par[1].fs_mag, par[last].fs_mag, NUM_HARM);
			else if (par[1].uv_flag)                                 /* V VUV */
				v_equ(par[0].fs_mag, prev_fsmag, NUM_HARM);
			else if (par[2].uv_flag){                                /* V VVU */
				for (i = 0; i < NUM_HARM; i++){
					/*	par[0].fs_mag[i] = 0.5*(weighted_fsmag[i] +
												prev_fsmag[i]); */
					temp1 = shr(weighted_fsmag[i], 1);                 /* Q13 */
					temp2 = shr(prev_fsmag[i], 1);                     /* Q13 */
					par[0].fs_mag[i] = add(temp1, temp2);              /* Q13 */
				}
			} else {                                                 /* V VVV */
				for (i = 0; i < NUM_HARM; i++){
					p_value = prev_fsmag[i];
					q_value = weighted_fsmag[i];

					/*	par[0].fs_mag[i] = (p + p + q)/3.0; */
					temp1 = mult(p_value, X0667_Q15);
					temp2 = mult(q_value, X0333_Q15);
					par[0].fs_mag[i] = add(temp1, temp2);              /* Q13 */
					/*	par[1].fs_mag[i] = (p + q + q)/3.0; */
					temp1 = mult(p_value, X0333_Q15);
					temp2 = mult(q_value, X0667_Q15);
					par[1].fs_mag[i] = add(temp1, temp2);              /* Q13 */
				}
			}
		}
	}

	prev_uv = par[NF - 1].uv_flag;
	if (par[NF - 1].uv_flag){
		fill(prev_fsmag, ONE_Q13, NUM_HARM);
		window_Q(prev_fsmag, w_fs, prev_fsmag, NUM_HARM, 14);
	}else
		v_equ(prev_fsmag, par[NF - 1].fs_mag, NUM_HARM);

	/* ====== Decode jitter information ====== */
	for (i = 0; i < NF; i++){
	    if (par[i].uv_flag == 1)
			par[i].jitter = MAX_JITTER_Q15;
		else
		    par[i].jitter = 0;
	}

	if (cnt != 0 || !(uv1 == 0 && uv2 == 1 && cuv == 0)){
	    if (qpar->jit_index[0] == 1){
			if (uv1 && uv2 && cuv);                                    /* UUU */
			else if (uv1 && uv2 && !cuv)                               /* UUV */
				par[2].jitter = MAX_JITTER_Q15;
			else if (uv1 && !uv2 && cuv)                               /* UVU */
			    par[1].jitter = MAX_JITTER_Q15;
			else if (!uv1 && uv2 && cuv)                               /* VUU */
			    par[0].jitter = MAX_JITTER_Q15;
			else if (uv1 && !uv2 && !cuv)                              /* UVV */
			    par[1].jitter = MAX_JITTER_Q15;
			else if (!uv1 && uv2 && !cuv);                             /* VUV */
			else if (!uv1 && !uv2 && cuv)                              /* VVU */
			    par[1].jitter = MAX_JITTER_Q15;
			else                                                       /* VVV */
			    par[0].jitter = par[1].jitter = par[2].jitter = MAX_JITTER_Q15;
		}
	}

	if (flag_parity){
	    p_value = prev_par->pitch;
		for (i = 0; i < NF; i++){
		    if (par[i].uv_flag)
				par[i].pitch = UV_PITCH_Q7;
			else
			    par[i].pitch = add(mult(SMOOTH, p_value),
								   mult(sub(32767, SMOOTH), par[i].pitch));
			p_value = par[i].pitch;
		}
		p_value = prev_par->gain[1];
		for (i = 0; i < NF; i++){
		    for (j = 0; j < NUM_GAINFR; j++){
		        par[i].gain[j] = add(mult(SMOOTH, p_value),
									 mult(sub(32767, SMOOTH), par[i].gain[j]));
				p_value = par[i].gain[j];
			}
		}
		for (j = 0; j < LPC_ORD; j++){
			p_value = prev_par->lsf[j];
			for (i = 0; i < NF; i++){
		        par[i].lsf[j] = add(mult(SMOOTH, p_value),
									mult(sub(32767, SMOOTH), par[i].lsf[j]));
				p_value = par[i].lsf[j];
			}
		}
	} else {

        /* gain check */

		L_sum1 = 0;
		for (i = 0; i < 2*NF*NUM_GAINFR; i++)
			L_sum1 = L_add(L_sum1, L_deposit_l(prev_gain[i]));
		L_sum1 = L_shr(L_sum1, 1);

		L_sum2 = 0;
		for (i = 0; i < NF; i++){
			for (j = 0; j < NUM_GAINFR; j++)
				L_sum2 = L_add(L_sum2, L_deposit_l(par[i].gain[j]));
		}

		if (L_sum2 > L_add(L_sum1, 92160L) || L_sum2 < L_sub(L_sum1, 92160L)){
			L_sum1 = L_shr(L_sum1, 1);
			L_sum1 = L_mpy_ls(L_sum1, 10923);
			temp1 = extract_l(L_sum1);
			for (i = 0; i < NF; i++){
				for (j = 0; j < NUM_GAINFR; j++){
					par[i].gain[j] = add(mult(SMOOTH, temp1),
										 mult(sub(32767, SMOOTH),
											  par[i].gain[j]));
					temp1 = par[i].gain[j];
				}
			}
		}
	}

	for (i = 0; i < NF*NUM_GAINFR; i++)
		prev_gain[i] = prev_gain[i + NF*NUM_GAINFR];
	for (i = 0; i < NF; i++){
	    for (j = 0; j < NUM_GAINFR; j++)
			prev_gain[NF*NUM_GAINFR + i*NUM_GAINFR + j] = par[i].gain[j];
	}

	if (erase){
		for (i = 0; i < NF; i++){
			par[i].pitch = UV_PITCH_Q7;
	    	v_equ(par[i].lsf, prev_par->lsf, LPC_ORD);
			for (j = 0; j < NUM_GAINFR; j++)
				par[i].gain[j] = prev_par->gain[1];
			fill(&(par[i].bpvc[0]), 0, NUM_BANDS);
			fill(&(par[i].fs_mag[0]), ONE_Q13, NUM_HARM);
			par[i].jitter = MAX_JITTER_Q15;
		}
		v_equ(qplsp, par[NF - 1].lsf, LPC_ORD);
		prev_uv = 1;
		fill(prev_fsmag, ONE_Q13, NUM_HARM);
	} else if (erase_uuu){
	    for (i = 0; i < NF; i++){
			par[i].pitch = UV_PITCH_Q7;
			fill(&(par[i].bpvc[0]), 0, NUM_BANDS);
			fill(&(par[i].fs_mag[0]), ONE_Q13, NUM_HARM);
			par[i].jitter = MAX_JITTER_Q15;
		}

		prev_uv = 1;
		fill(prev_fsmag, ONE_Q13, NUM_HARM);
	} else if (erase_vvv){
	    for (i = 0; i < NF; i++){
			fill(&(par[i].bpvc[1]), 0, NUM_BANDS - 1);
			fill(&(par[i].fs_mag[0]), ONE_Q13, NUM_HARM);
		}
		prev_uv = 0;
		fill(prev_fsmag, ONE_Q13, NUM_HARM);
	}

	/* Return erase flag */
	return(erase);
}

Shortword parity(Shortword x, Shortword leng)
{
	register Shortword	i;
	Shortword	p = 0x0;


	for (i = 0; i < leng; i++){
		p ^= x & 0x1;
		x >>= 1;
	}
	return(p);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -