예제 #1
0
        override internal Object look(DspState vd, InfoMode vm, Object m)
        {
            //System.err.println("Mapping0.look");
            Info         vi   = vd.vi;
            LookMapping0 look = new LookMapping0();
            InfoMapping0 info = look.map = (InfoMapping0)m;

            look.mode = vm;

            look.time_look    = new Object[info.submaps];
            look.floor_look   = new Object[info.submaps];
            look.residue_look = new Object[info.submaps];

            look.time_func    = new FuncTime[info.submaps];
            look.floor_func   = new FuncFloor[info.submaps];
            look.residue_func = new FuncResidue[info.submaps];

            for (int i = 0; i < info.submaps; i++)
            {
                int timenum  = info.timesubmap[i];
                int floornum = info.floorsubmap[i];
                int resnum   = info.residuesubmap[i];

                look.time_func[i]    = FuncTime.time_P[vi.TimeType[timenum]];
                look.time_look[i]    = look.time_func[i].look(vd, vm, vi.TimeParam[timenum]);
                look.floor_func[i]   = FuncFloor.floor_P[vi.FloorType[floornum]];
                look.floor_look[i]   = look.floor_func[i].look(vd, vm, vi.FloorParam[floornum]);
                look.residue_func[i] = FuncResidue.residue_P[vi.residue_type[resnum]];
                look.residue_look[i] = look.residue_func[i].look(vd, vm, vi.ResidueParam[resnum]);
            }

            /*
             * if (vi.psys != 0 && vd.analysisp != 0)
             * {
             *      // ??
             * }
             */

            look.ch = vi.Channels;

            return(look);
        }
예제 #2
0
        internal override Object look(DspState vd, InfoMode vm, Object m)
        {
            //System.err.println("Mapping0.look");
            Info vi = vd.vi;
            LookMapping0 look = new LookMapping0();
            InfoMapping0 info = look.map = (InfoMapping0)m;
            look.mode = vm;

            look.time_look = new Object[info.submaps];
            look.floor_look = new Object[info.submaps];
            look.residue_look = new Object[info.submaps];

            look.time_func = new FuncTime[info.submaps];
            look.floor_func = new FuncFloor[info.submaps];
            look.residue_func = new FuncResidue[info.submaps];

            for (int i = 0; i < info.submaps; i++)
            {
                int timenum = info.timesubmap[i];
                int floornum = info.floorsubmap[i];
                int resnum = info.residuesubmap[i];

                look.time_func[i] = FuncTime.time_P[vi.TimeType[timenum]];
                look.time_look[i] = look.time_func[i].look(vd, vm, vi.TimeParam[timenum]);
                look.floor_func[i] = FuncFloor.floor_P[vi.FloorType[floornum]];
                look.floor_look[i] = look.floor_func[i].look(vd, vm, vi.FloorParam[floornum]);
                look.residue_func[i] = FuncResidue.residue_P[vi.residue_type[resnum]];
                look.residue_look[i] = look.residue_func[i].look(vd, vm, vi.ResidueParam[resnum]);

            }

            /*
            if (vi.psys != 0 && vd.analysisp != 0)
            {
                // ??
            }
            */

            look.ch = vi.Channels;

            return (look);
        }
예제 #3
0
        override internal int inverse(Block vb, Object l)
        {
            lock (this)
            {
                DspState     vd   = vb.vd;
                Info         vi   = vd.vi;
                LookMapping0 look = (LookMapping0)l;
                InfoMapping0 info = look.map;
                InfoMode     mode = look.mode;
                int          n    = vb.pcmend = vi.blocksizes[vb.W];

                float[] window = vd._window[vb.W][vb.lW][vb.nW][mode.windowtype];
                if (pcmbundle == null || pcmbundle.Length < vi.Channels)
                {
                    pcmbundle  = new float[vi.Channels][];
                    nonzero    = new int[vi.Channels];
                    zerobundle = new int[vi.Channels];
                    floormemo  = new Object[vi.Channels];
                }

                // time domain information decode (note that applying the
                // information would have to happen later; we'll probably add a
                // function entry to the harness for that later
                // NOT IMPLEMENTED

                // recover the spectral envelope; store it in the PCM vector for now
                for (int i = 0; i < vi.Channels; i++)
                {
                    float[] pcm    = vb.pcm[i];
                    int     submap = info.chmuxlist[i];

                    floormemo[i] = look.floor_func[submap].inverse1(vb,
                                                                    look.floor_look[submap], floormemo[i]);
                    if (floormemo[i] != null)
                    {
                        nonzero[i] = 1;
                    }
                    else
                    {
                        nonzero[i] = 0;
                    }
                    for (int j = 0; j < n / 2; j++)
                    {
                        pcm[j] = 0;
                    }
                }

                for (int i = 0; i < info.coupling_steps; i++)
                {
                    if (nonzero[info.coupling_mag[i]] != 0 || nonzero[info.coupling_ang[i]] != 0)
                    {
                        nonzero[info.coupling_mag[i]] = 1;
                        nonzero[info.coupling_ang[i]] = 1;
                    }
                }

                // recover the residue, apply directly to the spectral envelope

                for (int i = 0; i < info.submaps; i++)
                {
                    int ch_in_bundle = 0;
                    for (int j = 0; j < vi.Channels; j++)
                    {
                        if (info.chmuxlist[j] == i)
                        {
                            if (nonzero[j] != 0)
                            {
                                zerobundle[ch_in_bundle] = 1;
                            }
                            else
                            {
                                zerobundle[ch_in_bundle] = 0;
                            }
                            pcmbundle[ch_in_bundle++] = vb.pcm[j];
                        }
                    }

                    look.residue_func[i].inverse(vb, look.residue_look[i], pcmbundle,
                                                 zerobundle, ch_in_bundle);
                }

                for (int i = info.coupling_steps - 1; i >= 0; i--)
                {
                    float[] pcmM = vb.pcm[info.coupling_mag[i]];
                    float[] pcmA = vb.pcm[info.coupling_ang[i]];

                    for (int j = 0; j < n / 2; j++)
                    {
                        float mag = pcmM[j];
                        float ang = pcmA[j];

                        if (mag > 0)
                        {
                            if (ang > 0)
                            {
                                pcmM[j] = mag;
                                pcmA[j] = mag - ang;
                            }
                            else
                            {
                                pcmA[j] = mag;
                                pcmM[j] = mag + ang;
                            }
                        }
                        else
                        {
                            if (ang > 0)
                            {
                                pcmM[j] = mag;
                                pcmA[j] = mag + ang;
                            }
                            else
                            {
                                pcmA[j] = mag;
                                pcmM[j] = mag - ang;
                            }
                        }
                    }
                }

                //    /* compute and apply spectral envelope */

                for (int i = 0; i < vi.Channels; i++)
                {
                    float[] pcm    = vb.pcm[i];
                    int     submap = info.chmuxlist[i];
                    look.floor_func[submap].inverse2(vb, look.floor_look[submap],
                                                     floormemo[i], pcm);
                }

                // transform the PCM data; takes PCM vector, vb; modifies PCM vector
                // only MDCT right now....

                for (int i = 0; i < vi.Channels; i++)
                {
                    float[] pcm = vb.pcm[i];
                    //_analysis_output("out",seq+i,pcm,n/2,0,0);
                    ((Mdct)vd.transform[vb.W][0]).Backward(pcm, pcm);
                }

                // now apply the decoded pre-window time information
                // NOT IMPLEMENTED

                // window the data
                for (int i = 0; i < vi.Channels; i++)
                {
                    float[] pcm = vb.pcm[i];
                    if (nonzero[i] != 0)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            pcm[j] *= window[j];
                        }
                    }
                    else
                    {
                        for (int j = 0; j < n; j++)
                        {
                            pcm[j] = 0.0f;
                        }
                    }
                }

                // now apply the decoded post-window time information
                // NOT IMPLEMENTED
                // all done!
                return(0);
            }
        }