Пример #1
0
        private void decodeSpectralData(BitStream inStream)
        {
            Array.Clear(data, 0, data.Length);
            int maxSFB       = info.getMaxSFB();
            int windowGroups = info.getWindowGroupCount();

            int[] offsets = info.getSWBOffsets();
            int[] buf     = new int[4];

            int sfb, j, k, w, hcb, off, width, num;
            int groupOff = 0, idx = 0;

            for (int g = 0; g < windowGroups; g++)
            {
                int groupLen = info.getWindowGroupLength(g);

                for (sfb = 0; sfb < maxSFB; sfb++, idx++)
                {
                    hcb   = sfbCB[idx];
                    off   = groupOff + offsets[sfb];
                    width = offsets[sfb + 1] - offsets[sfb];
                    if (hcb == ZERO_HCB || hcb == INTENSITY_HCB || hcb == INTENSITY_HCB2)
                    {
                        for (w = 0; w < groupLen; w++, off += 128)
                        {
                            Array.Clear(data, off, width);
                        }
                    }
                    else if (hcb == NOISE_HCB)
                    {
                        //apply PNS: fill with random values
                        for (w = 0; w < groupLen; w++, off += 128)
                        {
                            float energy = 0;

                            for (k = 0; k < width; k++)
                            {
                                randomState  *= 1664525 + 1013904223;
                                data[off + k] = randomState;
                                energy       += data[off + k] * data[off + k];
                            }

                            float scale = (float)(scaleFactors[idx] / Math.Sqrt(energy));
                            for (k = 0; k < width; k++)
                            {
                                data[off + k] *= scale;
                            }
                        }
                    }
                    else
                    {
                        for (w = 0; w < groupLen; w++, off += 128)
                        {
                            num = (hcb >= FIRST_PAIR_HCB) ? 2 : 4;
                            for (k = 0; k < width; k += num)
                            {
                                Huffman.decodeSpectralData(inStream, hcb, buf, 0);

                                //inverse quantization & scaling
                                for (j = 0; j < num; j++)
                                {
                                    data[off + k + j]  = (buf[j] > 0) ? IQ_TABLE[buf[j]] : -IQ_TABLE[-buf[j]];
                                    data[off + k + j] *= scaleFactors[idx];
                                }
                            }
                        }
                    }
                }
                groupOff += groupLen << 7;
            }
        }