📄 son_pqf.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 "tf_mainHandle.h" /* handler, defines, enums */#include "sony_local.h"#define NPQFTAPS 96#include<math.h>#include<malloc.h>#define SCALAR double#ifndef PI#define PI (3.14159265358979)#endifvoid son_set_protopqf(double *);/******************************************************************************* Set Coefficients for Efficient (2*kk*mm)-Tap PQF analysis mm: Number of Bands kk: (2*mm*kk) is the Tap Number p_proto[2*kk*mm]: Prototype Filter Coef. (*ppp_h)[2*mm][kk]: 1st Coefficients (*ppp_s)[mm][mm]: 2nd Coefficients*******************************************************************************/void son_setcoef_eff_pqfana( int mm, int kk, SCALAR *p_proto, SCALAR ***ppp_h, SCALAR ***ppp_s ){ int i, j, k, jj; SCALAR w;/* Set 1st Mul&Acc Coef's */ *ppp_h = (SCALAR **) calloc(2*mm, sizeof(SCALAR *)); for (j = 0; j < 2*mm; ++j) { (*ppp_h)[j] = (SCALAR *) calloc(kk, sizeof(SCALAR)); } for (j = 0; j < 2*mm; ++j) { for (k = 0; k < kk; ++k) { if ((k%2) == 0) { (*ppp_h)[j][k] = p_proto[2*mm*k+j]; } else { (*ppp_h)[j][k] = -p_proto[2*mm*k+j]; } } }/* Set 2nd Mul&Acc Coef's */ *ppp_s = (SCALAR **) calloc(mm, sizeof(SCALAR *)); for (i = 0; i < mm; ++i) { (*ppp_s)[i] = (SCALAR *) calloc(mm, sizeof(SCALAR)); } for (i = 0; i < mm; ++i) { for (j = 0; j < mm; ++j) { jj = (j < (mm/2)) ? j: j+mm/2; w = ((2*i+1)*(mm-1-2*jj)*PI)/(4*mm); (*ppp_s)[i][j] = 2.0 * cos((double) w); if ((kk %2) != 0) { (*ppp_s)[i][j] = -(*ppp_s)[i][j]; } } }}/******************************************************************************* Implement (2*kk*mm)-Tap Efficient PQF Analysis mm: Number of Bands kk: (2*mm*kk) is the Tap Number p_proto[2*kk*mm]: Prototype Filter Coef. pp_h[2*mm][kk]: 1st Coefficients pp_s[mm][mm]: 2nd Coefficients p_xnew[mm]: Newly Input Data p_vout[mm]: Output Data*******************************************************************************/void son_eff_pqfana( int mm, int kk, SCALAR **pp_h, SCALAR **pp_s, SCALAR *p_xnew, SCALAR *p_vout, SCALAR *p_buf ){ int i, j, k, jj, ntaps; SCALAR acc; SCALAR *p_bb;/* Work Area Buffer */ p_bb = (SCALAR *) calloc(mm, sizeof(SCALAR));/* Shift Buffer Data and Append New Data */ ntaps = 2*kk*mm; for (j = 0; j < ntaps-mm; ++j) { p_buf[j] = p_buf[j+mm]; } for (j = 0; j < mm; ++j) { p_buf[ntaps-mm+j] = p_xnew[j]; }/* 1st Mul&Acc Operations */ for (j = 0; j < mm/2; ++j) { acc = 0.0; for (k = 0; k < kk; ++k) { jj = j; acc += pp_h[jj][k]*p_buf[2*mm*k+jj]; } for (k = 0; k < kk; ++k) { jj = mm-1-j; acc += pp_h[jj][k]*p_buf[2*mm*k+jj]; } p_bb[j] = acc; } for (j = mm/2; j < mm; ++j) { acc = 0.0; for (k = 0; k < kk; ++k) { jj = j+mm/2; acc += pp_h[jj][k]*p_buf[2*mm*k+jj]; } for (k = 0; k < kk; ++k) { jj = 5*mm/2-1-j; acc -= pp_h[jj][k]*p_buf[2*mm*k+jj]; } p_bb[j] = acc; }/* 2nd Mul & Acc Operation */ for (i = 0; i < mm; ++i) { acc = 0.0; for (j = 0; j < mm; ++j) { acc += pp_s[i][j]*p_bb[j]; } p_vout[i] = acc; } free((char *)p_bb);}/******************************************************************************* PQF Analysis*******************************************************************************/void son_pqf_main( double timeSigBufCh[], int block_size_samples, int ch, double *pqfOutBufCh[NBANDS] ){ /* This parameter will be removed outside */ static double a_pqfbuf[MAX_TIME_CHANNELS][NPQFTAPS]; static int initFlag = 0; static double a_pqfproto[NPQFTAPS]; static double **pp_h, **pp_s; int i, j; double a_pqfout[NBANDS]; if (initFlag == 0) { son_set_protopqf(a_pqfproto); son_setcoef_eff_pqfana(NBANDS, NPQFTAPS/(2*NBANDS), a_pqfproto, &pp_h, &pp_s); initFlag = 1; } for (i = 0; i < block_size_samples / NBANDS; i++) { son_eff_pqfana(NBANDS, NPQFTAPS/(2*NBANDS), pp_h, pp_s, timeSigBufCh+i*NBANDS, a_pqfout, a_pqfbuf[ch]); for (j = 0; j < NBANDS; j++) { pqfOutBufCh[j][i] = a_pqfout[j]; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -