mdct.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*
  2.  * WMA compatible decoder
  3.  * Copyright (c) 2002 The FFmpeg Project.
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #include <string.h>
  20. #include "wmafixed.h"
  21. #include "mdct.h"
  22. /*these are the sin and cos rotations used by the MDCT*/
  23. /*accessed too infrequently to give much speedup in IRAM*/
  24. int32_t *tcosarray[5], *tsinarray[5];
  25. int32_t tcos0[1024], tcos1[512], tcos2[256], tcos3[128], tcos4[64];
  26. int32_t tsin0[1024], tsin1[512], tsin2[256], tsin3[128], tsin4[64];
  27. uint16_t revtab0[1024];
  28. /**
  29.  * init MDCT or IMDCT computation.
  30.  */
  31. int ff_mdct_init(MDCTContext *s, int nbits, int inverse)
  32. {
  33.     int n, n4, i;
  34.     memset(s, 0, sizeof(*s));
  35.     n = 1 << nbits;            /* nbits ranges from 12 to 8 inclusive */
  36.     s->nbits = nbits;
  37.     s->n = n;
  38.     n4 = n >> 2;
  39.     s->tcos = tcosarray[12-nbits];
  40.     s->tsin = tsinarray[12-nbits];
  41.     for(i=0;i<n4;i++)
  42.     {
  43.         int32_t ip = itofix32(i) + 0x2000;
  44.         ip = ip >> nbits;
  45.         /*I can't remember why this works, but it seems
  46.           to agree for ~24 bits, maybe more!*/
  47.         s->tsin[i] = - fsincos(ip<<16, &(s->tcos[i]));
  48.         s->tcos[i] *=-1;
  49.     }
  50.     (&s->fft)->nbits = nbits-2;
  51.     (&s->fft)->inverse = inverse;
  52.     return 0;
  53. }
  54. /**
  55.  * Compute inverse MDCT of size N = 2^nbits
  56.  * @param output N samples
  57.  * @param input N/2 samples
  58.  * @param tmp N/2 samples
  59.  */
  60. void ff_imdct_calc(MDCTContext *s,
  61.                    int32_t *output,
  62.                    int32_t *input)
  63. {
  64.     int k, n8, n4, n2, n, j,scale;
  65.     const int32_t *tcos = s->tcos;
  66.     const int32_t *tsin = s->tsin;
  67.     const int32_t *in1, *in2;
  68.     FFTComplex *z1 = (FFTComplex *)output;
  69.     FFTComplex *z2 = (FFTComplex *)input;
  70.     int revtabshift = 12 - s->nbits;
  71.     n = 1 << s->nbits;
  72.     n2 = n >> 1;
  73.     n4 = n >> 2;
  74.     n8 = n >> 3;
  75.     /* pre rotation */
  76.     in1 = input;
  77.     in2 = input + n2 - 1;
  78.     for(k = 0; k < n4; k++)
  79.     {
  80.         j=revtab0[k<<revtabshift];
  81.         CMUL(&z1[j].re, &z1[j].im, *in2, *in1, tcos[k], tsin[k]);
  82.         in1 += 2;
  83.         in2 -= 2;
  84.     }
  85.     scale = fft_calc_unscaled(&s->fft, z1);
  86.     /* post rotation + reordering */
  87.     for(k = 0; k < n4; k++)
  88.     {
  89.         CMUL(&z2[k].re, &z2[k].im, (z1[k].re), (z1[k].im), tcos[k], tsin[k]);
  90.     }
  91.     for(k = 0; k < n8; k++)
  92.     {
  93.         int32_t r1,r2,r3,r4,r1n,r2n,r3n;
  94.         r1 = z2[n8 + k].im;
  95.         r1n = r1 * -1;
  96.         r2 = z2[n8-1-k].re;
  97.         r2n = r2 * -1;
  98.         r3 = z2[k+n8].re;
  99.         r3n = r3 * -1;
  100.         r4 = z2[n8-k-1].im;
  101.         output[2*k] = r1n;
  102.         output[n2-1-2*k] = r1;
  103.         output[2*k+1] = r2;
  104.         output[n2-1-2*k-1] = r2n;
  105.         output[n2 + 2*k]= r3n;
  106.         output[n-1- 2*k]= r3n;
  107.         output[n2 + 2*k+1]= r4;
  108.         output[n-2 - 2 * k] = r4;
  109.     }
  110. }
  111. /* init MDCT */
  112. int mdct_init_global(void)
  113. {
  114.     int i,j,m;
  115.     /* although seemingly degenerate, these cannot actually be merged together without
  116.        a substantial increase in error which is unjustified by the tiny memory savings*/
  117.     tcosarray[0] = tcos0; tcosarray[1] = tcos1; tcosarray[2] = tcos2; tcosarray[3] = tcos3;tcosarray[4] = tcos4;
  118.     tsinarray[0] = tsin0; tsinarray[1] = tsin1; tsinarray[2] = tsin2; tsinarray[3] = tsin3;tsinarray[4] = tsin4;
  119.     /* init the MDCT bit reverse table here rather then in fft_init */
  120.     for(i=0;i<1024;i++)           /*hard coded to a 2048 bit rotation*/
  121.     {                             /*smaller sizes can reuse the largest*/
  122.         m=0;
  123.         for(j=0;j<10;j++)
  124.         {
  125.             m |= ((i >> j) & 1) << (10-j-1);
  126.         }
  127.        revtab0[i]=m;
  128.     }
  129.     fft_init_global();
  130.     return 0;
  131. }