Ejemplo n.º 1
0
 public Channel(Block parentBlock, int channelIndex)
 {
     Block        = parentBlock;
     ChannelIndex = channelIndex;
     Config       = parentBlock.Config;
     Mdct         = new Mdct(Config.FrameSamplesPower, Tables.ImdctWindow[Config.FrameSamplesPower - 6]);
 }
Ejemplo n.º 2
0
 public void CosTablesAreCorrect(int sizeBits)
 {
     Mdct.GenerateTrigTables(sizeBits, out _, out double[] cos);
     for (int i = 0; i < PreBuiltMdctTables.CosTables[sizeBits].Length; i++)
     {
         Assert.Equal(PreBuiltMdctTables.CosTables[sizeBits][i], cos[i], 14);
     }
 }
Ejemplo n.º 3
0
 public void SinTablesAreCorrect(int sizeBits)
 {
     Mdct.GenerateTrigTables(sizeBits, out double[] sin, out _);
     for (int i = 0; i < PreBuiltMdctTables.SinTables[sizeBits].Length; i++)
     {
         Assert.Equal(PreBuiltMdctTables.SinTables[sizeBits][i], sin[i], 14);
     }
 }
Ejemplo n.º 4
0
        public void TestImdct()
        {
            float[] res     = new float[8];
            float[] fres    = new float[8];
            float[] resMdct = { -0.38134489f, -0.01107969f, 0.27565625f, 0.09201603f };

            var mdct  = new Mdct(4);
            var fmdct = new FastMdct(4);

            mdct.InverseNorm(resMdct, res);
            fmdct.InverseNorm(resMdct, fres);

            Assert.Multiple(() =>
            {
                Assert.That(res, Is.EqualTo(new[] { -0.05f, 0.05f, -0.05f, 0.05f, 0.45f, 0.15f, 0.15f, 0.45f }).Within(1e-5));
                Assert.That(fres, Is.EqualTo(res).Within(1e-5));
            });
        }
Ejemplo n.º 5
0
        public void TestMdct()
        {
            float[] res     = new float[4];
            float[] fres    = new float[4];
            float[] resMdct = { -0.38134489f, -0.01107969f, 0.27565625f, 0.09201603f };

            var mdct  = new Mdct(4);
            var fmdct = new FastMdct(4);

            mdct.DirectNorm(_test, res);
            fmdct.DirectNorm(_test, fres);

            Assert.Multiple(() =>
            {
                Assert.That(res, Is.EqualTo(resMdct).Within(1e-5));
                Assert.That(fres, Is.EqualTo(resMdct).Within(1e-5));
            });
        }
Ejemplo n.º 6
0
 public void ShuffleTablesAreCorrect(int sizeBits)
 {
     Assert.Equal(PreBuiltMdctTables.ShuffleTables[sizeBits], Mdct.GenerateShuffleTable(sizeBits));
 }
Ejemplo n.º 7
0
        // Analysis side code, but directly related to blocking.  Thus it's
        // here and not in analysis.c (which is for analysis transforms only).
        // The init is here because some of it is shared
        int init(Info vi, bool encp)
        {
            this.vi = vi;
            modebits = Util.ilog2(vi.Modes);

            transform[0] = new Object[VI_TRANSFORMB];
            transform[1] = new Object[VI_TRANSFORMB];

            // MDCT is tranform 0

            transform[0][0] = new Mdct();
            transform[1][0] = new Mdct();
            ((Mdct)transform[0][0]).Init(vi.blocksizes[0]);
            ((Mdct)transform[1][0]).Init(vi.blocksizes[1]);

            _window[0][0][0] = new float[VI_WINDOWB][];
            _window[0][0][1] = _window[0][0][0];
            _window[0][1][0] = _window[0][0][0];
            _window[0][1][1] = _window[0][0][0];
            _window[1][0][0] = new float[VI_WINDOWB][];
            _window[1][0][1] = new float[VI_WINDOWB][];
            _window[1][1][0] = new float[VI_WINDOWB][];
            _window[1][1][1] = new float[VI_WINDOWB][];

            for (int i = 0; i < VI_WINDOWB; i++)
            {
                _window[0][0][0][i] = window(i, vi.blocksizes[0], vi.blocksizes[0] / 2,
                    vi.blocksizes[0] / 2);
                _window[1][0][0][i] = window(i, vi.blocksizes[1], vi.blocksizes[0] / 2,
                    vi.blocksizes[0] / 2);
                _window[1][0][1][i] = window(i, vi.blocksizes[1], vi.blocksizes[0] / 2,
                    vi.blocksizes[1] / 2);
                _window[1][1][0][i] = window(i, vi.blocksizes[1], vi.blocksizes[1] / 2,
                    vi.blocksizes[0] / 2);
                _window[1][1][1][i] = window(i, vi.blocksizes[1], vi.blocksizes[1] / 2,
                    vi.blocksizes[1] / 2);
            }

            fullbooks = new CodeBook[vi.Books];
            for (int i = 0; i < vi.Books; i++)
            {
                fullbooks[i] = new CodeBook();
                fullbooks[i].init_decode(vi.BookParam[i]);
            }

            // initialize the storage vectors to a decent size greater than the
            // minimum

            pcm_storage = 8192; // we'll assume later that we have
            // a minimum of twice the blocksize of
            // accumulated samples in analysis
            pcm = new float[vi.Channels][];
            {
                for (int i = 0; i < vi.Channels; i++)
                {
                    pcm[i] = new float[pcm_storage];
                }
            }

            // all 1 (large block) or 0 (small block)
            // explicitly set for the sake of clarity
            lW = 0; // previous window size
            W = 0; // current window size

            // all vector indexes; multiples of samples_per_envelope_step
            centerW = vi.blocksizes[1] / 2;

            pcm_current = centerW;

            // initialize all the mapping/backend lookups
            mode = new Object[vi.Modes];
            for (int i = 0; i < vi.Modes; i++)
            {
                int mapnum = vi.ModeParam[i].mapping;
                int maptype = vi.map_type[mapnum];
                mode[i] = FuncMapping.mapping_P[maptype].look(this, vi.ModeParam[i],
                    vi.MapParam[mapnum]);
            }
            return (0);
        }