audio/mp3: Move L3_Subband_Synthesis to Go

This commit is contained in:
Hajime Hoshi 2017-06-15 01:31:12 +09:00
parent b54f711243
commit 91c022dcda
3 changed files with 223 additions and 207 deletions

View File

@ -18,11 +18,16 @@ package mp3
// #include "pdmp3.h"
//
// extern unsigned hsynth_init, synth_init;
// extern t_mpeg1_main_data g_main_data;
// extern t_mpeg1_side_info g_side_info;
// extern t_mpeg1_header g_frame_header;
import "C"
import (
"math"
"unsafe"
)
var store = [2][32][18]float32{}
//export L3_Hybrid_Synthesis
@ -46,3 +51,217 @@ func L3_Hybrid_Synthesis(gr C.unsigned, ch C.unsigned) {
}
}
}
var (
g_synth_n_win = [64][32]float32{}
v_vec = [2][1024]float32{}
)
func init() {
for i := 0; i < 64; i++ {
for j := 0; j < 32; j++ {
g_synth_n_win[i][j] =
float32(math.Cos(float64((16+i)*(2*j+1)) * (math.Pi / 64.0)))
}
}
}
var g_synth_dtbl = [512]float32{
0.000000000, -0.000015259, -0.000015259, -0.000015259,
-0.000015259, -0.000015259, -0.000015259, -0.000030518,
-0.000030518, -0.000030518, -0.000030518, -0.000045776,
-0.000045776, -0.000061035, -0.000061035, -0.000076294,
-0.000076294, -0.000091553, -0.000106812, -0.000106812,
-0.000122070, -0.000137329, -0.000152588, -0.000167847,
-0.000198364, -0.000213623, -0.000244141, -0.000259399,
-0.000289917, -0.000320435, -0.000366211, -0.000396729,
-0.000442505, -0.000473022, -0.000534058, -0.000579834,
-0.000625610, -0.000686646, -0.000747681, -0.000808716,
-0.000885010, -0.000961304, -0.001037598, -0.001113892,
-0.001205444, -0.001296997, -0.001388550, -0.001480103,
-0.001586914, -0.001693726, -0.001785278, -0.001907349,
-0.002014160, -0.002120972, -0.002243042, -0.002349854,
-0.002456665, -0.002578735, -0.002685547, -0.002792358,
-0.002899170, -0.002990723, -0.003082275, -0.003173828,
0.003250122, 0.003326416, 0.003387451, 0.003433228,
0.003463745, 0.003479004, 0.003479004, 0.003463745,
0.003417969, 0.003372192, 0.003280640, 0.003173828,
0.003051758, 0.002883911, 0.002700806, 0.002487183,
0.002227783, 0.001937866, 0.001617432, 0.001266479,
0.000869751, 0.000442505, -0.000030518, -0.000549316,
-0.001098633, -0.001693726, -0.002334595, -0.003005981,
-0.003723145, -0.004486084, -0.005294800, -0.006118774,
-0.007003784, -0.007919312, -0.008865356, -0.009841919,
-0.010848999, -0.011886597, -0.012939453, -0.014022827,
-0.015121460, -0.016235352, -0.017349243, -0.018463135,
-0.019577026, -0.020690918, -0.021789551, -0.022857666,
-0.023910522, -0.024932861, -0.025909424, -0.026840210,
-0.027725220, -0.028533936, -0.029281616, -0.029937744,
-0.030532837, -0.031005859, -0.031387329, -0.031661987,
-0.031814575, -0.031845093, -0.031738281, -0.031478882,
0.031082153, 0.030517578, 0.029785156, 0.028884888,
0.027801514, 0.026535034, 0.025085449, 0.023422241,
0.021575928, 0.019531250, 0.017257690, 0.014801025,
0.012115479, 0.009231567, 0.006134033, 0.002822876,
-0.000686646, -0.004394531, -0.008316040, -0.012420654,
-0.016708374, -0.021179199, -0.025817871, -0.030609131,
-0.035552979, -0.040634155, -0.045837402, -0.051132202,
-0.056533813, -0.061996460, -0.067520142, -0.073059082,
-0.078628540, -0.084182739, -0.089706421, -0.095169067,
-0.100540161, -0.105819702, -0.110946655, -0.115921021,
-0.120697021, -0.125259399, -0.129562378, -0.133590698,
-0.137298584, -0.140670776, -0.143676758, -0.146255493,
-0.148422241, -0.150115967, -0.151306152, -0.151962280,
-0.152069092, -0.151596069, -0.150497437, -0.148773193,
-0.146362305, -0.143264771, -0.139450073, -0.134887695,
-0.129577637, -0.123474121, -0.116577148, -0.108856201,
0.100311279, 0.090927124, 0.080688477, 0.069595337,
0.057617188, 0.044784546, 0.031082153, 0.016510010,
0.001068115, -0.015228271, -0.032379150, -0.050354004,
-0.069168091, -0.088775635, -0.109161377, -0.130310059,
-0.152206421, -0.174789429, -0.198059082, -0.221984863,
-0.246505737, -0.271591187, -0.297210693, -0.323318481,
-0.349868774, -0.376800537, -0.404083252, -0.431655884,
-0.459472656, -0.487472534, -0.515609741, -0.543823242,
-0.572036743, -0.600219727, -0.628295898, -0.656219482,
-0.683914185, -0.711318970, -0.738372803, -0.765029907,
-0.791213989, -0.816864014, -0.841949463, -0.866363525,
-0.890090942, -0.913055420, -0.935195923, -0.956481934,
-0.976852417, -0.996246338, -1.014617920, -1.031936646,
-1.048156738, -1.063217163, -1.077117920, -1.089782715,
-1.101211548, -1.111373901, -1.120223999, -1.127746582,
-1.133926392, -1.138763428, -1.142211914, -1.144287109,
1.144989014, 1.144287109, 1.142211914, 1.138763428,
1.133926392, 1.127746582, 1.120223999, 1.111373901,
1.101211548, 1.089782715, 1.077117920, 1.063217163,
1.048156738, 1.031936646, 1.014617920, 0.996246338,
0.976852417, 0.956481934, 0.935195923, 0.913055420,
0.890090942, 0.866363525, 0.841949463, 0.816864014,
0.791213989, 0.765029907, 0.738372803, 0.711318970,
0.683914185, 0.656219482, 0.628295898, 0.600219727,
0.572036743, 0.543823242, 0.515609741, 0.487472534,
0.459472656, 0.431655884, 0.404083252, 0.376800537,
0.349868774, 0.323318481, 0.297210693, 0.271591187,
0.246505737, 0.221984863, 0.198059082, 0.174789429,
0.152206421, 0.130310059, 0.109161377, 0.088775635,
0.069168091, 0.050354004, 0.032379150, 0.015228271,
-0.001068115, -0.016510010, -0.031082153, -0.044784546,
-0.057617188, -0.069595337, -0.080688477, -0.090927124,
0.100311279, 0.108856201, 0.116577148, 0.123474121,
0.129577637, 0.134887695, 0.139450073, 0.143264771,
0.146362305, 0.148773193, 0.150497437, 0.151596069,
0.152069092, 0.151962280, 0.151306152, 0.150115967,
0.148422241, 0.146255493, 0.143676758, 0.140670776,
0.137298584, 0.133590698, 0.129562378, 0.125259399,
0.120697021, 0.115921021, 0.110946655, 0.105819702,
0.100540161, 0.095169067, 0.089706421, 0.084182739,
0.078628540, 0.073059082, 0.067520142, 0.061996460,
0.056533813, 0.051132202, 0.045837402, 0.040634155,
0.035552979, 0.030609131, 0.025817871, 0.021179199,
0.016708374, 0.012420654, 0.008316040, 0.004394531,
0.000686646, -0.002822876, -0.006134033, -0.009231567,
-0.012115479, -0.014801025, -0.017257690, -0.019531250,
-0.021575928, -0.023422241, -0.025085449, -0.026535034,
-0.027801514, -0.028884888, -0.029785156, -0.030517578,
0.031082153, 0.031478882, 0.031738281, 0.031845093,
0.031814575, 0.031661987, 0.031387329, 0.031005859,
0.030532837, 0.029937744, 0.029281616, 0.028533936,
0.027725220, 0.026840210, 0.025909424, 0.024932861,
0.023910522, 0.022857666, 0.021789551, 0.020690918,
0.019577026, 0.018463135, 0.017349243, 0.016235352,
0.015121460, 0.014022827, 0.012939453, 0.011886597,
0.010848999, 0.009841919, 0.008865356, 0.007919312,
0.007003784, 0.006118774, 0.005294800, 0.004486084,
0.003723145, 0.003005981, 0.002334595, 0.001693726,
0.001098633, 0.000549316, 0.000030518, -0.000442505,
-0.000869751, -0.001266479, -0.001617432, -0.001937866,
-0.002227783, -0.002487183, -0.002700806, -0.002883911,
-0.003051758, -0.003173828, -0.003280640, -0.003372192,
-0.003417969, -0.003463745, -0.003479004, -0.003479004,
-0.003463745, -0.003433228, -0.003387451, -0.003326416,
0.003250122, 0.003173828, 0.003082275, 0.002990723,
0.002899170, 0.002792358, 0.002685547, 0.002578735,
0.002456665, 0.002349854, 0.002243042, 0.002120972,
0.002014160, 0.001907349, 0.001785278, 0.001693726,
0.001586914, 0.001480103, 0.001388550, 0.001296997,
0.001205444, 0.001113892, 0.001037598, 0.000961304,
0.000885010, 0.000808716, 0.000747681, 0.000686646,
0.000625610, 0.000579834, 0.000534058, 0.000473022,
0.000442505, 0.000396729, 0.000366211, 0.000320435,
0.000289917, 0.000259399, 0.000244141, 0.000213623,
0.000198364, 0.000167847, 0.000152588, 0.000137329,
0.000122070, 0.000106812, 0.000106812, 0.000091553,
0.000076294, 0.000076294, 0.000061035, 0.000061035,
0.000045776, 0.000045776, 0.000030518, 0.000030518,
0.000030518, 0.000030518, 0.000015259, 0.000015259,
0.000015259, 0.000015259, 0.000015259, 0.000015259,
}
//export L3_Subband_Synthesis
func L3_Subband_Synthesis(gr C.unsigned, ch C.unsigned, outdata *C.unsigned) {
out := make([]C.unsigned, 576)
for i := range out {
out[i] = *(*C.unsigned)(unsafe.Pointer(uintptr(unsafe.Pointer(outdata)) + uintptr(i)*unsafe.Sizeof(*outdata)))
}
u_vec := make([]float32, 512)
s_vec := make([]float32, 32)
/* Number of channels(1 for mono and 2 for stereo) */
nch := 2
if C.g_frame_header.mode == C.mpeg1_mode_single_channel {
nch = 1
}
/* Setup the n_win windowing vector and the v_vec intermediate vector */
for ss := 0; ss < 18; ss++ { /* Loop through 18 samples in 32 subbands */
for i := 1023; i > 63; i-- { /* Shift up the V vector */
v_vec[ch][i] = v_vec[ch][i-64]
}
for i := 0; i < 32; i++ { /* Copy next 32 time samples to a temp vector */
s_vec[i] = float32(C.g_main_data.is[gr][ch][i*18+ss])
}
for i := 0; i < 64; i++ { /* Matrix multiply input with n_win[][] matrix */
sum := float32(0)
for j := 0; j < 32; j++ {
sum += g_synth_n_win[i][j] * s_vec[j]
}
v_vec[ch][i] = sum
}
for i := 0; i < 8; i++ { /* Build the U vector */
for j := 0; j < 32; j++ { /* <<7 == *128 */
u_vec[(i<<6)+j] = v_vec[ch][(i<<7)+j]
u_vec[(i<<6)+j+32] = v_vec[ch][(i<<7)+j+96]
}
}
for i := 0; i < 512; i++ { /* Window by u_vec[i] with g_synth_dtbl[i] */
u_vec[i] *= g_synth_dtbl[i]
}
for i := 0; i < 32; i++ { /* Calc 32 samples,store in outdata vector */
sum := float32(0)
for j := 0; j < 16; j++ { /* sum += u_vec[j*32 + i]; */
sum += u_vec[(j<<5)+i]
}
/* sum now contains time sample 32*ss+i. Convert to 16-bit signed int */
samp := int(sum * 32767)
if samp > 32767 {
samp = 32767
} else if samp < -32767 {
samp = -32767
}
samp &= 0xffff
if ch == 0 { /* This function must be called for channel 0 first */
/* We always run in stereo mode,& duplicate channels here for mono */
if nch == 1 {
out[32*ss+i] = C.unsigned((samp << 16) | (samp))
} else {
out[32*ss+i] = C.unsigned(samp << 16)
}
} else {
out[32*ss+i] |= C.unsigned(samp)
}
}
}
for i := range out {
*(*C.unsigned)(unsafe.Pointer(uintptr(unsafe.Pointer(outdata)) + uintptr(i)*unsafe.Sizeof(*outdata))) = out[i]
}
}

View File

@ -49,7 +49,6 @@ static void L3_Frequency_Inversion(unsigned gr,unsigned ch);
static void L3_Requantize(unsigned gr,unsigned ch);
static void L3_Reorder(unsigned gr,unsigned ch);
static void L3_Stereo(unsigned gr);
static void L3_Subband_Synthesis(unsigned gr,unsigned ch,unsigned outdata[576]);
static void Read_Ancillary(void);
static void Requantize_Process_Long(unsigned gr,unsigned ch,unsigned is_pos,unsigned sfb);
static void Requantize_Process_Short(unsigned gr,unsigned ch,unsigned is_pos,unsigned sfb,unsigned win);
@ -81,139 +80,9 @@ static const float powtab34[32] = {
33.741995f,36.993185f,40.317478f,43.711792f,47.173351f,50.699637f,54.288359f,
57.937415f,61.644873f,65.408949f,69.227988f,73.100453f,77.024908f,81.000011f,
85.024502f,89.097200f,93.216988f,97.382814f
},
}
#endif
g_synth_dtbl[512] = {
0.000000000,-0.000015259,-0.000015259,-0.000015259,
-0.000015259,-0.000015259,-0.000015259,-0.000030518,
-0.000030518,-0.000030518,-0.000030518,-0.000045776,
-0.000045776,-0.000061035,-0.000061035,-0.000076294,
-0.000076294,-0.000091553,-0.000106812,-0.000106812,
-0.000122070,-0.000137329,-0.000152588,-0.000167847,
-0.000198364,-0.000213623,-0.000244141,-0.000259399,
-0.000289917,-0.000320435,-0.000366211,-0.000396729,
-0.000442505,-0.000473022,-0.000534058,-0.000579834,
-0.000625610,-0.000686646,-0.000747681,-0.000808716,
-0.000885010,-0.000961304,-0.001037598,-0.001113892,
-0.001205444,-0.001296997,-0.001388550,-0.001480103,
-0.001586914,-0.001693726,-0.001785278,-0.001907349,
-0.002014160,-0.002120972,-0.002243042,-0.002349854,
-0.002456665,-0.002578735,-0.002685547,-0.002792358,
-0.002899170,-0.002990723,-0.003082275,-0.003173828,
0.003250122, 0.003326416, 0.003387451, 0.003433228,
0.003463745, 0.003479004, 0.003479004, 0.003463745,
0.003417969, 0.003372192, 0.003280640, 0.003173828,
0.003051758, 0.002883911, 0.002700806, 0.002487183,
0.002227783, 0.001937866, 0.001617432, 0.001266479,
0.000869751, 0.000442505,-0.000030518,-0.000549316,
-0.001098633,-0.001693726,-0.002334595,-0.003005981,
-0.003723145,-0.004486084,-0.005294800,-0.006118774,
-0.007003784,-0.007919312,-0.008865356,-0.009841919,
-0.010848999,-0.011886597,-0.012939453,-0.014022827,
-0.015121460,-0.016235352,-0.017349243,-0.018463135,
-0.019577026,-0.020690918,-0.021789551,-0.022857666,
-0.023910522,-0.024932861,-0.025909424,-0.026840210,
-0.027725220,-0.028533936,-0.029281616,-0.029937744,
-0.030532837,-0.031005859,-0.031387329,-0.031661987,
-0.031814575,-0.031845093,-0.031738281,-0.031478882,
0.031082153, 0.030517578, 0.029785156, 0.028884888,
0.027801514, 0.026535034, 0.025085449, 0.023422241,
0.021575928, 0.019531250, 0.017257690, 0.014801025,
0.012115479, 0.009231567, 0.006134033, 0.002822876,
-0.000686646,-0.004394531,-0.008316040,-0.012420654,
-0.016708374,-0.021179199,-0.025817871,-0.030609131,
-0.035552979,-0.040634155,-0.045837402,-0.051132202,
-0.056533813,-0.061996460,-0.067520142,-0.073059082,
-0.078628540,-0.084182739,-0.089706421,-0.095169067,
-0.100540161,-0.105819702,-0.110946655,-0.115921021,
-0.120697021,-0.125259399,-0.129562378,-0.133590698,
-0.137298584,-0.140670776,-0.143676758,-0.146255493,
-0.148422241,-0.150115967,-0.151306152,-0.151962280,
-0.152069092,-0.151596069,-0.150497437,-0.148773193,
-0.146362305,-0.143264771,-0.139450073,-0.134887695,
-0.129577637,-0.123474121,-0.116577148,-0.108856201,
0.100311279, 0.090927124, 0.080688477, 0.069595337,
0.057617188, 0.044784546, 0.031082153, 0.016510010,
0.001068115,-0.015228271,-0.032379150,-0.050354004,
-0.069168091,-0.088775635,-0.109161377,-0.130310059,
-0.152206421,-0.174789429,-0.198059082,-0.221984863,
-0.246505737,-0.271591187,-0.297210693,-0.323318481,
-0.349868774,-0.376800537,-0.404083252,-0.431655884,
-0.459472656,-0.487472534,-0.515609741,-0.543823242,
-0.572036743,-0.600219727,-0.628295898,-0.656219482,
-0.683914185,-0.711318970,-0.738372803,-0.765029907,
-0.791213989,-0.816864014,-0.841949463,-0.866363525,
-0.890090942,-0.913055420,-0.935195923,-0.956481934,
-0.976852417,-0.996246338,-1.014617920,-1.031936646,
-1.048156738,-1.063217163,-1.077117920,-1.089782715,
-1.101211548,-1.111373901,-1.120223999,-1.127746582,
-1.133926392,-1.138763428,-1.142211914,-1.144287109,
1.144989014, 1.144287109, 1.142211914, 1.138763428,
1.133926392, 1.127746582, 1.120223999, 1.111373901,
1.101211548, 1.089782715, 1.077117920, 1.063217163,
1.048156738, 1.031936646, 1.014617920, 0.996246338,
0.976852417, 0.956481934, 0.935195923, 0.913055420,
0.890090942, 0.866363525, 0.841949463, 0.816864014,
0.791213989, 0.765029907, 0.738372803, 0.711318970,
0.683914185, 0.656219482, 0.628295898, 0.600219727,
0.572036743, 0.543823242, 0.515609741, 0.487472534,
0.459472656, 0.431655884, 0.404083252, 0.376800537,
0.349868774, 0.323318481, 0.297210693, 0.271591187,
0.246505737, 0.221984863, 0.198059082, 0.174789429,
0.152206421, 0.130310059, 0.109161377, 0.088775635,
0.069168091, 0.050354004, 0.032379150, 0.015228271,
-0.001068115,-0.016510010,-0.031082153,-0.044784546,
-0.057617188,-0.069595337,-0.080688477,-0.090927124,
0.100311279, 0.108856201, 0.116577148, 0.123474121,
0.129577637, 0.134887695, 0.139450073, 0.143264771,
0.146362305, 0.148773193, 0.150497437, 0.151596069,
0.152069092, 0.151962280, 0.151306152, 0.150115967,
0.148422241, 0.146255493, 0.143676758, 0.140670776,
0.137298584, 0.133590698, 0.129562378, 0.125259399,
0.120697021, 0.115921021, 0.110946655, 0.105819702,
0.100540161, 0.095169067, 0.089706421, 0.084182739,
0.078628540, 0.073059082, 0.067520142, 0.061996460,
0.056533813, 0.051132202, 0.045837402, 0.040634155,
0.035552979, 0.030609131, 0.025817871, 0.021179199,
0.016708374, 0.012420654, 0.008316040, 0.004394531,
0.000686646,-0.002822876,-0.006134033,-0.009231567,
-0.012115479,-0.014801025,-0.017257690,-0.019531250,
-0.021575928,-0.023422241,-0.025085449,-0.026535034,
-0.027801514,-0.028884888,-0.029785156,-0.030517578,
0.031082153, 0.031478882, 0.031738281, 0.031845093,
0.031814575, 0.031661987, 0.031387329, 0.031005859,
0.030532837, 0.029937744, 0.029281616, 0.028533936,
0.027725220, 0.026840210, 0.025909424, 0.024932861,
0.023910522, 0.022857666, 0.021789551, 0.020690918,
0.019577026, 0.018463135, 0.017349243, 0.016235352,
0.015121460, 0.014022827, 0.012939453, 0.011886597,
0.010848999, 0.009841919, 0.008865356, 0.007919312,
0.007003784, 0.006118774, 0.005294800, 0.004486084,
0.003723145, 0.003005981, 0.002334595, 0.001693726,
0.001098633, 0.000549316, 0.000030518,-0.000442505,
-0.000869751,-0.001266479,-0.001617432,-0.001937866,
-0.002227783,-0.002487183,-0.002700806,-0.002883911,
-0.003051758,-0.003173828,-0.003280640,-0.003372192,
-0.003417969,-0.003463745,-0.003479004,-0.003479004,
-0.003463745,-0.003433228,-0.003387451,-0.003326416,
0.003250122, 0.003173828, 0.003082275, 0.002990723,
0.002899170, 0.002792358, 0.002685547, 0.002578735,
0.002456665, 0.002349854, 0.002243042, 0.002120972,
0.002014160, 0.001907349, 0.001785278, 0.001693726,
0.001586914, 0.001480103, 0.001388550, 0.001296997,
0.001205444, 0.001113892, 0.001037598, 0.000961304,
0.000885010, 0.000808716, 0.000747681, 0.000686646,
0.000625610, 0.000579834, 0.000534058, 0.000473022,
0.000442505, 0.000396729, 0.000366211, 0.000320435,
0.000289917, 0.000259399, 0.000244141, 0.000213623,
0.000198364, 0.000167847, 0.000152588, 0.000137329,
0.000122070, 0.000106812, 0.000106812, 0.000091553,
0.000076294, 0.000076294, 0.000061035, 0.000061035,
0.000045776, 0.000045776, 0.000030518, 0.000030518,
0.000030518, 0.000030518, 0.000015259, 0.000015259,
0.000015259, 0.000015259, 0.000015259, 0.000015259,
//},g_synth_n_win[64][32]={
};
;
unsigned synth_init = 1;
@ -796,79 +665,6 @@ static void L3_Stereo(unsigned gr){
} /* end if(intensity_stereo processing) */
}
/**Description: TBD
* Parameters: TBD
* Return value: TBD
* Author: Krister Lagerström(krister@kmlager.com) **/
static void L3_Subband_Synthesis(unsigned gr,unsigned ch,unsigned outdata[576]){
float u_vec[512],s_vec[32],sum; /* u_vec can be used insted of s_vec */
int32_t samp;
static unsigned init = 1;
unsigned i,j,ss,nch;
static float g_synth_n_win[64][32],v_vec[2 /* ch */][1024];
/* Number of channels(1 for mono and 2 for stereo) */
nch =(g_frame_header.mode == mpeg1_mode_single_channel) ? 1 : 2 ;
/* Setup the n_win windowing vector and the v_vec intermediate vector */
if(init) {
for(i = 0; i < 64; i++) {
for(j = 0; j < 32; j++) /*TODO: put in lookup table*/
g_synth_n_win[i][j] = cos(((float)(16+i)*(2*j+1)) *(C_PI/64.0));
}
for(i = 0; i < 2; i++) /* Setup the v_vec intermediate vector */
for(j = 0; j < 1024; j++) v_vec[i][j] = 0.0; /*TODO: memset */
init = 0;
} /* end if(init) */
if(synth_init) {
for(i = 0; i < 2; i++) /* Setup the v_vec intermediate vector */
for(j = 0; j < 1024; j++) v_vec[i][j] = 0.0; /*TODO: memset*/
synth_init = 0;
} /* end if(synth_init) */
for(ss = 0; ss < 18; ss++){ /* Loop through 18 samples in 32 subbands */
for(i = 1023; i > 63; i--) /* Shift up the V vector */
v_vec[ch][i] = v_vec[ch][i-64];
for(i = 0; i < 32; i++) /* Copy next 32 time samples to a temp vector */
s_vec[i] =((float) g_main_data.is[gr][ch][i*18 + ss]);
for(i = 0; i < 64; i++){ /* Matrix multiply input with n_win[][] matrix */
sum = 0.0;
for(j = 0; j < 32; j++) sum += g_synth_n_win[i][j] * s_vec[j];
v_vec[ch][i] = sum;
} /* end for(i... */
for(i = 0; i < 8; i++) { /* Build the U vector */
for(j = 0; j < 32; j++) { /* <<7 == *128 */
u_vec[(i << 6) + j] = v_vec[ch][(i << 7) + j];
u_vec[(i << 6) + j + 32] = v_vec[ch][(i << 7) + j + 96];
}
} /* end for(i... */
for(i = 0; i < 512; i++) /* Window by u_vec[i] with g_synth_dtbl[i] */
u_vec[i] = u_vec[i] * g_synth_dtbl[i];
for(i = 0; i < 32; i++) { /* Calc 32 samples,store in outdata vector */
sum = 0.0;
for(j = 0; j < 16; j++) /* sum += u_vec[j*32 + i]; */
sum += u_vec[(j << 5) + i];
/* sum now contains time sample 32*ss+i. Convert to 16-bit signed int */
samp =(int32_t)(sum * 32767.0);
if(samp > 32767) samp = 32767;
else if(samp < -32767) samp = -32767;
samp &= 0xffff;
if(ch == 0) { /* This function must be called for channel 0 first */
/* We always run in stereo mode,& duplicate channels here for mono */
if(nch == 1) {
outdata[32*ss + i] =(samp << 16) |(samp);
}else{
outdata[32*ss + i] = samp << 16;
}
}else{
outdata[32*ss + i] |= samp;
}
} /* end for(i... */
} /* end for(ss... */
return; /* Done */
}
/**Description: called by Read_Main_L3 to read Huffman coded data from bitstream.
* Parameters: None
* Return value: None. The data is stored in g_main_data.is[ch][gr][freqline].

View File

@ -100,6 +100,7 @@ static int Read_Header(void);
void Read_Huffman(unsigned part_2_start,unsigned gr,unsigned ch);
void L3_Hybrid_Synthesis(unsigned gr,unsigned ch);
void L3_Subband_Synthesis(unsigned gr,unsigned ch, unsigned* outdata);
int Read_CRC(void);