psych.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/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: psych.h,v 1.5 2001/06/04 23:02:24 wmay Exp $
  19.  */
  20. #ifndef PSYCH_H
  21. #define PSYCH_H
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif /* __cplusplus */
  25. #include "coder.h"
  26. #include "channels.h"
  27. #define NPART_LONG  72
  28. #define NPART_SHORT 48
  29. #define MAX_NPART   NPART_LONG
  30. typedef struct {
  31. int sampling_rate;
  32. int len;
  33. unsigned char width[MAX_NPART];
  34. } PsyPartTable;
  35. static PsyPartTable psyPartTableLong[12+1];
  36. static PsyPartTable psyPartTableShort[12+1];
  37. typedef struct {
  38. int size;
  39. int sizeS;
  40. /* Previous input samples */
  41. double *prevSamples;
  42. double *prevSamplesS;
  43. /* FFT data */
  44. /* Magnitude */
  45. double *energy;
  46. double *energyS[8];
  47. double *energyMS;
  48. double *energySMS[8];
  49. double *transBuff;
  50. double *transBuffS[8];
  51. /* Tonality */
  52. double *tonality;
  53. double lastPe;
  54. double lastEnr;
  55. int threeInARow;
  56. int block_type;
  57. /* Final threshold values */
  58. double pe;
  59. double *nb;
  60. double *nbS[8];
  61. double *maskThr;
  62. double *maskEn;
  63. double *maskThrS[8];
  64. double *maskEnS[8];
  65. double *maskThrNext;
  66. double *maskEnNext;
  67. double *maskThrNextS[8];
  68. double *maskEnNextS[8];
  69. double *lastNb;
  70. double *lastNbMS;
  71. double *maskThrMS;
  72. double *maskEnMS;
  73. double *maskThrSMS[8];
  74. double *maskEnSMS[8];
  75. double *maskThrNextMS;
  76. double *maskEnNextMS;
  77. double *maskThrNextSMS[8];
  78. double *maskEnNextSMS[8];
  79. } PsyInfo;
  80. typedef struct {
  81. double sampleRate;
  82. /* Hann window */
  83. double *window;
  84. double *windowS;
  85. /* Stereo demasking thresholds */
  86. double *mld;
  87. double *mldS;
  88. PsyPartTable *psyPart;
  89. PsyPartTable *psyPartS;
  90. /* Spreading functions */
  91. double spreading[NPART_LONG][NPART_LONG];
  92. double spreadingS[NPART_SHORT][NPART_SHORT];
  93. int sprInd[NPART_LONG][2];
  94. int sprIndS[NPART_SHORT][2];
  95. /* Absolute threshold of hearing */
  96. double *ath;
  97. double *athS;
  98. } GlobalPsyInfo;
  99. void PsyInit(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, unsigned int numChannels,
  100.  unsigned int sampleRate, unsigned int sampleRateIdx);
  101. void PsyEnd(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, unsigned int numChannels);
  102. void PsyCalculate(ChannelInfo *channelInfo, GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo,
  103.   int *cb_width_long, int num_cb_long, int *cb_width_short,
  104.   int num_cb_short, unsigned int numChannels);
  105. void PsyBufferUpdate(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, double *newSamples);
  106. void PsyBufferUpdateMS(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfoL, PsyInfo *psyInfoR);
  107. void BlockSwitch(CoderInfo *coderInfo, PsyInfo *psyInfo, unsigned int numChannels);
  108. static void Hann(GlobalPsyInfo *gpsyInfo, double *inSamples, int N);
  109. __inline double mask_add(double m1, double m2, int k, int b, double *ath);
  110. static void PsyThreshold(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, int *cb_width_long,
  111.  int num_cb_long, int *cb_width_short, int num_cb_short);
  112. static void PsyThresholdMS(ChannelInfo *channelInfoL, GlobalPsyInfo *gpsyInfo,
  113.    PsyInfo *psyInfoL, PsyInfo *psyInfoR, int *cb_width_long,
  114.    int num_cb_long, int *cb_width_short, int num_cb_short);
  115. static double freq2bark(double freq);
  116. static double ATHformula(double f);
  117. #ifdef __cplusplus
  118. }
  119. #endif /* __cplusplus */
  120. #endif /* PSYCH_H */