Example #1
0
    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];
    }
Example #2
0
        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)));
        }