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

📄 son_ipqf.c

📁 MPEG2/MPEG4编解码参考程序(实现了MPEG4的部分功能)
💻 C
字号:
/*******************************************************************This software module was originally developed byYoshiaki Oikawa (Sony Corporation) andMitsuyuki Hatanaka (Sony Corporation)and edited byTakashi Koike (Sony Corporation)in the course of development of the MPEG-2 NBC/MPEG-4 System/MPEG-4Video/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 3. Thissoftware module is an implementation of a part of one or more MPEG-2NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio tools as specified by theMPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio standard. ISO/IECgives users of the MPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audiostandards free license to this software module or modificationsthereof for use in hardware or software products claiming conformanceto the MPEG-2 NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audiostandards. Those intending to use this software module in hardware orsoftware products are advised that this use may infringe existingpatents. The original developer of this software module and his/hercompany, the subsequent editors and their companies, and ISO/IEC haveno liability for use of this software module or modifications thereofin an implementation. Copyright is not released for non MPEG-2NBC/MPEG-4 System/MPEG-4 Video/MPEG-4 Audio conforming products.Theoriginal developer retains full right to use the code for his/her ownpurpose, assign or donate the code to a third party and to inhibitthird party from using the code for non MPEG-2 NBC/MPEG-4System/MPEG-4 Video/MPEG-4 Audio conforming products. This copyrightnotice must be included in all copies or derivative works.Copyright (C) 1996.*******************************************************************/#include <stdio.h>#include "buffersHandle.h"       /* handler, defines, enums */#include "resilienceHandle.h"    /* handler, defines, enums */#include "sony_local.h"#define		NPQFTAPS	96#include<math.h>#include<stdlib.h>#define	SCALAR	double#ifndef PI#define	PI	(3.14159265358979)#endifvoid    son_set_protopqf(double *);/*******************************************************************************	Set Coefficients for Efficient (2*kk*mm)-Tap PQF Synthesis	mm:	Number of Bands	kk:	(2*mm*kk) is the Prototype FIR Length	p_proto[2*kk*mm]:	Prototype Filter Coef.	(*ppp_q0)[mm][mm]:	1st Coefficients	(*ppp_q1)[mm][mm]:	1st Coefficients	(*ppp_t0)[mm][kk]:	2nd Coefficients	(*ppp_t1)[mm][kk]:	2nd Coefficients*******************************************************************************/void	son_setcoef_eff_pqfsyn(	int	mm,	int	kk,	SCALAR	*p_proto,	SCALAR	***ppp_q0,	SCALAR	***ppp_q1,	SCALAR	***ppp_t0,	SCALAR	***ppp_t1	){	int	i, k, n;	SCALAR	w;/* Set 1st Mul&Acc Coef's */	*ppp_q0 = (SCALAR **) calloc(mm, sizeof(SCALAR *));	*ppp_q1 = (SCALAR **) calloc(mm, sizeof(SCALAR *));	for (n = 0; n < mm; ++n) {		(*ppp_q0)[n] = (SCALAR *) calloc(mm, sizeof(SCALAR));		(*ppp_q1)[n] = (SCALAR *) calloc(mm, sizeof(SCALAR));	}	for (n = 0; n < mm; ++n) {		for (i = 0; i < mm; ++i) {			w = (2*i+1)*(2*n+1-mm)*PI/(4*mm);			(*ppp_q0)[n][i] = 2.0 * cos((double) w);			w = (2*i+1)*(2*(mm+n)+1-mm)*PI/(4*mm);			(*ppp_q1)[n][i] = 2.0 * cos((double) w);		}	}/* Set 2nd Mul&Acc Coef's */	*ppp_t0 = (SCALAR **) calloc(mm, sizeof(SCALAR *));	*ppp_t1 = (SCALAR **) calloc(mm, sizeof(SCALAR *));	for (n = 0; n < mm; ++n) {		(*ppp_t0)[n] = (SCALAR *) calloc(kk, sizeof(SCALAR));		(*ppp_t1)[n] = (SCALAR *) calloc(kk, sizeof(SCALAR));	}	for (n = 0; n < mm; ++n) {		for (k = 0; k < kk; ++k) {			(*ppp_t0)[n][k] = mm * p_proto[2*k    *mm + n];			(*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n];			if (k%2 != 0) {				(*ppp_t0)[n][k] = -(*ppp_t0)[n][k];				(*ppp_t1)[n][k] = -(*ppp_t1)[n][k];			}		}	}}/*******************************************************************************	Implement (2*kk*mm)-Tap Efficient PQF Synthesis	mm:	Number of Bands	kk:	(2*mm*kk) is the Tap Number	pp_q0[mm][mm]:		1st Coefficients	pp_q1[mm][mm]:		1st Coefficients	pp_t0[mm][kk]:		2nd Coefficients	pp_t1[mm][kk]:		2nd Coefficients	p_vin [mm]:		Newly Input Data	p_uout[mm]:		Output Data	pp_buf0[mm][kk]:	Data Buffer	pp_buf1[mm][kk]:	Data Buffer*******************************************************************************/void	son_eff_pqfsyn(	int	mm,	int	kk,	SCALAR	**pp_q0,	SCALAR	**pp_q1,	SCALAR	**pp_t0,	SCALAR	**pp_t1,	SCALAR	*p_vin,	SCALAR	*p_uout,	SCALAR	**pp_buf0,	SCALAR	**pp_buf1	){	int	i, n, k;	SCALAR	acc;/* Shift Buffer Data and Append New Data */	for (n = 0; n < mm/2; ++n) {		for (k = 0; k < 2*kk-1; ++k) {			pp_buf0[n][k] = pp_buf0[n][k+1];			pp_buf1[n][k] = pp_buf1[n][k+1];		}	}/* 1st Mul&Acc Operations and Append the Results to the Buufers */	for (n = 0; n < mm/2; ++n) {		acc = 0.0;		for (i = 0; i < mm; ++i) {			acc += pp_q0[n][i]*p_vin[i];		}		pp_buf0[n][2*kk-1] = acc;		acc = 0.0;		for (i = 0; i < mm; ++i) {			acc += pp_q1[n][i]*p_vin[i];		}		pp_buf1[n][2*kk-1] = acc;	}/* 2nd Mul & Acc Operation */	for (n = 0; n < mm/2; ++n) {		acc = 0.0;		for (k = 0; k < kk; ++k) {			acc += pp_t0[n][k]*pp_buf0[n][2*kk-1-2*k];		}		for (k = 0; k < kk; ++k) {			acc += pp_t1[n][k]*pp_buf1[n][2*kk-2-2*k];		}		p_uout[n] = acc;		acc = 0.0;		for (k = 0; k < kk; ++k) {			acc += pp_t0[mm-1-n][k]*pp_buf0[n][2*kk-1-2*k];		}		for (k = 0; k < kk; ++k) {			acc -= pp_t1[mm-1-n][k]*pp_buf1[n][2*kk-2-2*k];		}		p_uout[mm-1-n] = acc;	}}/*******************************************************************************	IPQF Synthesis*******************************************************************************/void	son_ipqf_main(	double	*ipqfInBufCh[NBANDS],	int	block_size_samples,	int	ch,	double	output[]	){	/* these parameters should be removed outside */ 	static	double	**app_pqfbuf0[MAX_TIME_CHANNELS];	static	double	**app_pqfbuf1[MAX_TIME_CHANNELS];	static	int	initFlag = 0;	static	double	a_pqfproto[NPQFTAPS];	static	double	**pp_q0, **pp_q1, **pp_t0, **pp_t1;	int	i, j;	double	a_ipqfin[NBANDS];	if (initFlag == 0) {		for (i = 0; i < MAX_TIME_CHANNELS; i++) {			app_pqfbuf0[i] = (double **)calloc(NBANDS/2,						sizeof(double *));			app_pqfbuf1[i] = (double **)calloc(NBANDS/2,						sizeof(double *));			for (j = 0; j < NBANDS/2; j++) {				app_pqfbuf0[i][j] = (double *)calloc(							NPQFTAPS/NBANDS,							sizeof(double));				app_pqfbuf1[i][j] = (double *)calloc(							NPQFTAPS/NBANDS,							sizeof(double));			}		}		son_set_protopqf(a_pqfproto);		son_setcoef_eff_pqfsyn(NBANDS, NPQFTAPS/(2*NBANDS), a_pqfproto,				&pp_q0, &pp_q1, &pp_t0, &pp_t1);		initFlag = 1;	}	for (i = 0; i < block_size_samples; i++) {		output[i] = 0.0;	}	for (i = 0; i < block_size_samples / NBANDS; i++) {		for (j = 0; j < NBANDS; j++) {			a_ipqfin[j] = ipqfInBufCh[j][i];		}		son_eff_pqfsyn(NBANDS, NPQFTAPS/(2*NBANDS),				pp_q0, pp_q1, pp_t0, pp_t1, a_ipqfin,				output+i*NBANDS, app_pqfbuf0[ch], app_pqfbuf1[ch]);	}}

⌨️ 快捷键说明

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