ssr_ipqf.c
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com
  4. **  
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. ** 
  10. ** This program 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
  13. ** GNU General Public License for more details.
  14. ** 
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software 
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. **
  19. ** Any non-GPL usage of this software or parts of this software is strictly
  20. ** forbidden.
  21. **
  22. ** Software using this code must display the following message visibly in the
  23. ** software:
  24. ** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Ahead Software, www.nero.com"
  25. ** in, for example, the about-box or help/startup screen.
  26. **
  27. ** Commercial non-GPL licensing of this software is possible.
  28. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  29. **
  30. ** $Id: ssr_ipqf.c,v 1.2 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. #include "common.h"
  33. #include "structs.h"
  34. #ifdef SSR_DEC
  35. #include "ssr.h"
  36. #include "ssr_ipqf.h"
  37. static real_t **app_pqfbuf;
  38. static real_t **pp_q0, **pp_t0, **pp_t1;
  39. void gc_set_protopqf(real_t *p_proto)
  40. {
  41.     int j;
  42.     static real_t a_half[48] =
  43.     {
  44.         1.2206911375946939E-05,  1.7261986723798209E-05,  1.2300093657077942E-05,
  45.         -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04,
  46.         -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04,
  47.         -2.6738519958452353E-04, -1.1949424681824722E-04,  1.3965139412648678E-04,
  48.         4.8864136409185725E-04,  8.7044629275148344E-04,  1.1949430269934793E-03,
  49.         1.3519708175026700E-03,  1.2346314373964412E-03,  7.6953209114159191E-04,
  50.         -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03,
  51.         -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03,
  52.         -2.8321073426874310E-03, -8.5038892323704195E-04,  1.8856751185350931E-03,
  53.         4.9688741735340923E-03,  7.8056704536795926E-03,  9.7027909685901654E-03,
  54.         9.9960423120166159E-03,  8.2019366335594487E-03,  4.1642072876103365E-03,
  55.         -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02,
  56.         -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02,
  57.         -1.5122066420044672E-02, -1.7971713448186293E-03,  1.6903413428575379E-02,
  58.         3.9672315874127042E-02,  6.4487527248102796E-02,  8.8850025474701726E-02,
  59.         0.1101132906105560    ,  0.1258540205143761    ,  0.1342239368467012    
  60.     };
  61.     for (j = 0; j < 48; ++j)
  62.     {
  63.         p_proto[j] = p_proto[95-j] = a_half[j];
  64.     }
  65. }
  66. void gc_setcoef_eff_pqfsyn(int mm,
  67.                            int kk,
  68.                            real_t *p_proto,
  69.                            real_t ***ppp_q0,
  70.                            real_t ***ppp_t0,
  71.                            real_t ***ppp_t1)
  72. {
  73.     int i, k, n;
  74.     real_t w;
  75.     /* Set 1st Mul&Acc Coef's */
  76.     *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *));
  77.     for (n = 0; n < mm; ++n)
  78.     {
  79.         (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t));
  80.     }
  81.     for (n = 0; n < mm/2; ++n)
  82.     {
  83.         for (i = 0; i < mm; ++i)
  84.         {
  85.             w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm);
  86.             (*ppp_q0)[n][i] = 2.0 * cos((real_t) w);
  87.             w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm);
  88.             (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w);
  89.         }
  90.     }
  91.     /* Set 2nd Mul&Acc Coef's */
  92.     *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *));
  93.     *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *));
  94.     for (n = 0; n < mm; ++n)
  95.     {
  96.         (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t));
  97.         (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t));
  98.     }
  99.     for (n = 0; n < mm; ++n)
  100.     {
  101.         for (k = 0; k < kk; ++k)
  102.         {
  103.             (*ppp_t0)[n][k] = mm * p_proto[2*k    *mm + n];
  104.             (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n];
  105.             if (k%2 != 0)
  106.             {
  107.                 (*ppp_t0)[n][k] = -(*ppp_t0)[n][k];
  108.                 (*ppp_t1)[n][k] = -(*ppp_t1)[n][k];
  109.             }
  110.         }
  111.     }
  112. }
  113. void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data,
  114.               real_t buffer[SSR_BANDS][96/4],
  115.               uint16_t frame_len, uint8_t bands)
  116. {
  117.     static int initFlag = 0;
  118.     real_t a_pqfproto[PQFTAPS];
  119.     int i;
  120.     if (initFlag == 0)
  121.     {
  122.         gc_set_protopqf(a_pqfproto);
  123.         gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto,
  124.             &pp_q0, &pp_t0, &pp_t1);
  125.         initFlag = 1;
  126.     }
  127.     for (i = 0; i < frame_len / SSR_BANDS; i++)
  128.     {
  129.         int l, n, k;
  130.         int mm = SSR_BANDS;
  131.         int kk = PQFTAPS/(2*SSR_BANDS);
  132.         for (n = 0; n < mm; n++)
  133.         {
  134.             for (k = 0; k < 2*kk-1; k++)
  135.             {
  136.                 buffer[n][k] = buffer[n][k+1];
  137.             }
  138.         }
  139.         for (n = 0; n < mm; n++)
  140.         {
  141.             real_t acc = 0.0;
  142.             for (l = 0; l < mm; l++)
  143.             {
  144.                 acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i];
  145.             }
  146.             buffer[n][2*kk-1] = acc;
  147.         }
  148.         for (n = 0; n < mm/2; n++)
  149.         {
  150.             real_t acc = 0.0;
  151.             for (k = 0; k < kk; k++)
  152.             {
  153.                 acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k];
  154.             }
  155.             for (k = 0; k < kk; ++k)
  156.             {
  157.                 acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k];
  158.             }
  159.             out_data[i*SSR_BANDS + n] = acc;
  160.             acc = 0.0;
  161.             for (k = 0; k < kk; k++)
  162.             {
  163.                 acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k];
  164.             }
  165.             for (k = 0; k < kk; k++)
  166.             {
  167.                 acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k];
  168.             }
  169.             out_data[i*SSR_BANDS + mm-1-n] = acc;
  170.         }
  171.     }
  172. }
  173. #endif