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

📄 hvxcfpextenc.c

📁 C写的MPEG4音频源代码(G.723/G.729)
💻 C
字号:
/*This software module was originally developed by    Masayuki Nishiguchi, Kazuyuki Iijima (Sony Corporation)    in the course of development of the MPEG-4 Audio standard (ISO/IEC 14496-3).    This software module is an implementation of a part of one or more    MPEG-4 Audio (ISO/IEC 14496-3) tools as specified by the MPEG-4 Audio    standard (ISO/IEC 14496-3).    ISO/IEC gives users of the MPEG-4 Audio standards (ISO/IEC 14496-3)    free license to this software module or modifications thereof for use    in hardware or software products claiming conformance to the MPEG-4    Audio standards (ISO/IEC 14496-3).    Those intending to use this software module in hardware or software    products are advised that this use may infringe existing patents.    The original developer of this software module and his/her company,    the subsequent editors and their companies, and ISO/IEC have no    liability for use of this software module or modifications thereof in    an implementation.    Copyright is not released for non MPEG-4 Audio (ISO/IEC 14496-3)    conforming products. The original developer retains full right to use    the code for his/her own purpose, assign or donate the code to a third    party and to inhibit third party from using the code for non MPEG-4    Audio (ISO/IEC 14496-3) conforming products.    This copyright notice must be included in all copies or derivative works.    Copyright (c)1996.                                                                  */#include <math.h>/* #include <values.h> */#include <stdio.h>#include <stdlib.h>#include "hvxc.h"#include "hvxcEnc.h"#include "hvxcCommon.h"#define	NUMPITCHFINE	10    #define NUMPITCHFINE1	3.   #define NUMPITCHFINE2	7.   #define KIZAMI2		0.25#define	RL		3float ipc_bsamp[SAMPLE*R+1];float ipc_bsang[SAMPLE*R+1];extern float	ipc_coef[SAMPLE];extern float	ipc_coef160[FRM];void IPC_make_bss(void){    int i,l;    float w[SAMPLE * R];    float im[SAMPLE * R];    float mag[SAMPLE * R];    float ang[SAMPLE * R];    float energy;        energy = 0.;    for(i=0; i < SAMPLE ; i++)    {	w[i]=0.54  - 0.46 * cos( 2*M_PI*i/(SAMPLE -1) ); 	im[i]=0.0;	energy += w[i] * w[i];    }    for(i=0; i < SAMPLE ; i++) 	w[i]=w[i]/sqrt(energy);        for(i=SAMPLE ; i < SAMPLE * R; i++)    {	w[i]=0.0;	im[i]=0.0;    }            l = L + RL;    IPC_fft(w,im,l);        for(i=0; i<SAMPLE * R; i++)    {	mag[i] = (sqrt(w[i] * w[i] + im[i] * im[i]));	if(w[i] == 0.) w[i]=0.00000001;	ang[i] = atan2(im[i],w[i]);      }    for(i=0; i<SAMPLE * R/2; i++){	ipc_bsamp[i] = mag[SAMPLE * R / 2 + i];	ipc_bsang[i] = ang[SAMPLE * R / 2 + i];    }    for(i=SAMPLE * R/2; i<=SAMPLE * R; i++){	ipc_bsamp[i]=mag[i - SAMPLE * R/2];	ipc_bsang[i]=ang[i - SAMPLE * R/2];    }}static void makeAm_pl_reduce(float	*pch_er,int	*numsend,float	*w0,float	*w0_r,float	(*am)[3],float	*rms,float	*erl,float	*erh){    int i,j,send,id;    float deno,nume2;    int ub_r = 0, lb_r;    float re,sumsqabsl,sumsqabsh;        *w0 = (float) SAMPLE * R / (*pch_er);       *w0_r = (float) SAMPLE / (*pch_er);       send= (int)((*pch_er)/2.);    *numsend=send;        sumsqabsl=0.0;    sumsqabsh=0.0;    for(i=0; i<=send; i++){	if(i==0)	    lb_r=0; 	else 	    lb_r=ub_r+1; 	ub_r=IPC_inint((float)i * (*w0_r) + (*w0_r)/2.);	if(ub_r >= SAMPLE/2 ) 	    ub_r=SAMPLE/2 -1;		deno=0.;	nume2=0.;	for(j=lb_r; j<=ub_r; j++){	    id=IPC_inint((float)(SAMPLE*R/2) + (float)R*(float)j - (float)i*(*w0));	    deno=deno+ipc_bsamp[id]*ipc_bsamp[id];	    nume2=nume2+rms[j]*ipc_bsamp[id];	}	if(deno <= 0)	    am[i][2]=0;	else	    am[i][2]=nume2/deno;	for(j=lb_r; j<=ub_r; j++){	    id=IPC_inint((float)(SAMPLE*R/2) + (float)R*(float)j - (float)i*(*w0));	    re=rms[j]-am[i][2]*ipc_bsamp[id];	    if(j>=  50) 		sumsqabsh += re*re;	    else			sumsqabsl += re*re;	}	    }    *erl=sumsqabsl;    *erh=sumsqabsh;}static void makeAm_pl_reduce_l(float *pch_er, int *numsend, float *w0, float *w0_r, float (*am)[3], float *rms){    int i,j,send,id;    float deno,nume,nume2;    int ub_r = 0,lb_r;    float sumsqabsl,sumsqabsh;    *w0 = (float)SAMPLE*R/(*pch_er);       *w0_r = (float)SAMPLE/(*pch_er);       send= (int)((*pch_er)/2.);    *numsend=send;    sumsqabsl=0.;    sumsqabsh=0.;    for(i=0; i<=send; i++){	if(i==0)	    lb_r=0; 	else 	    lb_r=ub_r+1; 	ub_r=IPC_inint((float)i * (*w0_r) + (*w0_r)/2.);	if(ub_r >= SAMPLE/2 ) 	    ub_r=SAMPLE/2 -1;	if((lb_r+ub_r)/2. <= 54.){	    deno=0.;	    nume=0.;	    nume2=0.;	    for(j=lb_r; j<=ub_r; j++){		id=IPC_inint((float)(SAMPLE*R/2) + (float)R*(float)j - (float)i*(*w0));		deno=deno+ipc_bsamp[id]*ipc_bsamp[id];		nume2=nume2+rms[j]*ipc_bsamp[id];	    }	    if(deno <= 0)		am[i][2]=0;	    else		am[i][2]=nume2/deno;	}		    }}static void makeAm_pl_reduce_h(float	*pch_er,int	*numsend,float	*w0,float	*w0_r,float	(*am)[3],float	*rms){    int i,j,send,id;    float deno,nume,nume2;    int ub_r = 0, lb_r;    float sumsqabsl,sumsqabsh;    *w0 = (float)SAMPLE*R/(*pch_er);       *w0_r = (float)SAMPLE/(*pch_er);       send= (int)((*pch_er)/2.);    *numsend=send;    sumsqabsl=0.;    sumsqabsh=0.;    for(i=0; i<=send; i++){	if(i==0)	    lb_r=0; 	else 	    lb_r=ub_r+1; 	ub_r=IPC_inint((float)i * (*w0_r) + (*w0_r)/2.);	if(ub_r >= SAMPLE/2 ) 	    ub_r=SAMPLE/2 -1;	if((lb_r+ub_r)/2. >= 50.){	    deno=0.;	    nume=0.;	    nume2=0.;	    for(j=lb_r; j<=ub_r; j++){		id=IPC_inint((float)(SAMPLE*R/2) + (float)R*(float)j - (float)i*(*w0));		deno=deno+ipc_bsamp[id]*ipc_bsamp[id];		nume2=nume2+rms[j]*ipc_bsamp[id];	    }	    if(deno <= 0)		am[i][2]=0;	    else		am[i][2]=nume2/deno;	}    }}static void errorUbFine_reduce_fang(float	*initpch,float	*mfdpch,float	(*am)[3],float	*rms){    int k,send;    float eubfine,mineub,pitch,finalpitch,finalpitch_l,finalpitch_h;    float w0,w0_r,erl,erh,min_erh = 0.0, min_erl = 0.0;    static int cnt=0;    static float old_pch_l=0.;    static float old_pch_h=0.;    if(*initpch <= (float)(20 + NUMPITCH/2 - (NUMPITCHFINE-1.)/2. )){	mineub=1000000000.;	pitch = *initpch - (NUMPITCHFINE1-1.)/2. ;	finalpitch = pitch;	for(k=0; k<NUMPITCHFINE1; k++){	    makeAm_pl_reduce(&pitch, &send, &w0, &w0_r, am, rms,			     &erl, &erh);	    eubfine= (erl + erh)  ;	    if(eubfine < mineub || k==0) {		mineub = eubfine;		min_erh = erh;		min_erl = erl;		finalpitch = pitch;	    }	    pitch=pitch+1.0;	}	pitch = finalpitch - (NUMPITCHFINE2-1.)/2. * KIZAMI2;	for(k=0; k<NUMPITCHFINE2; k++){	    if(k == (NUMPITCHFINE2-1.)/2.){		eubfine = min_erh;	    }		    else{		makeAm_pl_reduce(&pitch, &send, &w0, &w0_r, am,				 rms, &erl, &erh);		eubfine=  erh   ; 	    }	    if(eubfine <= mineub) {		mineub = eubfine;		finalpitch_h = pitch;	    }	    pitch=pitch+KIZAMI2;	}	mineub=1000000000.;	pitch = finalpitch - (NUMPITCHFINE2-1.)/2. * KIZAMI2;	for(k=0; k<NUMPITCHFINE2; k++){	    if(k == (NUMPITCHFINE2-1.)/2.){		eubfine = min_erl;	    }		    else{		makeAm_pl_reduce(&pitch,&send,&w0,&w0_r,am,				 rms,&erl,&erh);		eubfine=  erl   ; 	    }	    if(eubfine <= mineub) {		mineub = eubfine;		finalpitch_l = pitch;	    }	    pitch=pitch+KIZAMI2;	}    }    else {	finalpitch_l = finalpitch_h  = *initpch ;    }    makeAm_pl_reduce_l(&finalpitch_l,&send,&w0,&w0_r,am,rms);    makeAm_pl_reduce_h(&finalpitch_h,&send,&w0,&w0_r,am,rms);    if(finalpitch_h < 20.) finalpitch_h = 20.;    if(finalpitch_l < 20.) finalpitch_l = 20.;    *mfdpch=finalpitch_l;    old_pch_l=finalpitch_l;    old_pch_h=finalpitch_h;    cnt=cnt+1;}void harm_srew(float	frmPwr,float	arysres[SAMPLE],int	winSize,int	offset,float	pitchOL,float	*mfdpch,float	(*am)[3],float	*rms,float	*dummyHarm,int	*normMode){    float	dummyPitch;    float	ang[SAMPLE], re[SAMPLE], im[SAMPLE], aryd[SAMPLE];    if(winSize != 256 || offset != -48)    {	fprintf(stderr, "Unsupported window size or frame offset!!\n");	exit(1);    }    IPC_window(ipc_coef, arysres, aryd, SAMPLE);    IPC_fcall_fft(aryd, rms, ang, re, im);    dummyPitch = pitchOL;    errorUbFine_reduce_fang(&dummyPitch, mfdpch, am, rms);    *normMode = 0;    return;}

⌨️ 快捷键说明

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