tns.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:18k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FAAC - Freeware Advanced Audio Coder
  3.  * Copyright (C) 2001 Menno Bakker
  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.1 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.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  * $Id: tns.c,v 1.5 2001/06/04 23:02:24 wmay Exp $
  19.  */
  20. #include <math.h>
  21. #include "frame.h"
  22. #include "coder.h"
  23. #include "bitstream.h"
  24. #include "tns.h"
  25. #include "util.h"
  26. /***********************************************/
  27. /* TNS Profile/Frequency Dependent Parameters  */
  28. /***********************************************/
  29. static unsigned long tnsSupportedSamplingRates[13] =
  30. { 96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,0 };
  31. /* Limit bands to > 2.0 kHz */
  32. static unsigned short tnsMinBandNumberLong[12] =
  33. { 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 };
  34. static unsigned short tnsMinBandNumberShort[12] = 
  35. { 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 };
  36.        
  37. /**************************************/
  38. /* Main/Low Profile TNS Parameters    */
  39. /**************************************/
  40. static unsigned short tnsMaxBandsLongMainLow[12] = 
  41. { 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 };
  42. static unsigned short tnsMaxBandsShortMainLow[12] = 
  43. { 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 };
  44. static unsigned short tnsMaxOrderLongMain = 20;
  45. static unsigned short tnsMaxOrderLongLow = 12;
  46. static unsigned short tnsMaxOrderShortMainLow = 7;
  47. /*****************************************************/
  48. /* InitTns:                                          */
  49. /*****************************************************/
  50. void TnsInit(faacEncHandle hEncoder)
  51. {
  52. unsigned int channel;
  53. int fsIndex = hEncoder->sampleRateIdx;
  54. int profile = hEncoder->config.aacObjectType;
  55. for (channel = 0; channel < hEncoder->numChannels; channel++) {
  56. TnsInfo *tnsInfo = &hEncoder->coderInfo[channel].tnsInfo;
  57. switch( profile ) {
  58. case MAIN:
  59. case LTP:
  60. tnsInfo->tnsMaxBandsLong = tnsMaxBandsLongMainLow[fsIndex];
  61. tnsInfo->tnsMaxBandsShort = tnsMaxBandsShortMainLow[fsIndex];
  62. if (hEncoder->config.mpegVersion == 1) { /* MPEG2 */
  63. tnsInfo->tnsMaxOrderLong = tnsMaxOrderLongMain;
  64. } else { /* MPEG4 */
  65. if (fsIndex <= 5) /* fs > 32000Hz */
  66. tnsInfo->tnsMaxOrderLong = 12;
  67. else
  68. tnsInfo->tnsMaxOrderLong = 20;
  69. }
  70. tnsInfo->tnsMaxOrderShort = tnsMaxOrderShortMainLow;
  71. break;
  72. case LOW :
  73. tnsInfo->tnsMaxBandsLong = tnsMaxBandsLongMainLow[fsIndex];
  74. tnsInfo->tnsMaxBandsShort = tnsMaxBandsShortMainLow[fsIndex];
  75. if (hEncoder->config.mpegVersion == 1) { /* MPEG2 */
  76. tnsInfo->tnsMaxOrderLong = tnsMaxOrderLongLow;
  77. } else { /* MPEG4 */
  78. if (fsIndex <= 5) /* fs > 32000Hz */
  79. tnsInfo->tnsMaxOrderLong = 12;
  80. else
  81. tnsInfo->tnsMaxOrderLong = 20;
  82. }
  83. tnsInfo->tnsMaxOrderShort = tnsMaxOrderShortMainLow;
  84. break;
  85. }
  86. tnsInfo->tnsMinBandNumberLong = tnsMinBandNumberLong[fsIndex];
  87. tnsInfo->tnsMinBandNumberShort = tnsMinBandNumberShort[fsIndex];
  88. }
  89. }
  90. /*****************************************************/
  91. /* TnsEncode:                                        */
  92. /*****************************************************/
  93. void TnsEncode(TnsInfo* tnsInfo,       /* TNS info */
  94.    int numberOfBands,       /* Number of bands per window */
  95.    int maxSfb,              /* max_sfb */
  96.    enum WINDOW_TYPE blockType,   /* block type */
  97.    int* sfbOffsetTable,     /* Scalefactor band offset table */
  98.    double* spec)            /* Spectral data array */
  99. {
  100. int numberOfWindows,windowSize;
  101. int startBand,stopBand,order;    /* Bands over which to apply TNS */
  102. int lengthInBands;               /* Length to filter, in bands */
  103. int w;
  104. int startIndex,length;
  105. double gain;
  106. switch( blockType ) {
  107. case ONLY_SHORT_WINDOW :
  108. /* TNS not used for short blocks currently */
  109. tnsInfo->tnsDataPresent = 0;
  110. return;
  111. numberOfWindows = MAX_SHORT_WINDOWS;
  112. windowSize = BLOCK_LEN_SHORT;
  113. startBand = tnsInfo->tnsMinBandNumberShort;
  114. stopBand = numberOfBands; 
  115. lengthInBands = stopBand-startBand;
  116. order = tnsInfo->tnsMaxOrderShort;
  117. startBand = min(startBand,tnsInfo->tnsMaxBandsShort);
  118. stopBand = min(stopBand,tnsInfo->tnsMaxBandsShort);
  119. break;
  120. default: 
  121. numberOfWindows = 1;
  122. windowSize = BLOCK_LEN_SHORT;
  123. startBand = tnsInfo->tnsMinBandNumberLong;
  124. stopBand = numberOfBands;
  125. lengthInBands = stopBand - startBand;
  126. order = tnsInfo->tnsMaxOrderLong;
  127. startBand = min(startBand,tnsInfo->tnsMaxBandsLong);
  128. stopBand = min(stopBand,tnsInfo->tnsMaxBandsLong);
  129. break;
  130. }
  131. /* Make sure that start and stop bands < maxSfb */
  132. /* Make sure that start and stop bands >= 0 */
  133. startBand = min(startBand,maxSfb);
  134. stopBand = min(stopBand,maxSfb);
  135. startBand = max(startBand,0);
  136. stopBand = max(stopBand,0);
  137. tnsInfo->tnsDataPresent = 0;     /* default TNS not used */
  138. /* Perform analysis and filtering for each window */
  139. for (w=0;w<numberOfWindows;w++) {
  140. TnsWindowData* windowData = &tnsInfo->windowData[w];
  141. TnsFilterData* tnsFilter = windowData->tnsFilter;
  142. double* k = tnsFilter->kCoeffs;    /* reflection coeffs */
  143. double* a = tnsFilter->aCoeffs;    /* prediction coeffs */
  144. windowData->numFilters=0;
  145. windowData->coefResolution = DEF_TNS_COEFF_RES;
  146. startIndex = w * windowSize + sfbOffsetTable[startBand];
  147. length = sfbOffsetTable[stopBand] - sfbOffsetTable[startBand];
  148. gain = LevinsonDurbin(order,length,&spec[startIndex],k);
  149. if (gain>DEF_TNS_GAIN_THRESH) {  /* Use TNS */
  150. int truncatedOrder;
  151. windowData->numFilters++;
  152. tnsInfo->tnsDataPresent=1;
  153. tnsFilter->direction = 0;
  154. tnsFilter->coefCompress = 0;
  155. tnsFilter->length = lengthInBands;
  156. QuantizeReflectionCoeffs(order,DEF_TNS_COEFF_RES,k,tnsFilter->index);
  157. truncatedOrder = TruncateCoeffs(order,DEF_TNS_COEFF_THRESH,k);
  158. tnsFilter->order = truncatedOrder;
  159. StepUp(truncatedOrder,k,a);    /* Compute predictor coefficients */
  160. TnsInvFilter(length,&spec[startIndex],tnsFilter);      /* Filter */      
  161. }
  162. }
  163. }
  164. /*****************************************************/
  165. /* TnsEncodeFilterOnly:                              */
  166. /* This is a stripped-down version of TnsEncode()    */
  167. /* which performs TNS analysis filtering only        */
  168. /*****************************************************/
  169. void TnsEncodeFilterOnly(TnsInfo* tnsInfo,           /* TNS info */
  170.  int numberOfBands,          /* Number of bands per window */
  171.  int maxSfb,                 /* max_sfb */
  172.  enum WINDOW_TYPE blockType, /* block type */
  173.  int* sfbOffsetTable,        /* Scalefactor band offset table */
  174.  double* spec)               /* Spectral data array */
  175. {
  176. int numberOfWindows,windowSize;
  177. int startBand,stopBand;    /* Bands over which to apply TNS */
  178. int w;
  179. int startIndex,length;
  180. switch( blockType ) {
  181.     case ONLY_SHORT_WINDOW :
  182. numberOfWindows = MAX_SHORT_WINDOWS;
  183. windowSize = BLOCK_LEN_SHORT;
  184. startBand = tnsInfo->tnsMinBandNumberShort;
  185. stopBand = numberOfBands; 
  186. startBand = min(startBand,tnsInfo->tnsMaxBandsShort);
  187. stopBand = min(stopBand,tnsInfo->tnsMaxBandsShort);
  188. break;
  189.     default: 
  190. numberOfWindows = 1;
  191. windowSize = BLOCK_LEN_LONG;
  192. startBand = tnsInfo->tnsMinBandNumberLong;
  193. stopBand = numberOfBands;
  194. startBand = min(startBand,tnsInfo->tnsMaxBandsLong);
  195. stopBand = min(stopBand,tnsInfo->tnsMaxBandsLong);
  196. break;
  197. }
  198. /* Make sure that start and stop bands < maxSfb */
  199. /* Make sure that start and stop bands >= 0 */
  200. startBand = min(startBand,maxSfb);
  201. stopBand = min(stopBand,maxSfb);
  202. startBand = max(startBand,0);
  203. stopBand = max(stopBand,0);
  204. /* Perform filtering for each window */
  205. for(w=0;w<numberOfWindows;w++) 
  206. {
  207. TnsWindowData* windowData = &tnsInfo->windowData[w];
  208. TnsFilterData* tnsFilter = windowData->tnsFilter;
  209. startIndex = w * windowSize + sfbOffsetTable[startBand];
  210. length = sfbOffsetTable[stopBand] - sfbOffsetTable[startBand];
  211. if (tnsInfo->tnsDataPresent  &&  windowData->numFilters) {  /* Use TNS */
  212. TnsInvFilter(length,&spec[startIndex],tnsFilter);   
  213. }
  214. }
  215. }
  216. /*****************************************************/
  217. /* TnsDecodeFilterOnly:                              */
  218. /* This is a stripped-down version of TnsEncode()    */
  219. /* which performs TNS synthesis filtering only       */
  220. /*****************************************************/
  221. void TnsDecodeFilterOnly(TnsInfo* tnsInfo,           /* TNS info */
  222.  int numberOfBands,          /* Number of bands per window */
  223.  int maxSfb,                 /* max_sfb */
  224.  enum WINDOW_TYPE blockType, /* block type */
  225.  int* sfbOffsetTable,        /* Scalefactor band offset table */
  226.  double* spec)               /* Spectral data array */
  227. {
  228. int numberOfWindows,windowSize;
  229. int startBand,stopBand;    /* Bands over which to apply TNS */
  230. int w;
  231. int startIndex,length;
  232. switch( blockType ) {
  233.     case ONLY_SHORT_WINDOW :
  234. numberOfWindows = MAX_SHORT_WINDOWS;
  235. windowSize = BLOCK_LEN_SHORT;
  236. startBand = tnsInfo->tnsMinBandNumberShort;
  237. stopBand = numberOfBands; 
  238. startBand = min(startBand,tnsInfo->tnsMaxBandsShort);
  239. stopBand = min(stopBand,tnsInfo->tnsMaxBandsShort);
  240. break;
  241.     default: 
  242. numberOfWindows = 1;
  243. windowSize = BLOCK_LEN_LONG;
  244. startBand = tnsInfo->tnsMinBandNumberLong;
  245. stopBand = numberOfBands;
  246. startBand = min(startBand,tnsInfo->tnsMaxBandsLong);
  247. stopBand = min(stopBand,tnsInfo->tnsMaxBandsLong);
  248. break;
  249. }
  250. /* Make sure that start and stop bands < maxSfb */
  251. /* Make sure that start and stop bands >= 0 */
  252. startBand = min(startBand,maxSfb);
  253. stopBand = min(stopBand,maxSfb);
  254. startBand = max(startBand,0);
  255. stopBand = max(stopBand,0);
  256. /* Perform filtering for each window */
  257. for(w=0;w<numberOfWindows;w++) 
  258. {
  259. TnsWindowData* windowData = &tnsInfo->windowData[w];
  260. TnsFilterData* tnsFilter = windowData->tnsFilter;
  261. startIndex = w * windowSize + sfbOffsetTable[startBand];
  262. length = sfbOffsetTable[stopBand] - sfbOffsetTable[startBand];
  263. if (tnsInfo->tnsDataPresent  &&  windowData->numFilters) {  /* Use TNS */
  264. TnsFilter(length,&spec[startIndex],tnsFilter);   
  265. }
  266. }
  267. }
  268. /*****************************************************/
  269. /* TnsFilter:                                        */
  270. /*   Filter the given spec with specified length     */
  271. /*   using the coefficients specified in filter.     */
  272. /*   Not that the order and direction are specified  */
  273. /*   withing the TNS_FILTER_DATA structure.          */
  274. /*****************************************************/
  275. static void TnsFilter(int length,double* spec,TnsFilterData* filter)
  276. {
  277. int i,j,k=0;
  278. int order=filter->order;
  279. double* a=filter->aCoeffs;
  280. /* Determine loop parameters for given direction */
  281. if (filter->direction) {
  282. /* Startup, initial state is zero */
  283. for (i=length-2;i>(length-1-order);i--) {
  284. k++;
  285. for (j=1;j<=k;j++) {
  286. spec[i]-=spec[i+j]*a[j];
  287. }
  288. }
  289. /* Now filter completely inplace */
  290. for (i=length-1-order;i>=0;i--) {
  291. for (j=1;j<=order;j++) {
  292. spec[i]-=spec[i+j]*a[j];
  293. }
  294. }
  295. } else {
  296. /* Startup, initial state is zero */
  297. for (i=1;i<order;i++) {
  298. for (j=1;j<=i;j++) {
  299. spec[i]-=spec[i-j]*a[j];
  300. }
  301. }
  302. /* Now filter completely inplace */
  303. for (i=order;i<length;i++) {
  304. for (j=1;j<=order;j++) {
  305. spec[i]-=spec[i-j]*a[j];
  306. }
  307. }
  308. }
  309. }
  310. /********************************************************/
  311. /* TnsInvFilter:                                        */
  312. /*   Inverse filter the given spec with specified       */
  313. /*   length using the coefficients specified in filter. */
  314. /*   Not that the order and direction are specified     */
  315. /*   withing the TNS_FILTER_DATA structure.             */
  316. /********************************************************/
  317. static void TnsInvFilter(int length,double* spec,TnsFilterData* filter)
  318. {
  319. int i,j,k=0;
  320. int order=filter->order;
  321. double* a=filter->aCoeffs;
  322. double* temp;
  323.     temp = (double *)AllocMemory(length * sizeof (double));
  324. /* Determine loop parameters for given direction */
  325. if (filter->direction) {
  326. /* Startup, initial state is zero */
  327. temp[length-1]=spec[length-1];
  328. for (i=length-2;i>(length-1-order);i--) {
  329. temp[i]=spec[i];
  330. k++;
  331. for (j=1;j<=k;j++) {
  332. spec[i]+=temp[i+j]*a[j];
  333. }
  334. }
  335. /* Now filter the rest */
  336. for (i=length-1-order;i>=0;i--) {
  337. temp[i]=spec[i];
  338. for (j=1;j<=order;j++) {
  339. spec[i]+=temp[i+j]*a[j];
  340. }
  341. }
  342. } else {
  343. /* Startup, initial state is zero */
  344. temp[0]=spec[0];
  345. for (i=1;i<order;i++) {
  346. temp[i]=spec[i];
  347. for (j=1;j<=i;j++) {
  348. spec[i]+=temp[i-j]*a[j];
  349. }
  350. }
  351. /* Now filter the rest */
  352. for (i=order;i<length;i++) {
  353. temp[i]=spec[i];
  354. for (j=1;j<=order;j++) {
  355. spec[i]+=temp[i-j]*a[j];
  356. }
  357. }
  358. }
  359. if (temp) FreeMemory(temp);
  360. }
  361. /*****************************************************/
  362. /* TruncateCoeffs:                                   */
  363. /*   Truncate the given reflection coeffs by zeroing */
  364. /*   coefficients in the tail with absolute value    */
  365. /*   less than the specified threshold.  Return the  */
  366. /*   truncated filter order.                         */
  367. /*****************************************************/
  368. static int TruncateCoeffs(int fOrder,double threshold,double* kArray)
  369. {
  370. int i;
  371. for (i = fOrder; i >= 0; i--) {
  372. kArray[i] = (fabs(kArray[i])>threshold) ? kArray[i] : 0.0;
  373. if (kArray[i]!=0.0) return i;
  374. }
  375. return 0;
  376. }
  377. /*****************************************************/
  378. /* QuantizeReflectionCoeffs:                         */
  379. /*   Quantize the given array of reflection coeffs   */
  380. /*   to the specified resolution in bits.            */
  381. /*****************************************************/
  382. static void QuantizeReflectionCoeffs(int fOrder,
  383.   int coeffRes,
  384.   double* kArray,
  385.   int* indexArray)
  386. {
  387. double iqfac,iqfac_m;
  388. int i;
  389. iqfac = ((1<<(coeffRes-1))-0.5)/(M_PI/2);
  390. iqfac_m = ((1<<(coeffRes-1))+0.5)/(M_PI/2);
  391. /* Quantize and inverse quantize */
  392. for (i=1;i<=fOrder;i++) {
  393. indexArray[i] = (int)(0.5+(asin(kArray[i])*((kArray[i]>=0)?iqfac:iqfac_m)));
  394. kArray[i] = sin((double)indexArray[i]/((indexArray[i]>=0)?iqfac:iqfac_m));
  395. }
  396. }
  397. /*****************************************************/
  398. /* Autocorrelation,                                  */
  399. /*   Compute the autocorrelation function            */
  400. /*   estimate for the given data.                    */
  401. /*****************************************************/
  402. static void Autocorrelation(int maxOrder,        /* Maximum autocorr order */
  403.  int dataSize,   /* Size of the data array */
  404.  double* data,   /* Data array */
  405.  double* rArray)     /* Autocorrelation array */
  406. {
  407. int order,index;
  408. for (order=0;order<=maxOrder;order++) {
  409. rArray[order]=0.0;
  410. for (index=0;index<dataSize;index++) {
  411. rArray[order]+=data[index]*data[index+order];
  412. }
  413. dataSize--;
  414. }
  415. }
  416. /*****************************************************/
  417. /* LevinsonDurbin:                                   */
  418. /*   Compute the reflection coefficients for the     */
  419. /*   given data using LevinsonDurbin recursion.      */
  420. /*   Return the prediction gain.                     */
  421. /*****************************************************/
  422. static double LevinsonDurbin(int fOrder,          /* Filter order */
  423.   int dataSize,    /* Size of the data array */
  424.   double* data,    /* Data array */
  425.   double* kArray)      /* Reflection coeff array */
  426. {
  427. int order,i;
  428. double signal;
  429. double error, kTemp; /* Prediction error */
  430. double aArray1[TNS_MAX_ORDER+1]; /* Predictor coeff array */
  431. double aArray2[TNS_MAX_ORDER+1]; /* Predictor coeff array 2 */
  432. double rArray[TNS_MAX_ORDER+1]; /* Autocorrelation coeffs */
  433. double* aPtr = aArray1; /* Ptr to aArray1 */
  434. double* aLastPtr = aArray2; /* Ptr to aArray2 */
  435. double* aTemp;
  436. /* Compute autocorrelation coefficients */
  437. Autocorrelation(fOrder,dataSize,data,rArray);
  438. signal=rArray[0]; /* signal energy */
  439. /* Set up pointers to current and last iteration */ 
  440. /* predictor coefficients.  */
  441. aPtr = aArray1;
  442. aLastPtr = aArray2;
  443. /* If there is no signal energy, return */
  444. if (!signal) {
  445. kArray[0]=1.0;
  446. for (order=1;order<=fOrder;order++) {
  447. kArray[order]=0.0;
  448. }
  449. return 0;
  450. } else {
  451. /* Set up first iteration */
  452. kArray[0]=1.0;
  453. aPtr[0]=1.0; /* Ptr to predictor coeffs, current iteration*/
  454. aLastPtr[0]=1.0; /* Ptr to predictor coeffs, last iteration */
  455. error=rArray[0];
  456. /* Now perform recursion */
  457. for (order=1;order<=fOrder;order++) {
  458. kTemp = aLastPtr[0]*rArray[order-0];
  459. for (i=1;i<order;i++) {
  460. kTemp += aLastPtr[i]*rArray[order-i];
  461. }
  462. kTemp = -kTemp/error;
  463. kArray[order]=kTemp;
  464. aPtr[order]=kTemp;
  465. for (i=1;i<order;i++) {
  466. aPtr[i] = aLastPtr[i] + kTemp*aLastPtr[order-i];
  467. }
  468. error = error * (1 - kTemp*kTemp);
  469. /* Now make current iteration the last one */
  470. aTemp=aLastPtr;
  471. aLastPtr=aPtr; /* Current becomes last */
  472. aPtr=aTemp; /* Last becomes current */
  473. }
  474. return signal/error; /* return the gain */
  475. }
  476. }
  477. /*****************************************************/
  478. /* StepUp:                                           */
  479. /*   Convert reflection coefficients into            */
  480. /*   predictor coefficients.                         */
  481. /*****************************************************/
  482. static void StepUp(int fOrder,double* kArray,double* aArray)
  483. {
  484. double aTemp[TNS_MAX_ORDER+2];
  485. int i,order;
  486. aArray[0]=1.0;
  487. aTemp[0]=1.0;
  488. for (order=1;order<=fOrder;order++) {
  489. aArray[order]=0.0;
  490. for (i=1;i<=order;i++) {
  491. aTemp[i] = aArray[i] + kArray[order]*aArray[order-i];
  492. }
  493. for (i=1;i<=order;i++) {
  494. aArray[i]=aTemp[i];
  495. }
  496. }
  497. }