⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpa_synth.cpp

📁 ac3的解码程序
💻 CPP
字号:
#include <string.h>
#include "mpa_defs.h"
#include "mpa_synth.h"
#include "mpa_synth_filter.h"



SynthBufferFPU::SynthBufferFPU()
{
  synth_offset = 64;
  memset(synth_buf, 0, sizeof(synth_buf));
}

void
SynthBufferFPU::reset()
{
  synth_offset = 64;
  memset(synth_buf, 0, sizeof(synth_buf));
}


void
SynthBufferFPU::synth(sample_t samples[32])
{
  int      i, j;
  sample_t *bufOffsetPtr;

  synth_offset = (synth_offset - 64) & 0x3ff;
  bufOffsetPtr = &(synth_buf[synth_offset]);
  
#define cos1_64  (sample_t)0.500602998235196
#define cos3_64  (sample_t)0.505470959897544
#define cos5_64  (sample_t)0.515447309922625
#define cos7_64  (sample_t)0.531042591089784
#define cos9_64  (sample_t)0.553103896034445
#define cos11_64 (sample_t)0.582934968206134
#define cos13_64 (sample_t)0.622504123035665
#define cos15_64 (sample_t)0.674808341455006
#define cos17_64 (sample_t)0.744536271002299
#define cos19_64 (sample_t)0.839349645415527
#define cos21_64 (sample_t)0.972568237861961
#define cos23_64 (sample_t)1.169439933432885
#define cos25_64 (sample_t)1.484164616314166
#define cos27_64 (sample_t)2.057781009953411
#define cos29_64 (sample_t)3.407608418468719
#define cos31_64 (sample_t)10.190008123548033
#define cos1_32  (sample_t)0.502419286188156
#define cos3_32  (sample_t)0.522498614939689
#define cos5_32  (sample_t)0.566944034816358
#define cos7_32  (sample_t)0.646821783359990
#define cos9_32  (sample_t)0.788154623451250
#define cos11_32 (sample_t)1.060677685990347
#define cos13_32 (sample_t)1.722447098238334
#define cos15_32 (sample_t)5.101148618689155
#define cos1_16  (sample_t)0.509795579104159
#define cos3_16  (sample_t)0.601344886935045
#define cos5_16  (sample_t)0.899976223136416
#define cos7_16  (sample_t)2.562915447741505
#define cos1_8   (sample_t)0.541196100146197
#define cos3_8   (sample_t)1.306562964876376
#define cos1_4   (sample_t)0.707106781186547
    
    {
      int i;
      register sample_t tmp;
      sample_t p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15;
      sample_t pp0,pp1,pp2,pp3,pp4,pp5,pp6,pp7,pp8,pp9,pp10,pp11,pp12,pp13,pp14,pp15;
      
      // Compute new values via a fast cosine transform
      p0  = samples[0] + samples[31];
      p1  = samples[1] + samples[30];
      p2  = samples[2] + samples[29];
      p3  = samples[3] + samples[28];
      p4  = samples[4] + samples[27];
      p5  = samples[5] + samples[26];
      p6  = samples[6] + samples[25];
      p7  = samples[7] + samples[24];
      p8  = samples[8] + samples[23];
      p9  = samples[9] + samples[22];
      p10 = samples[10]+ samples[21];
      p11 = samples[11]+ samples[20];
      p12 = samples[12]+ samples[19];
      p13 = samples[13]+ samples[18];
      p14 = samples[14]+ samples[17];
      p15 = samples[15]+ samples[16];
      
      pp0 = p0 + p15;
      pp1 = p1 + p14;
      pp2 = p2 + p13;
      pp3 = p3 + p12;
      pp4 = p4 + p11;
      pp5 = p5 + p10;
      pp6 = p6 + p9;
      pp7 = p7 + p8;
      pp8 = cos1_32  * (p0 - p15);
      pp9 = cos3_32  * (p1 - p14);
      pp10= cos5_32  * (p2 - p13);
      pp11= cos7_32  * (p3 - p12);
      pp12= cos9_32  * (p4 - p11);
      pp13= cos11_32 * (p5 - p10);
      pp14= cos13_32 * (p6 - p9);
      pp15= cos15_32 * (p7 - p8);
      
      p0  = pp0 + pp7;
      p1  = pp1 + pp6;
      p2  = pp2 + pp5;
      p3  = pp3 + pp4;
      p4  = cos1_16 * (pp0 - pp7);
      p5  = cos3_16 * (pp1 - pp6);
      p6  = cos5_16 * (pp2 - pp5);
      p7  = cos7_16 * (pp3 - pp4);
      p8  = pp8 + pp15;
      p9  = pp9 + pp14;
      p10 = pp10 + pp13;
      p11 = pp11 + pp12;
      p12 = cos1_16 * (pp8  - pp15);
      p13 = cos3_16 * (pp9  - pp14);
      p14 = cos5_16 * (pp10 - pp13);
      p15 = cos7_16 * (pp11 - pp12);
      
      pp0 = p0 + p3;
      pp1 = p1 + p2;
      pp2 = cos1_8 * (p0 - p3);
      pp3 = cos3_8 * (p1 - p2);
      pp4 = p4 + p7;
      pp5 = p5 + p6;
      pp6 = cos1_8 * (p4 - p7);
      pp7 = cos3_8 * (p5 - p6);
      pp8 = p8 + p11;
      pp9 = p9 + p10;
      pp10= cos1_8 * (p8 - p11);
      pp11= cos3_8 * (p9 - p10);
      pp12= p12 + p15;
      pp13= p13 + p14;
      pp14= cos1_8 * (p12 - p15);
      pp15= cos3_8 * (p13 - p14);
      
      p0  = pp0 + pp1;
      p1  = cos1_4 * (pp0 - pp1);
      p2  = pp2 + pp3;
      p3  = cos1_4 * (pp2 - pp3);
      p4  = pp4 + pp5;
      p5  = cos1_4 * (pp4 - pp5);
      p6  = pp6 + pp7;
      p7  = cos1_4 * (pp6 - pp7);
      p8  = pp8 + pp9;
      p9  = cos1_4 * (pp8 - pp9);
      p10 = pp10 + pp11;
      p11 = cos1_4 * (pp10 - pp11);
      p12 = pp12 + pp13;
      p13 = cos1_4 * (pp12 - pp13);
      p14 = pp14 + pp15;
      p15 = cos1_4 * (pp14 - pp15);
      
      tmp              = p6 + p7;
      bufOffsetPtr[36] = -(p5 + tmp);
      bufOffsetPtr[44] = -(p4 + tmp);
      tmp              = p11 + p15;
      bufOffsetPtr[10] = tmp;
      bufOffsetPtr[6]  = p13 + tmp;
      tmp              = p14 + p15;
      bufOffsetPtr[46] = -(p8  + p12 + tmp);
      bufOffsetPtr[34] = -(p9  + p13 + tmp);
      tmp             += p10 + p11;
      bufOffsetPtr[38] = -(p13 + tmp);
      bufOffsetPtr[42] = -(p12 + tmp);
      bufOffsetPtr[2]  = p9 + p13 + p15;
      bufOffsetPtr[4]  = p5 + p7;
      bufOffsetPtr[48] = -p0;
      bufOffsetPtr[0]  = p1;
      bufOffsetPtr[8]  = p3;
      bufOffsetPtr[12] = p7;
      bufOffsetPtr[14] = p15;
      bufOffsetPtr[40] = -(p2  + p3);
      
      p0  = cos1_64  * (samples[0] - samples[31]);
      p1  = cos3_64  * (samples[1] - samples[30]);
      p2  = cos5_64  * (samples[2] - samples[29]);
      p3  = cos7_64  * (samples[3] - samples[28]);
      p4  = cos9_64  * (samples[4] - samples[27]);
      p5  = cos11_64 * (samples[5] - samples[26]);
      p6  = cos13_64 * (samples[6] - samples[25]);
      p7  = cos15_64 * (samples[7] - samples[24]);
      p8  = cos17_64 * (samples[8] - samples[23]);
      p9  = cos19_64 * (samples[9] - samples[22]);
      p10 = cos21_64 * (samples[10]- samples[21]);
      p11 = cos23_64 * (samples[11]- samples[20]);
      p12 = cos25_64 * (samples[12]- samples[19]);
      p13 = cos27_64 * (samples[13]- samples[18]);
      p14 = cos29_64 * (samples[14]- samples[17]);
      p15 = cos31_64 * (samples[15]- samples[16]);
      
      pp0 = p0 + p15;
      pp1 = p1 + p14;
      pp2 = p2 + p13;
      pp3 = p3 + p12;
      pp4 = p4 + p11;
      pp5 = p5 + p10;
      pp6 = p6 + p9;
      pp7 = p7 + p8;
      pp8 = cos1_32  * (p0 - p15);
      pp9 = cos3_32  * (p1 - p14);
      pp10= cos5_32  * (p2 - p13);
      pp11= cos7_32  * (p3 - p12);
      pp12= cos9_32  * (p4 - p11);
      pp13= cos11_32 * (p5 - p10);
      pp14= cos13_32 * (p6 - p9);
      pp15= cos15_32 * (p7 - p8);
      
      p0  = pp0 + pp7;
      p1  = pp1 + pp6;
      p2  = pp2 + pp5;
      p3  = pp3 + pp4;
      p4  = cos1_16 * (pp0 - pp7);
      p5  = cos3_16 * (pp1 - pp6);
      p6  = cos5_16 * (pp2 - pp5);
      p7  = cos7_16 * (pp3 - pp4);
      p8  = pp8  + pp15;
      p9  = pp9  + pp14;
      p10 = pp10 + pp13;
      p11 = pp11 + pp12;
      p12 = cos1_16 * (pp8  - pp15);
      p13 = cos3_16 * (pp9  - pp14);
      p14 = cos5_16 * (pp10 - pp13);
      p15 = cos7_16 * (pp11 - pp12);
      
      pp0 = p0 + p3;
      pp1 = p1 + p2;
      pp2 = cos1_8 * (p0 - p3);
      pp3 = cos3_8 * (p1 - p2);
      pp4 = p4 + p7;
      pp5 = p5 + p6;
      pp6 = cos1_8 * (p4 - p7);
      pp7 = cos3_8 * (p5 - p6);
      pp8 = p8 + p11;
      pp9 = p9 + p10;
      pp10= cos1_8 * (p8 - p11);
      pp11= cos3_8 * (p9 - p10);
      pp12= p12 + p15;
      pp13= p13 + p14;
      pp14= cos1_8 * (p12 - p15);
      pp15= cos3_8 * (p13 - p14);
      
      p0  = pp0 + pp1;
      p1  = cos1_4 * (pp0 - pp1);
      p2  = pp2 + pp3;
      p3  = cos1_4 * (pp2 - pp3);
      p4  = pp4 + pp5;
      p5  = cos1_4 * (pp4 - pp5);
      p6  = pp6 + pp7;
      p7  = cos1_4 * (pp6 - pp7);
      p8  = pp8 + pp9;
      p9  = cos1_4 * (pp8 - pp9);
      p10 = pp10 + pp11;
      p11 = cos1_4 * (pp10 - pp11);
      p12 = pp12 + pp13;
      p13 = cos1_4 * (pp12 - pp13);
      p14 = pp14 + pp15;
      p15 = cos1_4 * (pp14 - pp15);
      
      tmp              = p13 + p15;
      bufOffsetPtr[1]  = p1 + p9 + tmp;
      bufOffsetPtr[5]  = p5 + p7 + p11 + tmp;
      tmp             += p9;
      bufOffsetPtr[33] = -(p1 + p14 + tmp);
      tmp             += p5 + p7;
      bufOffsetPtr[3]  = tmp;
      bufOffsetPtr[35] = -(p6 + p14 + tmp);
      tmp              = p10 + p11 + p12 + p13 + p14 + p15;
      bufOffsetPtr[39] = -(p2 + p3 + tmp - p12);
      bufOffsetPtr[43] = -(p4 + p6 + p7 + tmp - p13);
      bufOffsetPtr[37] = -(p5 + p6 + p7 + tmp - p12);
      bufOffsetPtr[41] = -(p2 + p3 + tmp - p13);
      tmp              = p8 + p12 + p14 + p15;
      bufOffsetPtr[47] = -(p0 + tmp);
      bufOffsetPtr[45] = -(p4 + p6 + p7 + tmp);
      tmp              = p11 + p15;
      bufOffsetPtr[11] = p7  + tmp;
      tmp             += p3;
      bufOffsetPtr[9]  = tmp;
      bufOffsetPtr[7]  = p13 + tmp;
      bufOffsetPtr[13] = p7 + p15;
      bufOffsetPtr[15] = p15;
      
      bufOffsetPtr[16] = 0.0;
      for (i = 0; i < 16; i++) 
      {
        bufOffsetPtr[32-i] = -bufOffsetPtr[i];
        bufOffsetPtr[63-i] = bufOffsetPtr[33+i];
      }
  }
  
  {
    sample_t* dt[16];
    for (i = 0; i < 16; i++) 
      dt[i] = &(synth_buf[( (((i << 5) + (((i+1) >> 1) << 6)) +
        synth_offset) & 0x3ff)]);
    
    for (j = 0; j < 32; j++) 
      samples[j] = 
        window[j] * dt[0][j]+
        window[j + 32] * dt[1][j]+
        window[j + 64] * dt[2][j]+
        window[j + 96] * dt[3][j]+
        window[j + 128] * dt[4][j]+
        window[j + 160] * dt[5][j]+
        window[j + 192] * dt[6][j]+
        window[j + 224] * dt[7][j]+
        window[j + 256] * dt[8][j]+
        window[j + 288] * dt[9][j]+
        window[j + 320] * dt[10][j]+
        window[j + 352] * dt[11][j]+
        window[j + 384] * dt[12][j]+
        window[j + 416] * dt[13][j]+
        window[j + 448] * dt[14][j]+
        window[j + 480] * dt[15][j];
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -