示例#1
0
        //public void decode(BitStream in, WindowSequence winSeq) throws AACException {
        //maxBand = in.readBits(2)+1;

        //int wdLen, locBits, locBits2 = 0;
        //switch(winSeq) {
        //case ONLY_LONG_SEQUENCE:
        //wdLen = 1;
        //locBits = 5;
        //locBits2 = 5;
        //break;
        //case EIGHT_SHORT_SEQUENCE:
        //wdLen = 8;
        //locBits = 2;
        //locBits2 = 2;
        //break;
        //case LONG_START_SEQUENCE:
        //wdLen = 2;
        //locBits = 4;
        //locBits2 = 2;
        //break;
        //case LONG_STOP_SEQUENCE:
        //wdLen = 2;
        //locBits = 4;
        //locBits2 = 5;
        //break;
        //default:
        //return;
        //}
        //level = new int[maxBand,wdLen,];
        //location = new int[maxBand,wdLen,];

        //int wd, k, len, bits;
        //for(int bd = 1; bd<maxBand; bd++) {
        //for(wd = 0; wd<wdLen; wd++) {
        //len = in.readBits(3);
        //level[bd,wd] = new int[len];
        //location[bd,wd] = new int[len];
        //for(k = 0; k<len; k++) {
        //level[bd,wd,k] = in.readBits(4);
        //bits = (wd==0) ? locBits : locBits2;
        //location[bd,wd,k] = in.readBits(bits);
        //}
        //}
        //}
        //}

        public void process(float[] data, int winShape, int winShapePrev, ICSInfo.WindowSequence winSeq)
        {
            imdct.process(data, buffer1, winShape, winShapePrev, winSeq);

            throw new NotImplementedException();

            //for (int i = 0; i < BANDS; i++)
            //{
            //  compensate(buffer1, buffer2, winSeq, i);
            //}

            //ipqf.process(buffer2, frameLen, maxBand, data);
        }
示例#2
0
        private void process2(float[] inData, float[] outData, ICSInfo.WindowSequence winSeq, int winShape, int winShapePrev, int band)
        {
            float[] bufIn   = new float[lbLong];
            float[] bufOut  = new float[lbLong * 2];
            float[] window  = new float[lbLong * 2];
            float[] window1 = new float[lbShort * 2];
            float[] window2 = new float[lbShort * 2];

            //init windows
            int i;

            switch (winSeq)
            {
            case ICSInfo.WindowSequence.ONLY_LONG_SEQUENCE:
            {
                for (i = 0; i < lbLong; i++)
                {
                    window[i] = LONG_WINDOWS[winShapePrev][i];
                    window[lbLong * 2 - 1 - i] = LONG_WINDOWS[winShape][i];
                }
            } break;

            case ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE:
            {
                for (i = 0; i < lbShort; i++)
                {
                    window1[i] = SHORT_WINDOWS[winShapePrev][i];
                    window1[lbShort * 2 - 1 - i] = SHORT_WINDOWS[winShape][i];
                    window2[i] = SHORT_WINDOWS[winShape][i];
                    window2[lbShort * 2 - 1 - i] = SHORT_WINDOWS[winShape][i];
                }
            } break;

            case ICSInfo.WindowSequence.LONG_START_SEQUENCE:
            {
                for (i = 0; i < lbLong; i++)
                {
                    window[i] = LONG_WINDOWS[winShapePrev][i];
                }
                for (i = 0; i < lbMid; i++)
                {
                    window[i + lbLong] = 1.0f;
                }

                for (i = 0; i < lbShort; i++)
                {
                    window[i + lbMid + lbLong] = SHORT_WINDOWS[winShape][lbShort - 1 - i];
                }
                for (i = 0; i < lbMid; i++)
                {
                    window[i + lbMid + lbLong + lbShort] = 0.0f;
                }
            } break;

            case ICSInfo.WindowSequence.LONG_STOP_SEQUENCE:
            {
                for (i = 0; i < lbMid; i++)
                {
                    window[i] = 0.0f;
                }
                for (i = 0; i < lbShort; i++)
                {
                    window[i + lbMid] = SHORT_WINDOWS[winShapePrev][i];
                }
                for (i = 0; i < lbMid; i++)
                {
                    window[i + lbMid + lbShort] = 1.0f;
                }
                for (i = 0; i < lbLong; i++)
                {
                    window[i + lbMid + lbShort + lbMid] = LONG_WINDOWS[winShape][lbLong - 1 - i];
                }
            } break;
            }

            int j;

            if (winSeq == ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE)
            {
                int k;
                for (j = 0; j < 8; j++)
                {
                    for (k = 0; k < lbShort; k++)
                    {
                        bufIn[k] = inData[band * lbLong + j * lbShort + k];
                    }
                    if (j == 0)
                    {
                        Array.Copy(window1, 0, window, 0, lbShort * 2);
                    }
                    else
                    {
                        Array.Copy(window2, 0, window, 0, lbShort * 2);
                    }
                    imdct(bufIn, bufOut, window, lbShort);
                    for (k = 0; k < lbShort * 2; k++)
                    {
                        outData[band * lbLong * 2 + j * lbShort * 2 + k] = bufOut[k] / 32.0f;
                    }
                }
            }
            else
            {
                for (j = 0; j < lbLong; j++)
                {
                    bufIn[j] = inData[band * lbLong + j];
                }
                imdct(bufIn, bufOut, window, lbLong);
                for (j = 0; j < lbLong * 2; j++)
                {
                    outData[band * lbLong * 2 + j] = bufOut[j] / 256.0f;
                }
            }
        }
        public void process(ICSInfo.WindowSequence windowSequence, int windowShape, int windowShapePrev, float[] inData, float[] outArray, int channel)
        {
            var overlap = overlaps[channel];

            switch (windowSequence)
            {
            case ICSInfo.WindowSequence.ONLY_LONG_SEQUENCE:
            {
                mdctLong.process(inData, 0, buf, 0);
                //add second half output of previous frame to windowed output of current frame
                for (int i = 0; i < length; i++)
                {
                    outArray[i] = overlap[i] + (buf[i] * LONG_WINDOWS[windowShapePrev][i]);
                }

                //window the second half and save as overlap for next frame
                for (int i = 0; i < length; i++)
                {
                    overlap[i] = buf[length + i] * LONG_WINDOWS[windowShape][length - 1 - i];
                }
            } break;

            case ICSInfo.WindowSequence.LONG_START_SEQUENCE:
            {
                mdctLong.process(inData, 0, buf, 0);
                //add second half output of previous frame to windowed output of current frame
                for (int i = 0; i < length; i++)
                {
                    outArray[i] = overlap[i] + (buf[i] * LONG_WINDOWS[windowShapePrev][i]);
                }

                //window the second half and save as overlap for next frame
                for (int i = 0; i < mid; i++)
                {
                    overlap[i] = buf[length + i];
                }
                for (int i = 0; i < shortLen; i++)
                {
                    overlap[mid + i] = buf[length + mid + i] * SHORT_WINDOWS[windowShape][shortLen - i - 1];
                }
                for (int i = 0; i < mid; i++)
                {
                    overlap[mid + shortLen + i] = 0;
                }
            } break;

            case ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE:
            {
                for (int i = 0; i < 8; i++)
                {
                    mdctShort.process(inData, i * shortLen, buf, 2 * i * shortLen);
                }

                //add second half output of previous frame to windowed output of current frame
                for (int i = 0; i < mid; i++)
                {
                    outArray[i] = overlap[i];
                }
                for (int i = 0; i < shortLen; i++)
                {
                    outArray[mid + i] = overlap[mid + i] + (buf[i] * SHORT_WINDOWS[windowShapePrev][i]);
                    outArray[mid + 1 * shortLen + i] = overlap[mid + shortLen * 1 + i] + (buf[shortLen * 1 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 2 + i] * SHORT_WINDOWS[windowShape][i]);
                    outArray[mid + 2 * shortLen + i] = overlap[mid + shortLen * 2 + i] + (buf[shortLen * 3 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 4 + i] * SHORT_WINDOWS[windowShape][i]);
                    outArray[mid + 3 * shortLen + i] = overlap[mid + shortLen * 3 + i] + (buf[shortLen * 5 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 6 + i] * SHORT_WINDOWS[windowShape][i]);
                    if (i < trans)
                    {
                        outArray[mid + 4 * shortLen + i] = overlap[mid + shortLen * 4 + i] + (buf[shortLen * 7 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 8 + i] * SHORT_WINDOWS[windowShape][i]);
                    }
                }

                //window the second half and save as overlap for next frame
                for (int i = 0; i < shortLen; i++)
                {
                    if (i >= trans)
                    {
                        overlap[mid + 4 * shortLen + i - length] = (buf[shortLen * 7 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 8 + i] * SHORT_WINDOWS[windowShape][i]);
                    }
                    overlap[mid + 5 * shortLen + i - length] = (buf[shortLen * 9 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 10 + i] * SHORT_WINDOWS[windowShape][i]);
                    overlap[mid + 6 * shortLen + i - length] = (buf[shortLen * 11 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 12 + i] * SHORT_WINDOWS[windowShape][i]);
                    overlap[mid + 7 * shortLen + i - length] = (buf[shortLen * 13 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]) + (buf[shortLen * 14 + i] * SHORT_WINDOWS[windowShape][i]);
                    overlap[mid + 8 * shortLen + i - length] = (buf[shortLen * 15 + i] * SHORT_WINDOWS[windowShape][shortLen - 1 - i]);
                }
                for (int i = 0; i < mid; i++)
                {
                    overlap[mid + shortLen + i] = 0;
                }
            } break;

            case ICSInfo.WindowSequence.LONG_STOP_SEQUENCE:
            {
                mdctLong.process(inData, 0, buf, 0);
                //add second half output of previous frame to windowed output of current frame
                //construct first half window using padding with 1's and 0's
                for (int i = 0; i < mid; i++)
                {
                    outArray[i] = overlap[i];
                }
                for (int i = 0; i < shortLen; i++)
                {
                    outArray[mid + i] = overlap[mid + i] + (buf[mid + i] * SHORT_WINDOWS[windowShapePrev][i]);
                }
                for (int i = 0; i < mid; i++)
                {
                    outArray[mid + shortLen + i] = overlap[mid + shortLen + i] + buf[mid + shortLen + i];
                }
                //window the second half and save as overlap for next frame
                for (int i = 0; i < length; i++)
                {
                    overlap[i] = buf[length + i] * LONG_WINDOWS[windowShape][length - 1 - i];
                }
            } break;
            }
        }
示例#4
0
        public void process(float[] inData, float[] outData, int winShape, int winShapePrev, ICSInfo.WindowSequence winSeq)
        {
            var buf = new float[frameLen];

            if (winSeq == ICSInfo.WindowSequence.EIGHT_SHORT_SEQUENCE)
            {
                for (int b = 0; b < BANDS; b++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        for (int i = 0; i < lbShort; i++)
                        {
                            if (b % 2 == 0)
                            {
                                buf[lbLong * b + lbShort * j + i] = inData[shortFrameLen * j + lbShort * b + i];
                            }
                            else
                            {
                                buf[lbLong * b + lbShort * j + i] = inData[shortFrameLen * j + lbShort * b + lbShort - 1 - i];
                            }
                        }
                    }
                }
            }
            else
            {
                for (int b = 0; b < BANDS; b++)
                {
                    for (int i = 0; i < lbLong; i++)
                    {
                        if (b % 2 == 0)
                        {
                            buf[lbLong * b + i] = inData[lbLong * b + i];
                        }
                        else
                        {
                            buf[lbLong * b + i] = inData[lbLong * b + lbLong - 1 - i];
                        }
                    }
                }
            }

            for (int b = 0; b < BANDS; b++)
            {
                process2(buf, outData, winSeq, winShape, winShapePrev, b);
            }
        }