www.pudn.com > mp3rar.rar > block.c


 
#include  
#include "dolby_def.h" 
#include "dolby_win.h" 
#include "transfo.h" 
 
#ifndef PI 
#define PI                   3.14159265359 
#endif 
 
 
Float	fhg_long [NWINLONG]; 
Float	fhg_short [NWINSHORT]; 
Float	fhg_edler [NWINLONG]; 
Float	dol_edler [NWINLONG]; 
Float	fhg_adv [NWINADV]; 
Float	dol_adv [NWINADV]; 
 
Float *windowPtr [N_WINDOW_TYPES] [N_WINDOW_SHAPES] = { 
    {fhg_long,	dol_long}, 
    {fhg_short,	dol_short}, 
    {fhg_edler,	dol_edler}, 
    {fhg_adv,	dol_adv} 
};	 
 
 
int		windowLeng [N_WINDOW_TYPES] = { 
	1024, //sizeof(fhg_long)/sizeof(Float),	 
	128, //sizeof(fhg_short)/sizeof(Float),	 
	1024, //sizeof(fhg_edler)/sizeof(Float),	 
	1024 //sizeof(fhg_adv)/sizeof(Float) 
}; 
 
 
 
/***************************************************************************** 
* 
*	InitBlock 
*	calculate windows for use by Window() 
*	input: none 
*	output: none 
*	local static: none 
*	globals: shortWindow[], longWindow[] 
* 
*****************************************************************************/ 
void InitBlock (void) { 
 
	/* calc half-window data */ 
 
    static int             i, j; 
    register float	phaseInc; 
 
	/* init half-windows */ 
 
	/* FhG long window */ 
    phaseInc = PI / (2.0 * NWINLONG); 
    for (i = 0; i < NWINLONG; i++) { 
		fhg_long [i]  = (float)sin(phaseInc * (i + 0.5)); 
	} 
 
	/* FhG short window */ 
    phaseInc = PI / (2.0 * NWINSHORT); 
    for (i = 0; i < NWINSHORT; i++) { 
		fhg_short [i] = (float)sin(phaseInc * (i + 0.5)); 
	} 
 
	/* Edler windows */ 
    for (i = 0, j = 0; i < NFLAT; i++, j++) { 
		fhg_edler[j] = 0.0; 
		dol_edler[j] = 0.0; 
	} 
    for (i = 0; i < NWINSHORT; i++, j++) { 
		fhg_edler [j] = fhg_short [i]; 
		dol_edler [j] = dol_short [i]; 
	} 
    for ( ; j < NWINFLAT; j++) { 
		fhg_edler [j] = 1.0; 
		dol_edler [j] = 1.0; 
	} 
 
	/* Advanced Edler windows */ 
    for (i = 0, j = 0; i < NADV0; i++, j++) { 
		fhg_adv [j] = 0.0; 
		dol_adv [j] = 0.0; 
	} 
    for (i = 0; i < NWINSHORT; i++, j++) { 
		fhg_adv[j] = fhg_short[i]; 
		dol_adv[j] = dol_short[i]; 
	} 
    for ( ; j < NWINADV; j++) { 
		fhg_adv[j] = 1.0; 
		dol_adv[j] = 1.0; 
	} 
} 
 
 
/***************************************************************************** 
* 
*	Window 
*	window input sequence based on window type 
*	input: see below 
*	output: see below 
*	local static: 
*	  firstTime				flag = need to initialize data structures 
*	globals: shortWindow[], longWindow[] 
* 
*****************************************************************************/ 
 
void ITransformBlock ( 
	Float* dataPtr,				/* vector to be windowed in place	*/ 
	BLOCK_TYPE bT,				/* input: window type				*/ 
	Wnd_Shape *wnd_shape, 
	Float *state				/* input/output						*/ 
	) 
{ 
    static int	firstTime = 1; 
	int leng0, leng1; 
    int			i,leng; 
    Float		*windPtr; 
    WINDOW_TYPE	beginWT, endWT; 
 
    if (firstTime)  { 
		InitBlock();			/*	calculate windows	*/ 
		firstTime = 0; 
	} 
 
    if((bT==LONG_BLOCK) || (bT==START_FLAT_BLOCK)) { 
		beginWT = WT_LONG; 
	} else if(bT==STOP_FLAT_BLOCK) { 
		beginWT = WT_FLAT; 
	} else 
		beginWT = WT_SHORT; 
 
    if ((bT == LONG_BLOCK) || (bT == STOP_FLAT_BLOCK)) { 
		endWT = WT_LONG; 
	} else if (bT == START_FLAT_BLOCK)  { 
		endWT = WT_FLAT; 
	} else 
		endWT = WT_SHORT; 
 
    leng0 = windowLeng [beginWT]; 
    leng1 = windowLeng [endWT]; 
 
	IMDCT (dataPtr, leng0 + leng1); 
 
	/*	first half of window */ 
	/*     windPtr = windowPtr [0] [0];  */ 
	windPtr = windowPtr [beginWT] [wnd_shape->prev_bk];   
 
 
    for (i = 0; i < windowLeng [beginWT]; i++)  { 
		*dataPtr++ *= *windPtr++; 
	} 
 
	/*	second half of window */ 
    leng = windowLeng [endWT]; 
    windPtr = windowPtr [endWT] [wnd_shape->this_bk] + leng - 1; 
    for (i = 0; i < leng; i++) { 
		*dataPtr++ *= *windPtr--; 
	} 
 
	wnd_shape->prev_bk = wnd_shape->this_bk; 
} 
 
/***************************************************************************** 
* 
*	MDCT 
*	window input sequence based on window type and perform MDCT 
*	This is adapted from ITransformBlock(). 
*	(long term prediction needs this routine)  
*	input: see below 
*	output: see below 
*	local static: 
*	  firstTime				flag = need to initialize data structures 
*	globals: - 
* 
*****************************************************************************/ 
void TransformBlock ( 
	Float* dataPtr,				/* time domain signal	*/ 
	BLOCK_TYPE bT,				/* input: window type				*/ 
	Wnd_Shape *wnd_shape 
	) 
{ 
    static int	leng0, leng1; 
    int			i,leng; 
    Float		*windPtr; 
    WINDOW_TYPE	beginWT, endWT; 
 
    if((bT==LONG_BLOCK) || (bT==START_BLOCK) || (bT==START_FLAT_BLOCK) 
        || (bT==START_ADV_BLOCK))  { 
		beginWT = WT_LONG; 
		} 
    else if(bT==STOP_FLAT_BLOCK) { 
		beginWT = WT_FLAT; 
		} 
    else if(bT==STOP_ADV_BLOCK) { 
		beginWT = WT_ADV; 
		} 
    else	 
		beginWT = WT_SHORT; 
 
    if ((bT == LONG_BLOCK) || (bT == STOP_BLOCK) || (bT == STOP_FLAT_BLOCK) 
        || (bT == STOP_ADV_BLOCK)) { 
		endWT = WT_LONG; 
		} 
    else if (bT == START_FLAT_BLOCK)  { 
		endWT = WT_FLAT; 
		} 
    else if (bT == START_ADV_BLOCK)  { 
		endWT = WT_ADV; 
		} 
    else	 
		endWT = WT_SHORT; 
 
    leng0 = windowLeng [beginWT]; 
    leng1 = windowLeng [endWT]; 
 
/*	first half of window */ 
/*     windPtr = windowPtr [0] [0];  */ 
     windPtr = windowPtr [beginWT] [wnd_shape->prev_bk];   
 
 
    for (i = 0; i < windowLeng [beginWT]; i++)  { 
		*dataPtr++ *= *windPtr++; 
		} 
 
/*	second half of window */ 
    leng = windowLeng [endWT]; 
    windPtr = windowPtr [endWT] [wnd_shape->this_bk] + leng - 1; 
    for (i = 0; i < leng; i++) { 
		*dataPtr++ *= *windPtr--; 
		} 
    dataPtr -= (windowLeng [beginWT] + leng); 
 
    MDCT(dataPtr, (leng0 + leng1)); 
	wnd_shape->prev_bk = wnd_shape->this_bk; 
}