public EnvelopeLookup(PsyGlobal psyGlobal, VorbisInfo info) { _psyGlobal = psyGlobal; var codecSetup = info.CodecSetup; _minEnergy = codecSetup.PsyGlobalParam.PreEchoMinEnergy; _cursor = codecSetup.BlockSizes[1] / 2; _mdctWindow = new float[WindowLength]; _mdctLookup = new MdctLookup(WindowLength); for (var i = 0; i < _mdctWindow.Length; i++) { _mdctWindow[i] = (float)Math.Sin(i / (WindowLength - 1.0) * Math.PI); _mdctWindow[i] *= _mdctWindow[i]; } _bands = new EnvelopeBand[PsyGlobal.EnvelopeBands]; // Magic follows _bands[0] = new EnvelopeBand(2, 4); _bands[1] = new EnvelopeBand(4, 5); _bands[2] = new EnvelopeBand(6, 6); _bands[3] = new EnvelopeBand(9, 8); _bands[4] = new EnvelopeBand(13, 8); _bands[5] = new EnvelopeBand(17, 8); _bands[6] = new EnvelopeBand(22, 8); _filters = Enumerable .Range(0, PsyGlobal.EnvelopeBands * info.Channels) .Select(s => new EnvelopeFilterState()) .ToArray(); _mark = new int[WindowLength]; }
public static LookupCollection Create(VorbisInfo info) { var codecSetup = info.CodecSetup; var psyGlobal = new PsyGlobalLookup(codecSetup.PsyGlobalParam); var envelope = new EnvelopeLookup(codecSetup.PsyGlobalParam, info); // MDCT is tranform 0 var transform = new MdctLookup[2]; transform[0] = new MdctLookup(codecSetup.BlockSizes[0]); transform[1] = new MdctLookup(codecSetup.BlockSizes[1]); // analysis always needs an fft var fftLookup = new DrftLookup[2]; fftLookup[0] = new DrftLookup(codecSetup.BlockSizes[0]); fftLookup[1] = new DrftLookup(codecSetup.BlockSizes[1]); // finish the codebooks if (codecSetup.FullBooks == null) { codecSetup.FullBooks = new CodeBook[codecSetup.BookParams.Count]; for (var i = 0; i < codecSetup.BookParams.Count; i++) { codecSetup.FullBooks[i] = CodeBook.InitEncode(codecSetup.BookParams[i]); } } var psyLookup = new PsyLookup[codecSetup.PsyParams.Count]; for (var i = 0; i < psyLookup.Length; i++) { psyLookup[i] = new PsyLookup( codecSetup.PsyParams[i], codecSetup.PsyGlobalParam, codecSetup.BlockSizes[codecSetup.PsyParams[i].BlockFlag] / 2, info.SampleRate); } // initialize all the backend lookups var floor = new FloorLookup[codecSetup.FloorParams.Count]; for (var i = 0; i < floor.Length; i++) { floor[i] = new FloorLookup(codecSetup.FloorParams[i]); } var residue = new ResidueLookup[codecSetup.ResidueParams.Count]; for (var i = 0; i < residue.Length; i++) { residue[i] = new ResidueLookup(codecSetup.ResidueParams[i], new List <CodeBook>(codecSetup.FullBooks)); } return(new LookupCollection( envelope, new List <MdctLookup>(transform), psyGlobal, new List <PsyLookup>(psyLookup), new List <DrftLookup>(fftLookup), new List <FloorLookup>(floor), new List <ResidueLookup>(residue))); }