Beispiel #1
0
 void decodeSBR(BitStream inStream, SampleFrequency sf, int count, bool stereo, bool crc, bool downSampled, bool smallFrames)
 {
     if (sbr == null)
     {
         sbr = new SBR(smallFrames, elementInstanceTag == ELEMENT_CPE, sf, downSampled);
     }
     throw new NotImplementedException();
     //sbr.decode(inStream, count);
 }
        //  public void reset() {
        //    Arrays.fill(v, 0);
        //  }

        public void sbr_qmf_synthesis_32(SBR sbr, float[, ,] X, float[] output)
        {
            throw new NotImplementedException();
            //float[] x1 = new float[32], x2 = new float[32];
            //float scale = 1.f/64.f;
            //int n, k, out = 0;
            //int l;


            ///* qmf subsample l */
            //for(l = 0; l<sbr.numTimeSlotsRate; l++) {
            //  /* shift buffer v */
            //  /* buffer is not shifted, we are using a ringbuffer */
            //  //memmove(qmfs.v + 64, qmfs.v, (640-64)*sizeof(real_t));

            //  /* calculate 64 samples */
            //  /* complex pre-twiddle */
            //  for(k = 0; k<32; k++) {
            //    x1[k] = (X[l,k,0]*qmf32_pre_twiddle[k,0])-(X[l,k,1]*qmf32_pre_twiddle[k,1]);
            //    x2[k] = (X[l,k,1]*qmf32_pre_twiddle[k,0])+(X[l,k,0]*qmf32_pre_twiddle[k,1]);

            //    x1[k] *= scale;
            //    x2[k] *= scale;
            //  }

            //  /* transform */
            //  DCT4_32(x1, x1);
            //  DST4_32(x2, x2);

            //  for(n = 0; n<32; n++) {
            //    this.v[this.v_index+n] = this.v[this.v_index+640+n] = -x1[n]+x2[n];
            //    this.v[this.v_index+63-n] = this.v[this.v_index+640+63-n] = x1[n]+x2[n];
            //  }

            //  /* calculate 32 output samples and window */
            //  for(k = 0; k<32; k++) {
            //    output[out++] = (this.v[this.v_index+k]*qmf_c[2*k])
            //      +(this.v[this.v_index+96+k]*qmf_c[64+2*k])
            //      +(this.v[this.v_index+128+k]*qmf_c[128+2*k])
            //      +(this.v[this.v_index+224+k]*qmf_c[192+2*k])
            //      +(this.v[this.v_index+256+k]*qmf_c[256+2*k])
            //      +(this.v[this.v_index+352+k]*qmf_c[320+2*k])
            //      +(this.v[this.v_index+384+k]*qmf_c[384+2*k])
            //      +(this.v[this.v_index+480+k]*qmf_c[448+2*k])
            //      +(this.v[this.v_index+512+k]*qmf_c[512+2*k])
            //      +(this.v[this.v_index+608+k]*qmf_c[576+2*k]);
            //  }

            //  /* update ringbuffer index */
            //  this.v_index -= 64;
            //  if(this.v_index<0)
            //    this.v_index = (640-64);
            //}
        }
        public void sbr_qmf_analysis_32(SBR sbr, float[] input, float[, ,] X, int offset, int kx)
        {
            float[] u        = new float[64];
            float[] in_real  = new float[32], in_imag = new float[32];
            float[] out_real = new float[32], out_imag = new float[32];
            int     inNum    = 0;
            int     l;

            // qmf subsample l
            for (l = 0; l < sbr.numTimeSlotsRate; l++)
            {
                int n;

                // shift input buffer x
                // input buffer is not shifted anymore, x is implemented as double ringbuffer
                //memmove(qmfa.x + 32, qmfa.x, (320-32)*sizeof(real_t));

                // add new samples to input buffer x
                for (n = 32 - 1; n >= 0; n--)
                {
                    this.x[this.x_index + n] = this.x[this.x_index + n + 320] = input[inNum++];
                }

                // window and summation to create array u
                for (n = 0; n < 64; n++)
                {
                    u[n] = (this.x[this.x_index + n] * qmf_c[2 * n])
                           + (this.x[this.x_index + n + 64] * qmf_c[2 * (n + 64)])
                           + (this.x[this.x_index + n + 128] * qmf_c[2 * (n + 128)])
                           + (this.x[this.x_index + n + 192] * qmf_c[2 * (n + 192)])
                           + (this.x[this.x_index + n + 256] * qmf_c[2 * (n + 256)]);
                }

                // update ringbuffer index
                this.x_index -= 32;
                if (this.x_index < 0)
                {
                    this.x_index = (320 - 32);
                }

                // calculate 32 subband samples by introducing X
                // Reordering of data moved from DCT_IV to here
                in_imag[31] = u[1];
                in_real[0]  = u[0];
                for (n = 1; n < 31; n++)
                {
                    in_imag[31 - n] = u[n + 1];
                    in_real[n]      = -u[64 - n];
                }
                in_imag[0]  = u[32];
                in_real[31] = -u[33];

                // dct4_kernel is DCT_IV without reordering which is done before and after FFT
                throw new NotImplementedException();
                // DCT.dct4_kernel(in_real, in_imag, out_real, out_imag);

                // Reordering of data moved from DCT_IV to here
                for (n = 0; n < 16; n++)
                {
                    if (2 * n + 1 < kx)
                    {
                        X[l + offset, 2 * n, 0]     = 2.0f * out_real[n];
                        X[l + offset, 2 * n, 1]     = 2.0f * out_imag[n];
                        X[l + offset, 2 * n + 1, 0] = -2.0f * out_imag[31 - n];
                        X[l + offset, 2 * n + 1, 1] = -2.0f * out_real[31 - n];
                    }
                    else
                    {
                        if (2 * n < kx)
                        {
                            X[l + offset, 2 * n, 0] = 2.0f * out_real[n];
                            X[l + offset, 2 * n, 1] = 2.0f * out_imag[n];
                        }
                        else
                        {
                            X[l + offset, 2 * n, 0] = 0;
                            X[l + offset, 2 * n, 1] = 0;
                        }
                        X[l + offset, 2 * n + 1, 0] = 0;
                        X[l + offset, 2 * n + 1, 1] = 0;
                    }
                }
            }
        }
        public void sbr_qmf_synthesis_64(SBR sbr, float[, ,] X, float[] output)
        {
            throw new NotImplementedException();
            //float[] in_real1 = new float[32], in_imag1 = new float[32], out_real1 = new float[32], out_imag1 = new float[32];
            //float[] in_real2 = new float[32], in_imag2 = new float[32], out_real2 = new float[32], out_imag2 = new float[32];
            //float[,] pX;
            //float scale = 1.f/64.f;
            //int n, k, out = 0;
            //int l;


            ///* qmf subsample l */
            //for(l = 0; l<sbr.numTimeSlotsRate; l++) {
            //  /* shift buffer v */
            //  /* buffer is not shifted, we use double ringbuffer */
            //  //memmove(qmfs.v + 128, qmfs.v, (1280-128)*sizeof(real_t));

            //  /* calculate 128 samples */
            //  pX = X[l];

            //  in_imag1[31] = scale*pX[1,0];
            //  in_real1[0] = scale*pX[0,0];
            //  in_imag2[31] = scale*pX[63-1,1];
            //  in_real2[0] = scale*pX[63-0,1];
            //  for(k = 1; k<31; k++) {
            //    in_imag1[31-k] = scale*pX[2*k+1,0];
            //    in_real1[     k] = scale*pX[2*k,0];
            //    in_imag2[31-k] = scale*pX[63-(2*k+1),1];
            //    in_real2[     k] = scale*pX[63-(2*k),1];
            //  }
            //  in_imag1[0] = scale*pX[63,0];
            //  in_real1[31] = scale*pX[62,0];
            //  in_imag2[0] = scale*pX[63-63,1];
            //  in_real2[31] = scale*pX[63-62,1];

            //  // dct4_kernel is DCT_IV without reordering which is done before and after FFT
            //  DCT.dct4_kernel(in_real1, in_imag1, out_real1, out_imag1);
            //  DCT.dct4_kernel(in_real2, in_imag2, out_real2, out_imag2);

            //  int pring_buffer_1 = v_index; //*v
            //  int pring_buffer_3 = pring_buffer_1+1280;
            //  //        ptemp_1 = x1;
            //  //        ptemp_2 = x2;

            //  for(n = 0; n<32; n++) {
            //    // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer
            //    v[pring_buffer_1+2*n] = v[pring_buffer_3+2*n] = out_real2[n]-out_real1[n];
            //    v[pring_buffer_1+127-2*n] = v[pring_buffer_3+127-2*n] = out_real2[n]+out_real1[n];
            //    v[pring_buffer_1+2*n+1] = v[pring_buffer_3+2*n+1] = out_imag2[31-n]+out_imag1[31-n];
            //    v[pring_buffer_1+127-(2*n+1)] = v[pring_buffer_3+127-(2*n+1)] = out_imag2[31-n]-out_imag1[31-n];
            //  }

            //  pring_buffer_1 = v_index; //*v

            //  /* calculate 64 output samples and window */
            //  for(k = 0; k<64; k++) {
            //    output[out++]
            //      = (v[pring_buffer_1+k+0]*qmf_c[k+0])
            //      +(v[pring_buffer_1+k+192]*qmf_c[k+64])
            //      +(v[pring_buffer_1+k+256]*qmf_c[k+128])
            //      +(v[pring_buffer_1+k+(256+192)]*qmf_c[k+192])
            //      +(v[pring_buffer_1+k+512]*qmf_c[k+256])
            //      +(v[pring_buffer_1+k+(512+192)]*qmf_c[k+320])
            //      +(v[pring_buffer_1+k+768]*qmf_c[k+384])
            //      +(v[pring_buffer_1+k+(768+192)]*qmf_c[k+448])
            //      +(v[pring_buffer_1+k+1024]*qmf_c[k+512])
            //      +(v[pring_buffer_1+k+(1024+192)]*qmf_c[k+576]);
            //  }

            //  /* update ringbuffer index */
            //  this.v_index -= 128;
            //  if(this.v_index<0)
            //    this.v_index = (1280-128);
            //}
        }