public Channel(Block parentBlock, int channelIndex) { Block = parentBlock; ChannelIndex = channelIndex; Config = parentBlock.Config; Mdct = new Mdct(Config.FrameSamplesPower, Tables.ImdctWindow[Config.FrameSamplesPower - 6]); }
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); } }
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); } }
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)); }); }
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)); }); }
public void ShuffleTablesAreCorrect(int sizeBits) { Assert.Equal(PreBuiltMdctTables.ShuffleTables[sizeBits], Mdct.GenerateShuffleTable(sizeBits)); }
// 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); }