📄 lfe.c
字号:
/********************************************************************** * ISO MPEG Audio Subgroup Software Simulation Group (1996) * ISO 13818-3 MPEG-2 Audio Multichannel Encoder * * $Id: lfe.c,v 1.4 1996/02/12 07:13:35 rowlands Exp $ * * $Log: lfe.c,v $ * Revision 1.4 1996/02/12 07:13:35 rowlands * Release following Munich meeting * * Revision 1.1 1995/11/06 04:19:12 rowlands * Received from Uwe Felderhoff (IRT) * **********************************************************************/#include "common.h"#include "encoder.h"static double a[17] = { 0.750000000, 0.625000000, 0.875000000, 0.562500000, 0.937500000, 0.968750000, 0.984375000, 0.992187500, 0.996093750, 0.998046875, 0.999023438, 0.999511719, 0.999755859, 0.999877930, 0.999938965, 0.999969482, 0.999984741 }; static double b[17] = { -0.250000000, -0.375000000, -0.125000000, -0.437500000, -0.062500000, -0.031250000, -0.015625000, -0.007812500, -0.003906250, -0.001953125, -0.000976563, -0.000488281, -0.000244141, -0.000122070, -0.000061035, -0.000030518, -0.000015259 }; /************************************************************************/*/* encode_lfe /*/************************************************************************/void lf_scalefactor( double lfe_sample[12], unsigned int *lfe_scalar){ int j; double s; for(j=1, s = mod(lfe_sample[0]); j<12; j++) if (mod(lfe_sample[j]) > s) s = mod(lfe_sample[j]); for(j=SCALE_RANGE-1, *lfe_scalar = 0; j>=0; j--) if (s <= multiple[j]){ *lfe_scalar = j; break; } }void II_encode_lfe_scale( unsigned int lfe_scalar, Bit_stream_struc *bs){ putbits(bs,lfe_scalar,6);}void lfe_allocation( unsigned int *lfe_alloc, int *adb) /* 70 */{ int nbal, bspl, bscf; /* *lfe_alloc = 4 /* index (Lay II bit alloc tabel) */ nbal = 4; /* 4 bits (nbal) */ bscf = 6; /* bits for scale factor */ bspl = 12 * 5; /* bits used for quantization*/ *adb -= nbal + bscf + bspl;}void II_lfe_quantisation( unsigned int lfe_scalar, double lfe_samples[12], unsigned int lfe_alloc, unsigned int sbband[12], frame_params *fr_ps){ int i, j, s, qnt, n, sig; unsigned int stps; double d; al_table *alloc = fr_ps->alloc; for (s=0;s<12;s++) { d = lfe_samples[s] / multiple[lfe_scalar]; if (mod(d) > 1.0) printf("In LFE, not scaled properly %d %12.10e\n",s,d); qnt = (*alloc)[0][lfe_alloc].quant; d = d * a[qnt] + b[qnt]; /* extract MSB N-1 bits from the floating point sample */ if (d >= 0) sig = 1; else { sig = 0; d += 1.0; } n = 0;#ifndef MS_DOS stps = (*alloc)[0][lfe_alloc].steps; while ((1L<<n) < stps) n++;#else while ( ( (unsigned long)(1L<<(long)n) < ((unsigned long) ((*alloc)[i][bit_alloc[k][i]].steps) & 0xffff) ) && ( n< 16) ) n++;#endif n--; sbband[s] = (unsigned int) (d * (double) (1L<<n)); /* tag the inverted sign bit to sbband at position N */ /* The bit inversion is a must for grouping with 3,5,9 steps so it is done for all subbands */ if (sig) sbband[s] |= 1<<n; }}void II_encode_lfe_alloc( unsigned int lfe_alloc, frame_params *fr_ps, Bit_stream_struc *bs){ al_table *alloc = fr_ps->alloc; putbits(bs, lfe_alloc, (*alloc)[0][0].bits);}void II_lfe_sample_encoding( unsigned int lfe_sbband[12], unsigned int lfe_alloc, frame_params *fr_ps, Bit_stream_struc *bs){ unsigned int s, j; al_table *alloc = fr_ps->alloc; for (s=0;s<12;s++) if ((*alloc)[0][lfe_alloc].group == 3){ putbits(bs, lfe_sbband[s], (*alloc)[0][lfe_alloc].bits); }}/*********************************************************************** * * * filter() * * A lf-filter to produce the LFE signal * **********************************************************************/ void lfe_filter( double **buffer, double lfe_sample[12]) { static double c; static double d[8]; static double w1[8], w2[8], v0[8], v1[8], v2[8]; static double a0[8], a1[8], a2[8], b0[8], b1[8], b2[8]; static double A0[8], B0[8], B1[8], B2[8]; static int fa, fg; static int init = 0; int i, j, k; double sambuf[1152]; if(init == 0){ for(i=0;i<8;i++) w1[i] = w2[i] = v0[i] = v1[i] = v2[i] = 0.0; fg = 125; /* cutoff-frequency */ fa = 48000; /* sampling-frequency */ /* filter coefficients */ for (i = 0; i < 8; i++){ A0[i]=B0[i]=B2[i]=1.0; B1[i]=2*cos((2*i+1)*PI/(4*8)); } c = 1/tan(PI * fg /fa); for (i = 0; i < 8; i++){ d[i] = (B0[i] + (B1[i] * c) + (B2[i] * c * c)); a0[i] = A0[i] / d[i]; a1[i] = 2 * A0[i] / d[i]; a2[i] = A0[i] / d[i]; b0[i] = 1; b1[i] = 2 * (B0[i] - (B2[i] * c * c)) / d[i]; b2[i] = (B0[i] - (B1[i] * c) + (B2[i] * c * c)) / d[i]; } init = 1; } j = 0; for(i = 0; i < 1152; i++){ sambuf[i] = **buffer ; for(k = 0; k < 8; k++){ v0[k] = sambuf[i]; sambuf[i] = v0[k] * a0[k] + v1[k] * a1[k] + v2[k] * a2[k] - w1[k] * b1[k] - w2[k] * b2[k]; v2[k] = v1[k]; v1[k] = v0[k]; w2[k] = w1[k]; w1[k] = sambuf[i]; } (*buffer)++; } i = 0; for (j = 0; j < 12; j++){ lfe_sample[j] = sambuf[i]/SCALE; i += 96; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -