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

📄 pan_lspqtz2_dd.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -