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

📄 bit_allocate.c

📁 关于AC3的解码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	if(audblk->cplinu)	{		start = audblk->cplstrtmant; 		end = audblk->cplendmant; 		fgain = fastgain[audblk->cplfgaincod];		snroffset = (((audblk->csnroffst - 15) << 4) + audblk->cplfsnroffst) << 2 ;		fastleak = (audblk->cplfleak << 8) + 768; 		slowleak = (audblk->cplsleak << 8) + 768;		ba_compute_psd(start, end, audblk->cpl_exp, psd, bndpsd);		ba_compute_excitation(start, end , fgain, fastleak, slowleak, 0, bndpsd, excite);		ba_compute_mask(start, end, fscod, audblk->cpldeltbae, audblk->cpldeltnseg, 				audblk->cpldeltoffst, audblk->cpldeltba, audblk->cpldeltlen, excite, mask);		ba_compute_bap(start, end, snroffset, psd, mask, audblk->cpl_bap);	}	if(bsi->lfeon)	{		start = 0;		end = 7;		fgain = fastgain[audblk->lfefgaincod];		snroffset = (((audblk->csnroffst - 15) << 4) + audblk->lfefsnroffst) << 2 ;		fastleak = 0;		slowleak = 0;		ba_compute_psd(start, end, audblk->lfe_exp, psd, bndpsd);		ba_compute_excitation(start, end , fgain, fastleak, slowleak, 1, bndpsd, excite);		/* Perform no delta bit allocation for lfe */		ba_compute_mask(start, end, fscod, 2, 0, 0, 0, 0, excite, mask);		ba_compute_bap(start, end, snroffset, psd, mask, audblk->lfe_bap);	}}static void ba_compute_psd(sint_16 start, sint_16 end, sint_16 exps[], 		sint_16 psd[], sint_16 bndpsd[]){	int bin,i,j,k;	sint_16 lastbin = 0;		/* Map the exponents into dBs */	for (bin=start; bin<end; bin++) 	{ 		psd[bin] = (3072 - (exps[bin] << 7)); 	}	/* Integrate the psd function over each bit allocation band */	j = start; 	k = masktab[start]; 		do 	{ 		lastbin = min16(bndtab[k] + bndsz[k], end); 		bndpsd[k] = psd[j]; 		j++; 		for (i = j; i < lastbin; i++) 		{ 			bndpsd[k] = logadd(bndpsd[k], psd[j]);			j++; 		} 				k++; 	} while (end > lastbin);}static void ba_compute_excitation(sint_16 start, sint_16 end,sint_16 fgain,		sint_16 fastleak, sint_16 slowleak, sint_16 is_lfe, sint_16 bndpsd[],		sint_16 excite[]){	int bin;	sint_16 bndstrt;	sint_16 bndend;	sint_16 lowcomp = 0;	sint_16 begin = 0;	/* Compute excitation function */	bndstrt = masktab[start]; 	bndend = masktab[end - 1] + 1; 		if (bndstrt == 0) /* For fbw and lfe channels */ 	{ 		lowcomp = calc_lowcomp(lowcomp, bndpsd[0], bndpsd[1], 0); 		excite[0] = bndpsd[0] - fgain - lowcomp; 		lowcomp = calc_lowcomp(lowcomp, bndpsd[1], bndpsd[2], 1);		excite[1] = bndpsd[1] - fgain - lowcomp; 		begin = 7 ; 				/* Note: Do not call calc_lowcomp() for the last band of the lfe channel, (bin = 6) */ 		for (bin = 2; bin < 7; bin++) 		{ 			if (!(is_lfe && (bin == 6)))				lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin); 			fastleak = bndpsd[bin] - fgain; 			slowleak = bndpsd[bin] - sgain; 			excite[bin] = fastleak - lowcomp; 						if (!(is_lfe && (bin == 6)))			{				if (bndpsd[bin] <= bndpsd[bin+1]) 				{					begin = bin + 1 ; 					break; 				} 			}		} 				for (bin = begin; bin < min16(bndend, 22); bin++) 		{ 			if (!(is_lfe && (bin == 6)))				lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin); 			fastleak -= fdecay ; 			fastleak = max16(fastleak, bndpsd[bin] - fgain); 			slowleak -= sdecay ; 			slowleak = max16(slowleak, bndpsd[bin] - sgain); 			excite[bin] = max16(fastleak - lowcomp, slowleak); 		} 		begin = 22; 	} 	else /* For coupling channel */ 	{ 		begin = bndstrt; 	} 	for (bin = begin; bin < bndend; bin++) 	{ 		fastleak -= fdecay; 		fastleak = max16(fastleak, bndpsd[bin] - fgain); 		slowleak -= sdecay; 		slowleak = max16(slowleak, bndpsd[bin] - sgain); 		excite[bin] = max16(fastleak, slowleak) ; 	} }static void ba_compute_mask(sint_16 start, sint_16 end, uint_16 fscod,		uint_16 deltbae, uint_16 deltnseg, uint_16 deltoffst[], uint_16 deltba[],		uint_16 deltlen[], sint_16 excite[], sint_16 mask[]){	int bin,k;	sint_16 bndstrt;	sint_16 bndend;	sint_16 delta;	bndstrt = masktab[start]; 	bndend = masktab[end - 1] + 1; 	/* Compute the masking curve */	for (bin = bndstrt; bin < bndend; bin++) 	{ 		if (bndpsd[bin] < dbknee) 		{ 			excite[bin] += ((dbknee - bndpsd[bin]) >> 2); 		} 		mask[bin] = max16(excite[bin], hth[fscod][bin]);	}		/* Perform delta bit modulation if necessary */	if ((deltbae == 0) || (deltbae == 1)) 	{ 		sint_16 band = 0; 		sint_16 seg = 0; 				for (seg = 0; seg < deltnseg+1; seg++) 		{ 			band += deltoffst[seg]; 			if (deltba[seg] >= 4) 			{ 				delta = (deltba[seg] - 3) << 7;			} 			else 			{ 				delta = (deltba[seg] - 4) << 7;			} 
			for (k = 0; k < deltlen[seg]; k++) 			{ 				mask[band&0xff] += delta; 				band++; 			} 		} 	}}static void ba_compute_bap(sint_16 start, sint_16 end, sint_16 snroffset,		sint_16 psd[], sint_16 mask[], sint_16 bap[]){	int i,j,k;	sint_16 lastbin = 0;	sint_16 address = 0;	/* Compute the bit allocation pointer for each bin */	i = start; 	j = masktab[start]; 	do 	{ 		lastbin = min16(bndtab[j] + bndsz[j], end); 		mask[j] -= snroffset; 		mask[j] -= floor; 				if (mask[j] < 0) 			mask[j] = 0; 		mask[j] &= 0x1fe0;		mask[j] += floor; 		for (k = i; k < lastbin; k++) 		{ 			address = (psd[i] - mask[j]) >> 5; 			address = min16(63, max16(0, address)); 			bap[i] = baptab[address]; 			i++; 		} 		j++; 	} while (end > lastbin);}static sint_16 calc_lowcomp(sint_16 a,sint_16 b0,sint_16 b1,sint_16 bin) { 	if (bin < 7) 	{ 		if ((b0 + 256) == b1)			a = 384; 	 	else if (b0 > b1) 			a = max16(0, a - 64); 	} 	else if (bin < 20) 	{ 		if ((b0 + 256) == b1) 			a = 320; 		else if (b0 > b1) 			a = max16(0, a - 64) ; 	}	else  		a = max16(0, a - 128); 		return(a);}

⌨️ 快捷键说明

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