📄 pan_lspqtz2_dd.c
字号:
long d_idx_tmp2, rd_idx_tmp2; long idx_tmp[2*PAN_N_DC_LSP_MAX]; long i_tmp[PAN_N_DC_LSP_MAX]; if(lpc_order>PAN_DIM_MAX) { printf("\n LSP quantizer: LPC order exceeds the limit\n"); exit(1); } if(num_dc>PAN_N_DC_LSP_MAX) { printf("\n LSP quantizer: number of delayed candidates exceeds the limit\n"); exit(1); }/* 1st stage vector quantization */ pan_v_qtz_w_dd(&in[0], i_tmp, ncd_1[0], &tbl[0], dim_1[0], &weight[0], num_dc); for(i=0;i<num_dc;i++) idx_tmp[2*i] = i_tmp[i]; pan_v_qtz_w_dd(&in[dim_1[0]], i_tmp, ncd_1[1], &tbl[dim_1[0]*ncd_1[0]], dim_1[1], &weight[dim_1[0]], num_dc); for(i=0;i<num_dc;i++) idx_tmp[2*i+1] = i_tmp[i];/* quantized value */for(j=0;j<num_dc;j++) { for(i=0;i<dim_1[0];i++) { out_v[lpc_order*j+i] = tbl[dim_1[0]*idx_tmp[2*j]+i]; } for(i=0;i<dim_1[1];i++) { out_v[lpc_order*j+dim_1[0]+i] = tbl[dim_1[0]*ncd_1[0]+dim_1[1]*idx_tmp[2*j+1]+i]; }}/* ------------------------------------------------------------------ *//* 2nd stage vector quantization */for(j=0;j<num_dc;j++) { pan_d_qtz_w(&in[0], &out_v[lpc_order*j], &d_idx[2*j], ncd_2[0], &d_tbl[0], dim_2[0], &weight[0]); pan_d_qtz_w(&in[dim_2[0]], &out_v[lpc_order*j+dim_2[0]], &d_idx[2*j+1], ncd_2[1], &d_tbl[dim_2[0]*ncd_2[0]], dim_2[1], &weight[dim_2[0]]);/* quantized value */ if(d_idx[2*j]<ncd_2[0]) { for(i=0;i<dim_2[0];i++) { qv_d[lpc_order*j+i] = out_v[lpc_order*j+i]+d_tbl[d_idx[2*j]*dim_2[0]+i]; } }else { for(i=0;i<dim_2[0];i++) { qv_d[lpc_order*j+i] = out_v[lpc_order*j+i]-d_tbl[(d_idx[2*j]-ncd_2[0])*dim_2[0]+i]; } } if(d_idx[2*j+1]<ncd_2[1]) { for(i=0;i<dim_2[1];i++) { qv_d[lpc_order*j+dim_2[0]+i] = out_v[lpc_order*j+dim_2[0]+i] + d_tbl[dim_2[0]*ncd_2[0]+d_idx[2*j+1]*dim_2[1]+i]; } }else { for(i=0;i<dim_2[1];i++) { qv_d[lpc_order*j+dim_2[0]+i] = out_v[lpc_order*j+dim_2[0]+i] - d_tbl[dim_2[0]*ncd_2[0] + (d_idx[2*j+1]-ncd_2[1])*dim_2[1]+i]; } }}/* ------------------------------------------------------------------ *//* 2nd stage predictive vector quantization */for(j=0;j<num_dc;j++) { pan_rd_qtz2_w(&in[0], &out_p[0], &out_v[lpc_order*j], &rd_idx[2*j], ncd_2[0], &rd_tbl[0], dim_2[0], &weight[0], p_factor); pan_rd_qtz2_w(&in[dim_2[0]], &out_p[dim_2[0]], &out_v[lpc_order*j+dim_2[0]], &rd_idx[2*j+1], ncd_2[1], &rd_tbl[dim_2[0]*ncd_2[0]], dim_2[1], &weight[dim_2[0]], p_factor);/* quantized value */ if(rd_idx[2*j]<ncd_2[0]) { for(i=0;i<dim_2[0];i++) { qv_rd[lpc_order*j+i] = (p_factor*out_p[i] + (1.-p_factor)*out_v[lpc_order*j+i]) + rd_tbl[rd_idx[2*j]*dim_2[0]+i]; } }else { for(i=0;i<dim_2[0];i++) { qv_rd[lpc_order*j+i] = (p_factor*out_p[i] + (1.-p_factor)*out_v[lpc_order*j+i]) - rd_tbl[(rd_idx[2*j]-ncd_2[0])*dim_2[0]+i]; } } if(rd_idx[2*j+1]<ncd_2[1]) { for(i=0;i<dim_2[1];i++) { qv_rd[lpc_order*j+dim_2[0]+i] = (p_factor*out_p[dim_2[0]+i] + (1.-p_factor)*out_v[lpc_order*j+dim_2[0]+i]) + rd_tbl[dim_2[0]*ncd_2[0] + rd_idx[2*j+1]*dim_2[1]+i]; } }else { for(i=0;i<dim_2[1];i++) { qv_rd[lpc_order*j+dim_2[0]+i] = (p_factor*out_p[dim_2[0]+i] + (1.-p_factor)*out_v[lpc_order*j+dim_2[0]+i]) - rd_tbl[dim_2[0]*ncd_2[0] +(rd_idx[2*j+1]-ncd_2[1])*dim_2[1]+i]; } }}/* ------------------------------------------------------------------ *//* Quantization mode selection */if(0==dim_1[1]) {/* PVQ */ dist_rd_min1 = 1.0e9; dist_rd_min2 = 1.0e9; rd_idx_tmp1 = 0; rd_idx_tmp2 = 0; for(j=0;j<num_dc;j++) { dist_rd1 = 0.; for(i=0;i<dim_2[0];i++) dist_rd1 += (in[i]-qv_rd[lpc_order*j+i]) *(in[i]-qv_rd[lpc_order*j+i])*weight[i]; dist_rd2 = 0.; for(i=dim_2[0];i<dim_2[0]+dim_2[1];i++) dist_rd2 += (in[i]-qv_rd[lpc_order*j+i]) *(in[i]-qv_rd[lpc_order*j+i])*weight[i]; if(dist_rd1+dist_rd2<dist_rd_min1+dist_rd_min2) { dist_rd_min1 = dist_rd1; dist_rd_min2 = dist_rd2; rd_idx_tmp1 = j; rd_idx_tmp2 = j; } }/* DVQ */ dist_d_min1 = 1.0e9; dist_d_min2 = 1.0e9; d_idx_tmp1 = 0; d_idx_tmp2 = 0; for(j=0;j<num_dc;j++) { dist_d1 = 0.; for(i=0;i<dim_2[0];i++) dist_d1 += (in[i]-qv_d[lpc_order*j+i]) *(in[i]-qv_d[lpc_order*j+i])*weight[i]; dist_d2 = 0.; for(i=dim_2[0];i<dim_2[0]+dim_2[1];i++) dist_d2 += (in[i]-qv_d[lpc_order*j+i]) *(in[i]-qv_d[lpc_order*j+i])*weight[i]; if(dist_d1+dist_d2<dist_d_min1+dist_d_min2) { dist_d_min1 = dist_d1; dist_d_min2 = dist_d2; d_idx_tmp1 = j; d_idx_tmp2 = j; } }}else {/* Lower Part of PVQ */ dist_rd_min1 = 1.0e9; rd_idx_tmp1 = 0; for(j=0;j<num_dc;j++) { dist_rd1 = 0.; for(i=0;i<dim_2[0];i++) dist_rd1 += (in[i]-qv_rd[lpc_order*j+i]) *(in[i]-qv_rd[lpc_order*j+i])*weight[i]; if(dist_rd1<dist_rd_min1) { dist_rd_min1 = dist_rd1; rd_idx_tmp1 = j; } }/* Upper Part of PVQ */ dist_rd_min2 = 1.0e9; rd_idx_tmp2 = 0; for(j=0;j<num_dc;j++) { dist_rd2 = 0.; for(i=dim_2[0];i<dim_2[0]+dim_2[1];i++) dist_rd2 += (in[i]-qv_rd[lpc_order*j+i]) *(in[i]-qv_rd[lpc_order*j+i])*weight[i]; if(dist_rd2<dist_rd_min2) { dist_rd_min2 = dist_rd2; rd_idx_tmp2 = j; } }/* Lower Part of DVQ */ dist_d_min1 = 1.0e9; d_idx_tmp1 = 0; for(j=0;j<num_dc;j++) { dist_d1 = 0.; for(i=0;i<dim_2[0];i++) dist_d1 += (in[i]-qv_d[lpc_order*j+i]) *(in[i]-qv_d[lpc_order*j+i])*weight[i]; if(dist_d1<dist_d_min1) { dist_d_min1 = dist_d1; d_idx_tmp1 = j; } }/* Upper Part of DVQ */ dist_d_min2 = 1.0e9; d_idx_tmp2 = 0; for(j=0;j<num_dc;j++) { dist_d2 = 0.; for(i=dim_2[0];i<dim_2[0]+dim_2[1];i++) dist_d2 += (in[i]-qv_d[lpc_order*j+i]) *(in[i]-qv_d[lpc_order*j+i])*weight[i]; if(dist_d2<dist_d_min2) { dist_d_min2 = dist_d2; d_idx_tmp2 = j; } }} if((qMode != 1) && (dist_rd_min1+dist_rd_min2)<(dist_d_min1+dist_d_min2)) { for(i=0;i<dim_2[0];i++) out[i] = qv_rd[lpc_order*rd_idx_tmp1+i]; for(i=dim_2[0];i<dim_2[0]+dim_2[1];i++) out[i] = qv_rd[lpc_order*rd_idx_tmp2+i]; idx[0] = idx_tmp[2*rd_idx_tmp1]; idx[1] = idx_tmp[2*rd_idx_tmp2+1]; idx[2] = rd_idx[2*rd_idx_tmp1]; idx[3] = rd_idx[2*rd_idx_tmp2+1]; idx[4] = 1; }else{ for(i=0;i<dim_2[0];i++) out[i] = qv_d[lpc_order*d_idx_tmp1+i]; for(i=dim_2[0];i<dim_2[0]+dim_2[1];i++) out[i] = qv_d[lpc_order*d_idx_tmp2+i]; idx[0] = idx_tmp[2*d_idx_tmp1]; idx[1] = idx_tmp[2*d_idx_tmp2+1]; idx[2] = d_idx[2*d_idx_tmp1]; idx[3] = d_idx[2*d_idx_tmp2+1]; idx[4] = 0; } if(level == 0) { for(i = 0; i < lpc_order; i++) { out[i] = out_v[i]; } } pan_stab(out, min_gap, lpc_order);}/* ------------------------------------------------------------------ */void pan_v_qtz_w_dd(float in[], long code[], long cnum, float tbl[], long dim, float wt[], long nd){ float dist, dmin[PAN_N_DC_LSP_MAX]; long i, j, k; for(i=0;i<nd;i++) dmin[i] = 1e9; for(i=0;i<cnum;i++) { dist = 0.; for(j=0;j<dim;j++) { dist += (in[j]-tbl[dim*i+j]) * (in[j]-tbl[dim*i+j])*wt[j]; } for(j=0;j<nd;j++) { if(dist<dmin[j]) { for(k=nd-1;k>j;k--) { dmin[k] = dmin[k-1]; code[k] = code[k-1]; } dmin[j] = dist; code[j] = i; break; } } }}/* ------------------------------------------------------------------ */void pan_rd_qtz2_w(float in[], float out_p[], float out_v[], long *code, long cnum, float tbl[], long dim, float wt[], float p_factor){ long i, j; float c[PAN_DIM_MAX]; float dist, dmin; for(j=0;j<dim;j++) { c[j] = in[j]-(p_factor*out_p[j]+(1.-p_factor)*out_v[j]); } dmin = 1e9; for(i=0;i<cnum;i++) { dist = 0.; for(j=0;j<dim;j++) { dist += (tbl[i*dim+j]-c[j])*(tbl[i*dim+j]-c[j])*wt[j]; } if(dist<dmin) { dmin = dist; *code = i; } dist = 0.; for(j=0;j<dim;j++) { dist += (-tbl[i*dim+j]-c[j])*(-tbl[i*dim+j]-c[j])*wt[j]; } if(dist<dmin) { dmin = dist; *code = cnum+i; } }}/* ------------------------------------------------------------------ */void pan_d_qtz_w(float in[], float out_v[], long *code, long cnum, float tbl[], long dim, float wt[]){ long i, j; float c[PAN_DIM_MAX]; float dist, dmin; for(j=0;j<dim;j++) { c[j] = in[j]-out_v[j]; } dmin = 1e9; for(i=0;i<cnum;i++) { dist = 0.; for(j=0;j<dim;j++) { dist += (tbl[i*dim+j]-c[j])*(tbl[i*dim+j]-c[j])*wt[j]; } if(dist<dmin) { dmin = dist; *code = i; } dist = 0.; for(j=0;j<dim;j++) { dist += (-tbl[i*dim+j]-c[j])*(-tbl[i*dim+j]-c[j])*wt[j]; } if(dist<dmin) { dmin = dist; *code = cnum+i; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -