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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********************************************************************
  2. MPEG-4 Audio VM
  3. This software module was originally developed by
  4. Fraunhofer Gesellschaft IIS / University of Erlangen (UER
  5. and edited by
  6. in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
  7. ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
  8. implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
  9. as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
  10. users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
  11. software module or modifications thereof for use in hardware or
  12. software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
  13. standards. Those intending to use this software module in hardware or
  14. software products are advised that this use may infringe existing
  15. patents. The original developer of this software module and his/her
  16. company, the subsequent editors and their companies, and ISO/IEC have
  17. no liability for use of this software module or modifications thereof
  18. in an implementation. Copyright is not released for non MPEG-2
  19. NBC/MPEG-4 Audio conforming products. The original developer retains
  20. full right to use the code for his/her own purpose, assign or donate
  21. the code to a third party and to inhibit third party from using the
  22. code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
  23. copyright notice must be included in all copies or derivative works.
  24. Copyright (c) 1996.
  25. -----
  26. This software module was modified by
  27. Tadashi Araki (Ricoh Company, ltd.)
  28. Tatsuya Okada (Waseda Univ.)
  29. Itaru Kaneko (Graphics Communication Laboratories)
  30. and edited by
  31. in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
  32. ISO/IEC 13818-7, 14496-1,2 and 3.
  33. Almost all part of the function EncTf_psycho_acoustic() is made by
  34. T. Araki and T. Okada and its copyright belongs to Ricoh.
  35. The function psy_get_absthr() is made by I. Kaneko
  36. and its copyright belongs to Graphics Communication Laboratories.
  37. Copyright (c) 1997.
  38. **********************************************************************/
  39. /* CREATED BY :  Bernhard Grill -- August-96  */
  40. #include <math.h>
  41. #ifdef _DEBUG
  42. #include <stdio.h>
  43. #endif
  44. #include "psych.h"
  45. #include "coder.h"
  46. #include "fft.h"
  47. #include "util.h"
  48. #define NS_INTERP(x,y,r) (pow((x),(r))*pow((y),1-(r)))
  49. #define SQRT2 1.41421356237309504880
  50. void PsyInit(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, unsigned int numChannels,
  51.  unsigned int sampleRate, unsigned int sampleRateIdx)
  52. {
  53. unsigned int channel;
  54. int i, j, b, bb, high, low, size;
  55. double tmpx,tmpy,tmp,x;
  56. double bval[MAX_NPART], SNR;
  57. gpsyInfo->ath = (double*)AllocMemory(NPART_LONG*sizeof(double));
  58. gpsyInfo->athS = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  59. gpsyInfo->mld = (double*)AllocMemory(NPART_LONG*sizeof(double));
  60. gpsyInfo->mldS = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  61. gpsyInfo->window = (double*)AllocMemory(2*BLOCK_LEN_LONG*sizeof(double));
  62. gpsyInfo->windowS = (double*)AllocMemory(2*BLOCK_LEN_SHORT*sizeof(double));
  63. for(i = 0; i < BLOCK_LEN_LONG*2; i++)
  64. gpsyInfo->window[i] = 0.42-0.5*cos(2*M_PI*(i+.5)/(BLOCK_LEN_LONG*2))+
  65. 0.08*cos(4*M_PI*(i+.5)/(BLOCK_LEN_LONG*2));
  66. for(i = 0; i < BLOCK_LEN_SHORT*2; i++)
  67. gpsyInfo->windowS[i] = 0.5 * (1-cos(2.0*M_PI*(i+0.5)/(BLOCK_LEN_SHORT*2)));
  68. gpsyInfo->sampleRate = (double)sampleRate;
  69. size = BLOCK_LEN_LONG;
  70. for (channel = 0; channel < numChannels; channel++) {
  71. psyInfo[channel].size = size;
  72. psyInfo[channel].lastPe = 0.0;
  73. psyInfo[channel].lastEnr = 0.0;
  74. psyInfo[channel].threeInARow = 0;
  75. psyInfo[channel].tonality = (double*)AllocMemory(NPART_LONG*sizeof(double));
  76. psyInfo[channel].nb = (double*)AllocMemory(NPART_LONG*sizeof(double));
  77. psyInfo[channel].maskThr = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  78. psyInfo[channel].maskEn = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  79. psyInfo[channel].maskThrNext = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  80. psyInfo[channel].maskEnNext = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  81. psyInfo[channel].maskThrMS = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  82. psyInfo[channel].maskEnMS = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  83. psyInfo[channel].maskThrNextMS = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  84. psyInfo[channel].maskEnNextMS = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  85. psyInfo[channel].prevSamples = (double*)AllocMemory(size*sizeof(double));
  86. SetMemory(psyInfo[channel].prevSamples, 0, size*sizeof(double));
  87. psyInfo[channel].lastNb = (double*)AllocMemory(NPART_LONG*sizeof(double));
  88. psyInfo[channel].lastNbMS = (double*)AllocMemory(NPART_LONG*sizeof(double));
  89. for (j = 0; j < NPART_LONG; j++) {
  90. psyInfo[channel].lastNb[j] = 2.;
  91. psyInfo[channel].lastNbMS[j] = 2.;
  92. }
  93. psyInfo[channel].energy = (double*)AllocMemory(size*sizeof(double));
  94. psyInfo[channel].energyMS = (double*)AllocMemory(size*sizeof(double));
  95. psyInfo[channel].transBuff = (double*)AllocMemory(2*size*sizeof(double));
  96. }
  97. gpsyInfo->psyPart = &psyPartTableLong[sampleRateIdx];
  98. gpsyInfo->psyPartS = &psyPartTableShort[sampleRateIdx];
  99. size = BLOCK_LEN_SHORT;
  100. for (channel = 0; channel < numChannels; channel++) {
  101. psyInfo[channel].sizeS = size;
  102. psyInfo[channel].prevSamplesS = (double*)AllocMemory(size*sizeof(double));
  103. SetMemory(psyInfo[channel].prevSamplesS, 0, size*sizeof(double));
  104. for (j = 0; j < 8; j++) {
  105. psyInfo[channel].nbS[j] = (double*)AllocMemory(NPART_SHORT*sizeof(double));
  106. psyInfo[channel].maskThrS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  107. psyInfo[channel].maskEnS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  108. psyInfo[channel].maskThrNextS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  109. psyInfo[channel].maskEnNextS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  110. psyInfo[channel].maskThrSMS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  111. psyInfo[channel].maskEnSMS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  112. psyInfo[channel].maskThrNextSMS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  113. psyInfo[channel].maskEnNextSMS[j] = (double*)AllocMemory(MAX_SCFAC_BANDS*sizeof(double));
  114. psyInfo[channel].energyS[j] = (double*)AllocMemory(size*sizeof(double));
  115. psyInfo[channel].energySMS[j] = (double*)AllocMemory(size*sizeof(double));
  116. psyInfo[channel].transBuffS[j] = (double*)AllocMemory(2*size*sizeof(double));
  117. }
  118. }
  119. size = BLOCK_LEN_LONG;
  120. high = 0;
  121. for(b = 0; b < gpsyInfo->psyPart->len; b++) {
  122. low = high;
  123. high += gpsyInfo->psyPart->width[b];
  124. bval[b] = 0.5 * (freq2bark(gpsyInfo->sampleRate*low/(2*size)) + 
  125. freq2bark(gpsyInfo->sampleRate*(high-1)/(2*size)));
  126. }
  127. for(b = 0; b < gpsyInfo->psyPart->len; b++) {
  128. for(bb = 0; bb < gpsyInfo->psyPart->len; bb++) {
  129. if (bval[b] >= bval[bb]) tmpx = (bval[b] - bval[bb])*3.0;
  130. else tmpx = (bval[b] - bval[bb])*1.5;
  131. if(tmpx >= 0.5 && tmpx <= 2.5)
  132. {
  133. tmp = tmpx - 0.5;
  134. x = 8.0 * (tmp*tmp - 2.0 * tmp);
  135. } else
  136. x = 0.0;
  137. tmpx += 0.474;
  138. tmpy = 15.811389 + 7.5*tmpx - 17.5*sqrt(1.0+tmpx*tmpx);
  139. if (tmpy < -100.0) gpsyInfo->spreading[b][bb] = 0.0;
  140. else gpsyInfo->spreading[b][bb] = exp((x + tmpy)*0.2302585093);
  141. }
  142. }
  143. for(b = 0; b < gpsyInfo->psyPart->len; b++) {
  144. for(bb = 0; bb < gpsyInfo->psyPart->len; bb++) {
  145. if (gpsyInfo->spreading[b][bb] != 0.0)
  146. break;
  147. }
  148. gpsyInfo->sprInd[b][0] = bb;
  149. for(bb = gpsyInfo->psyPart->len-1; bb > 0; bb--) {
  150. if (gpsyInfo->spreading[b][bb] != 0.0)
  151. break;
  152. }
  153. gpsyInfo->sprInd[b][1] = bb;
  154. }
  155.     for( b = 0; b < gpsyInfo->psyPart->len; b++){
  156. tmp = 0.0;
  157. for( bb = gpsyInfo->sprInd[b][0]; bb < gpsyInfo->sprInd[b][1]; bb++)
  158. tmp += gpsyInfo->spreading[b][bb];
  159. for( bb = gpsyInfo->sprInd[b][0]; bb < gpsyInfo->sprInd[b][1]; bb++)
  160. gpsyInfo->spreading[b][bb] /= tmp;
  161.     }
  162. j = 0;
  163.     for( b = 0; b < gpsyInfo->psyPart->len; b++){
  164. gpsyInfo->ath[b] = 1.e37;
  165. for (bb = 0; bb < gpsyInfo->psyPart->width[b]; bb++, j++) {
  166. double freq = gpsyInfo->sampleRate*j/(1000.0*2*size);
  167. double level;
  168. level = ATHformula(freq*1000.0) - 20.0;
  169. level = pow(10., 0.1*level);
  170. level *= gpsyInfo->psyPart->width[b];
  171. if (level < gpsyInfo->ath[b])
  172. gpsyInfo->ath[b] = level;
  173. }
  174.     }
  175. low = 0;
  176. for (b = 0; b < gpsyInfo->psyPart->len; b++) {
  177. tmp = freq2bark(gpsyInfo->sampleRate*low/(2*size));
  178. tmp = (min(tmp, 15.5)/15.5);
  179. gpsyInfo->mld[b] = pow(10.0, 1.25*(1-cos(M_PI*tmp))-2.5);
  180. low += gpsyInfo->psyPart->width[b];
  181. }
  182. size = BLOCK_LEN_SHORT;
  183. high = 0;
  184. for(b = 0; b < gpsyInfo->psyPartS->len; b++) {
  185. low = high;
  186. high += gpsyInfo->psyPartS->width[b];
  187. bval[b] = 0.5 * (freq2bark(gpsyInfo->sampleRate*low/(2*size)) + 
  188. freq2bark(gpsyInfo->sampleRate*(high-1)/(2*size)));
  189. }
  190. for(b = 0; b < gpsyInfo->psyPartS->len; b++) {
  191. for(bb = 0; bb < gpsyInfo->psyPartS->len; bb++) {
  192. if (bval[b] >= bval[bb]) tmpx = (bval[b] - bval[bb])*3.0;
  193. else tmpx = (bval[b] - bval[bb])*1.5;
  194. if(tmpx >= 0.5 && tmpx <= 2.5)
  195. {
  196. tmp = tmpx - 0.5;
  197. x = 8.0 * (tmp*tmp - 2.0 * tmp);
  198. } else
  199. x = 0.0;
  200. tmpx += 0.474;
  201. tmpy = 15.811389 + 7.5*tmpx - 17.5*sqrt(1.0+tmpx*tmpx);
  202. if (tmpy < -100.0) gpsyInfo->spreadingS[b][bb] = 0.0;
  203. else gpsyInfo->spreadingS[b][bb] = exp((x + tmpy)*0.2302585093);
  204. }
  205. }
  206. for(b = 0; b < gpsyInfo->psyPartS->len; b++) {
  207. for(bb = 0; bb < gpsyInfo->psyPartS->len; bb++) {
  208. if (gpsyInfo->spreadingS[b][bb] != 0.0)
  209. break;
  210. }
  211. gpsyInfo->sprIndS[b][0] = bb;
  212. for(bb = gpsyInfo->psyPartS->len-1; bb > 0; bb--) {
  213. if (gpsyInfo->spreadingS[b][bb] != 0.0)
  214. break;
  215. }
  216. gpsyInfo->sprIndS[b][1] = bb;
  217. }
  218. j = 0;
  219.     for( b = 0; b < gpsyInfo->psyPartS->len; b++){
  220. gpsyInfo->athS[b] = 1.e37;
  221. for (bb = 0; bb < gpsyInfo->psyPartS->width[b]; bb++, j++) {
  222. double freq = gpsyInfo->sampleRate*j/(1000.0*2*size);
  223. double level;
  224. level = ATHformula(freq*1000.0) - 20.0;
  225. level = pow(10., 0.1*level);
  226. level *= gpsyInfo->psyPartS->width[b];
  227. if (level < gpsyInfo->athS[b])
  228. gpsyInfo->athS[b] = level;
  229. }
  230.     }
  231.     for( b = 0; b < gpsyInfo->psyPartS->len; b++){
  232. tmp = 0.0;
  233. for( bb = gpsyInfo->sprIndS[b][0]; bb < gpsyInfo->sprIndS[b][1]; bb++)
  234. tmp += gpsyInfo->spreadingS[b][bb];
  235. /* SNR formula */
  236. if (bval[b] < 13) SNR = -8.25;
  237. else SNR = -4.5 * (bval[b]-13)/(24.0-13.0) +
  238. -8.25*(bval[b]-24)/(13.0-24.0);
  239. SNR = pow(10.0, SNR/10.0);
  240. for( bb = gpsyInfo->sprIndS[b][0]; bb < gpsyInfo->sprIndS[b][1]; bb++)
  241. gpsyInfo->spreadingS[b][bb] *= SNR / tmp;
  242.     }
  243. low = 0;
  244. for (b = 0; b < gpsyInfo->psyPartS->len; b++) {
  245. tmp = freq2bark(gpsyInfo->sampleRate*low/(2*size));
  246. tmp = (min(tmp, 15.5)/15.5);
  247. gpsyInfo->mldS[b] = pow(10.0, 1.25*(1-cos(M_PI*tmp))-2.5);
  248. low += gpsyInfo->psyPartS->width[b];
  249. }
  250. }
  251. void PsyEnd(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, unsigned int numChannels)
  252. {
  253. unsigned int channel;
  254. int j;
  255. if (gpsyInfo->ath) FreeMemory(gpsyInfo->ath);
  256. if (gpsyInfo->athS) FreeMemory(gpsyInfo->athS);
  257. if (gpsyInfo->mld) FreeMemory(gpsyInfo->mld);
  258. if (gpsyInfo->mldS) FreeMemory(gpsyInfo->mldS);
  259. if (gpsyInfo->window) FreeMemory(gpsyInfo->window);
  260. if (gpsyInfo->windowS) FreeMemory(gpsyInfo->windowS);
  261. for (channel = 0; channel < numChannels; channel++) {
  262. if (psyInfo[channel].nb) FreeMemory(psyInfo[channel].nb);
  263. if (psyInfo[channel].tonality) FreeMemory(psyInfo[channel].tonality);
  264. if (psyInfo[channel].prevSamples) FreeMemory(psyInfo[channel].prevSamples);
  265. if (psyInfo[channel].maskThr) FreeMemory(psyInfo[channel].maskThr);
  266. if (psyInfo[channel].maskEn) FreeMemory(psyInfo[channel].maskEn);
  267. if (psyInfo[channel].maskThrNext) FreeMemory(psyInfo[channel].maskThrNext);
  268. if (psyInfo[channel].maskEnNext) FreeMemory(psyInfo[channel].maskEnNext);
  269. if (psyInfo[channel].maskThrMS) FreeMemory(psyInfo[channel].maskThrMS);
  270. if (psyInfo[channel].maskEnMS) FreeMemory(psyInfo[channel].maskEnMS);
  271. if (psyInfo[channel].maskThrNextMS) FreeMemory(psyInfo[channel].maskThrNextMS);
  272. if (psyInfo[channel].maskEnNextMS) FreeMemory(psyInfo[channel].maskEnNextMS);
  273. if (psyInfo[channel].lastNb) FreeMemory(psyInfo[channel].lastNb);
  274. if (psyInfo[channel].lastNbMS) FreeMemory(psyInfo[channel].lastNbMS);
  275. if (psyInfo[channel].energy) FreeMemory(psyInfo[channel].energy);
  276. if (psyInfo[channel].energyMS) FreeMemory(psyInfo[channel].energyMS);
  277. if (psyInfo[channel].transBuff) FreeMemory(psyInfo[channel].transBuff);
  278. }
  279. for (channel = 0; channel < numChannels; channel++) {
  280. if(psyInfo[channel].prevSamplesS) FreeMemory(psyInfo[channel].prevSamplesS);
  281. for (j = 0; j < 8; j++) {
  282. if (psyInfo[channel].nbS[j]) FreeMemory(psyInfo[channel].nbS[j]);
  283. if (psyInfo[channel].maskThrS[j]) FreeMemory(psyInfo[channel].maskThrS[j]);
  284. if (psyInfo[channel].maskEnS[j]) FreeMemory(psyInfo[channel].maskEnS[j]);
  285. if (psyInfo[channel].maskThrNextS[j]) FreeMemory(psyInfo[channel].maskThrNextS[j]);
  286. if (psyInfo[channel].maskEnNextS[j]) FreeMemory(psyInfo[channel].maskEnNextS[j]);
  287. if (psyInfo[channel].maskThrSMS[j]) FreeMemory(psyInfo[channel].maskThrSMS[j]);
  288. if (psyInfo[channel].maskEnSMS[j]) FreeMemory(psyInfo[channel].maskEnSMS[j]);
  289. if (psyInfo[channel].maskThrNextSMS[j]) FreeMemory(psyInfo[channel].maskThrNextSMS[j]);
  290. if (psyInfo[channel].maskEnNextSMS[j]) FreeMemory(psyInfo[channel].maskEnNextSMS[j]);
  291. if (psyInfo[channel].energyS[j]) FreeMemory(psyInfo[channel].energyS[j]);
  292. if (psyInfo[channel].energySMS[j]) FreeMemory(psyInfo[channel].energySMS[j]);
  293. if (psyInfo[channel].transBuffS[j]) FreeMemory(psyInfo[channel].transBuffS[j]);
  294. }
  295. }
  296. }
  297. /* Do psychoacoustical analysis */
  298. void PsyCalculate(ChannelInfo *channelInfo, GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo,
  299.   int *cb_width_long, int num_cb_long, int *cb_width_short,
  300.   int num_cb_short, unsigned int numChannels)
  301. {
  302. unsigned int channel;
  303. for (channel = 0; channel < numChannels; channel++) {
  304. if (channelInfo[channel].present) {
  305. if (channelInfo[channel].cpe &&
  306. channelInfo[channel].ch_is_left) { /* CPE */
  307. int leftChan = channel;
  308. int rightChan = channelInfo[channel].paired_ch;
  309. PsyBufferUpdateMS(gpsyInfo, &psyInfo[leftChan], &psyInfo[rightChan]);
  310. /* Calculate the threshold */
  311. PsyThreshold(gpsyInfo, &psyInfo[leftChan], cb_width_long, num_cb_long,
  312. cb_width_short, num_cb_short);
  313. PsyThreshold(gpsyInfo, &psyInfo[rightChan], cb_width_long, num_cb_long,
  314. cb_width_short, num_cb_short);
  315. /* And for MS */
  316. PsyThresholdMS(&channelInfo[leftChan], gpsyInfo, &psyInfo[leftChan],
  317. &psyInfo[rightChan], cb_width_long, num_cb_long, cb_width_short,
  318. num_cb_short);
  319. } else if (!channelInfo[channel].cpe &&
  320. channelInfo[channel].lfe) { /* LFE */
  321. /* NOT FINISHED */
  322. } else if (!channelInfo[channel].cpe) { /* SCE */
  323. /* Calculate the threshold */
  324. PsyThreshold(gpsyInfo, &psyInfo[channel], cb_width_long, num_cb_long,
  325. cb_width_short, num_cb_short);
  326. }
  327. }
  328. }
  329. }
  330. static void Hann(GlobalPsyInfo *gpsyInfo, double *inSamples, int size)
  331. {
  332. int i;
  333. /* Applying Hann window */
  334. if (size == BLOCK_LEN_LONG*2) {
  335. for(i = 0; i < size; i++)
  336. inSamples[i] *= gpsyInfo->window[i];
  337. } else {
  338. for(i = 0; i < size; i++)
  339. inSamples[i] *= gpsyInfo->windowS[i];
  340. }
  341. }
  342. void PsyBufferUpdate(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, double *newSamples)
  343. {
  344. int i, j;
  345. double a, b;
  346. double temp[2048];
  347. memcpy(psyInfo->transBuff, psyInfo->prevSamples, psyInfo->size*sizeof(double));
  348. memcpy(psyInfo->transBuff + psyInfo->size, newSamples, psyInfo->size*sizeof(double));
  349. Hann(gpsyInfo, psyInfo->transBuff, 2*psyInfo->size);
  350. rsfft(psyInfo->transBuff, 11);
  351. /* Calculate magnitude of new data */
  352. for (i = 0; i < psyInfo->size; i++) {
  353. a = psyInfo->transBuff[i];
  354. b = psyInfo->transBuff[i+psyInfo->size];
  355. psyInfo->energy[i] = 0.5 * (a*a + b*b);
  356. }
  357. memcpy(temp, psyInfo->prevSamples, psyInfo->size*sizeof(double));
  358. memcpy(temp + psyInfo->size, newSamples, psyInfo->size*sizeof(double));
  359. for (j = 0; j < 8; j++) {
  360. memcpy(psyInfo->transBuffS[j], temp+(j*128)+(1024-128), 2*psyInfo->sizeS*sizeof(double));
  361. Hann(gpsyInfo, psyInfo->transBuffS[j], 2*psyInfo->sizeS);
  362. rsfft(psyInfo->transBuffS[j], 8);
  363. /* Calculate magnitude of new data */
  364. for(i = 0; i < psyInfo->sizeS; i++){
  365. a = psyInfo->transBuffS[j][i];
  366. b = psyInfo->transBuffS[j][i+psyInfo->sizeS];
  367. psyInfo->energyS[j][i] = 0.5 * (a*a + b*b);
  368. }
  369. }
  370. memcpy(psyInfo->prevSamples, newSamples, psyInfo->size*sizeof(double));
  371. }
  372. void PsyBufferUpdateMS(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfoL, PsyInfo *psyInfoR)
  373. {
  374. int i, j;
  375. double a, b;
  376. double dataL[2048], dataR[2048];
  377. for (i = 0; i < psyInfoL->size*2; i++) {
  378. a = psyInfoL->transBuff[i];
  379. b = psyInfoR->transBuff[i];
  380. dataL[i] = (a+b)*SQRT2*0.5;
  381. dataR[i] = (a-b)*SQRT2*0.5;
  382. }
  383. /* Calculate magnitude of new data */
  384. for (i = 0; i < psyInfoL->size; i++) {
  385. a = dataL[i];
  386. b = dataL[i+psyInfoL->size];
  387. psyInfoL->energyMS[i] = 0.5 * (a*a + b*b);
  388. a = dataR[i];
  389. b = dataR[i+psyInfoL->size];
  390. psyInfoR->energyMS[i] = 0.5 * (a*a + b*b);
  391. }
  392. for (j = 0; j < 8; j++) {
  393. for (i = 0; i < psyInfoL->sizeS*2; i++) {
  394. a = psyInfoL->transBuffS[j][i];
  395. b = psyInfoR->transBuffS[j][i];
  396. dataL[i] = (a+b)*SQRT2*0.5;
  397. dataR[i] = (a-b)*SQRT2*0.5;
  398. }
  399. /* Calculate magnitude of new data */
  400. for (i = 0; i < psyInfoL->sizeS; i++) {
  401. a = dataL[i];
  402. b = dataL[i+psyInfoL->sizeS];
  403. psyInfoL->energySMS[j][i] = 0.5 * (a*a + b*b);
  404. a = dataR[i];
  405. b = dataR[i+psyInfoL->sizeS];
  406. psyInfoR->energySMS[j][i] = 0.5 * (a*a + b*b);
  407. }
  408. }
  409. }
  410. /* addition of simultaneous masking */
  411. __inline double mask_add(double m1, double m2, int k, int b, double *ath)
  412. {
  413. static const double table1[] = {
  414. 3.3246 *3.3246 ,3.23837*3.23837,3.15437*3.15437,3.00412*3.00412,2.86103*2.86103,2.65407*2.65407,2.46209*2.46209,2.284  *2.284  ,
  415. 2.11879*2.11879,1.96552*1.96552,1.82335*1.82335,1.69146*1.69146,1.56911*1.56911,1.46658*1.46658,1.37074*1.37074,1.31036*1.31036,
  416. 1.25264*1.25264,1.20648*1.20648,1.16203*1.16203,1.12765*1.12765,1.09428*1.09428,1.0659 *1.0659 ,1.03826*1.03826,1.01895*1.01895,
  417. 1
  418. };
  419. static const double table2[] = {
  420. 1.33352*1.33352,1.35879*1.35879,1.38454*1.38454,1.39497*1.39497,1.40548*1.40548,1.3537 *1.3537 ,1.30382*1.30382,1.22321*1.22321,
  421. 1.14758*1.14758
  422. };
  423. static const double table3[] = {
  424. 2.35364*2.35364,2.29259*2.29259,2.23313*2.23313,2.12675*2.12675,2.02545*2.02545,1.87894*1.87894,1.74303*1.74303,1.61695*1.61695,
  425. 1.49999*1.49999,1.39148*1.39148,1.29083*1.29083,1.19746*1.19746,1.11084*1.11084,1.03826*1.03826
  426. };
  427. int i;
  428. double m;
  429. if (m1 == 0) return m2;
  430. if (b < 0) b = -b;
  431. i = (int)(10*log10(m2 / m1)/10*16);
  432. m = 10*log10((m1+m2)/ath[k]);
  433. if (i < 0) i = -i;
  434. if (b <= 3) { /* approximately, 1 bark = 3 partitions */
  435. if (i > 8) return m1+m2;
  436. return (m1+m2)*table2[i];
  437. }
  438. if (m<15) {
  439. if (m > 0) {
  440. double f=1.0,r;
  441. if (i > 24) return m1+m2;
  442. if (i > 13) f = 1; else f = table3[i];
  443. r = (m-0)/15;
  444. return (m1+m2)*(table1[i]*r+f*(1-r));
  445. }
  446. if (i > 13) return m1+m2;
  447. return (m1+m2)*table3[i];
  448. }
  449. if (i > 24) return m1+m2;
  450. return (m1+m2)*table1[i];
  451. }
  452. static void PsyThreshold(GlobalPsyInfo *gpsyInfo, PsyInfo *psyInfo, int *cb_width_long,
  453.  int num_cb_long, int *cb_width_short, int num_cb_short)
  454. {
  455. int b, bb, w, low, high, j;
  456. double tmp, ecb;
  457. double e[MAX_NPART];
  458. double c[MAX_NPART];
  459. double maxi[MAX_NPART];
  460. double avg[MAX_NPART];
  461. double eb;
  462. double nb_tmp[1024], epart, npart;
  463. double tot, mx, estot[8];
  464. double pe = 0.0;
  465. /* Energy in each partition and weighted unpredictability */
  466. high = 0;
  467. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  468. {
  469. double m, a;
  470. low = high;
  471. high += gpsyInfo->psyPart->width[b];
  472. eb = psyInfo->energy[low];
  473. m = a = eb;
  474. for (w = low+1; w < high; w++)
  475. {
  476. double el = psyInfo->energy[w];
  477. eb += el;
  478. a += el;
  479. m = m < el ? el : m;
  480. }
  481. e[b] = eb;
  482. maxi[b] = m;
  483. avg[b] = a / gpsyInfo->psyPart->width[b];
  484. }
  485. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  486. {
  487. static double tab[20] = {
  488. 1,0.79433,0.63096,0.63096,0.63096,0.63096,0.63096,0.25119,0.11749,0.11749,
  489. 0.11749,0.11749,0.11749,0.11749,0.11749,0.11749,0.11749,0.11749,0.11749,0.11749
  490. };
  491. int c1,c2,t;
  492. double m, a, tonality;
  493. c1 = c2 = 0;
  494. m = a = 0;
  495. for(w = b-1; w <= b+1; w++)
  496. {
  497. if (w >= 0 && w < gpsyInfo->psyPart->len) {
  498. c1++;
  499. c2 += gpsyInfo->psyPart->width[w];
  500. a += avg[w];
  501. m = m < maxi[w] ? maxi[w] : m;
  502. }
  503. }
  504. a /= c1;
  505. tonality = (a == 0) ? 0 : (m / a - 1)/(c2-1);
  506. t = (int)(20*tonality);
  507. if (t > 19) t = 19;
  508. psyInfo->tonality[b] = tab[t];
  509. c[b] = e[b] * tab[t];
  510. }
  511. /* Convolve the partitioned energy and unpredictability
  512.    with the spreading function */
  513. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  514. {
  515. ecb = 0;
  516. for (bb = gpsyInfo->sprInd[b][0]; bb < gpsyInfo->sprInd[b][1]; bb++)
  517. {
  518. ecb = mask_add(ecb, gpsyInfo->spreading[b][bb] * c[bb], bb, bb-b, gpsyInfo->ath);
  519. }
  520. ecb *= 0.158489319246111;
  521. /* Actual energy threshold */
  522. psyInfo->nb[b] = NS_INTERP(min(ecb, 2*psyInfo->lastNb[b]), ecb, 1/*pcfact*/);
  523. /*
  524. psyInfo->nb[b] = max(psyInfo->nb[b], gpsyInfo->ath[b]);
  525. */
  526. psyInfo->lastNb[b] = ecb;
  527. /* Perceptual entropy */
  528. tmp = gpsyInfo->psyPart->width[b]
  529. * log((psyInfo->nb[b] + 0.0000000001)
  530. / (e[b] + 0.0000000001));
  531. tmp = min(0,tmp);
  532. pe -= tmp;
  533. }
  534. high = 0;
  535. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  536. {
  537. low = high;
  538. high += gpsyInfo->psyPart->width[b];
  539. for (w = low; w < high; w++)
  540. {
  541. nb_tmp[w] = psyInfo->nb[b] / gpsyInfo->psyPart->width[b];
  542. }
  543. }
  544. high = 0;
  545. for (b = 0; b < num_cb_long; b++)
  546. {
  547. low = high;
  548. high += cb_width_long[b];
  549. epart = psyInfo->energy[low];
  550. npart = nb_tmp[low];
  551. for (w = low+1; w < high; w++)
  552. {
  553. epart += psyInfo->energy[w];
  554. if (nb_tmp[w] < npart)
  555. npart = nb_tmp[w];
  556. }
  557. npart *= cb_width_long[b];
  558. psyInfo->maskThr[b] = psyInfo->maskThrNext[b];
  559. psyInfo->maskEn[b] = psyInfo->maskEnNext[b];
  560. tmp = npart / epart;
  561. psyInfo->maskThrNext[b] = npart;
  562. psyInfo->maskEnNext[b] = epart;
  563. }
  564. /* Short windows */
  565. for (j = 0; j < 8; j++)
  566. {
  567. /* Energy in each partition and weighted unpredictability */
  568. high = 0;
  569. for (b = 0; b < gpsyInfo->psyPartS->len; b++)
  570. {
  571. low = high;
  572. high += gpsyInfo->psyPartS->width[b];
  573. eb = psyInfo->energyS[j][low];
  574. for (w = low+1; w < high; w++)
  575. {
  576. double el = psyInfo->energyS[j][w];
  577. eb += el;
  578. }
  579. e[b] = eb;
  580. }
  581. estot[j] = 0.0;
  582. /* Convolve the partitioned energy and unpredictability
  583. with the spreading function */
  584. for (b = 0; b < gpsyInfo->psyPartS->len; b++)
  585. {
  586. ecb = 0;
  587. for (bb = gpsyInfo->sprIndS[b][0]; bb <= gpsyInfo->sprIndS[b][1]; bb++)
  588. {
  589. ecb += gpsyInfo->spreadingS[b][bb] * e[bb];
  590. }
  591. /* Actual energy threshold */
  592. psyInfo->nbS[j][b] = max(1e-6, ecb);
  593. /*
  594. psyInfo->nbS[j][b] = max(psyInfo->nbS[j][b], gpsyInfo->athS[b]);
  595. */
  596. estot[j] += e[b];
  597. }
  598. if (estot[j] != 0.0)
  599. estot[j] /= gpsyInfo->psyPartS->len;
  600. high = 0;
  601. for (b = 0; b < gpsyInfo->psyPartS->len; b++)
  602. {
  603. low = high;
  604. high += gpsyInfo->psyPartS->width[b];
  605. for (w = low; w < high; w++)
  606. {
  607. nb_tmp[w] = psyInfo->nbS[j][b] / gpsyInfo->psyPartS->width[b];
  608. }
  609. }
  610. high = 0;
  611. for (b = 0; b < num_cb_short; b++)
  612. {
  613. low = high;
  614. high += cb_width_short[b];
  615. epart = psyInfo->energyS[j][low];
  616. npart = nb_tmp[low];
  617. for (w = low+1; w < high; w++)
  618. {
  619. epart += psyInfo->energyS[j][w];
  620. if (nb_tmp[w] < npart)
  621. npart = nb_tmp[w];
  622. }
  623. npart *= cb_width_short[b];
  624. psyInfo->maskThrS[j][b] = psyInfo->maskThrNextS[j][b];
  625. psyInfo->maskEnS[j][b] = psyInfo->maskEnNextS[j][b];
  626. psyInfo->maskThrNextS[j][b] = npart;
  627. psyInfo->maskEnNextS[j][b] = epart;
  628. }
  629. }
  630. tot = mx = estot[0];
  631. for (j = 1; j < 8; j++) {
  632. tot += estot[j];
  633. mx = max(mx, estot[j]);
  634. }
  635. #ifdef _DEBUG
  636. printf("%4f %2.2f ", pe, mx/tot);
  637. #endif
  638. tot = max(tot, 1.e-12);
  639. if (((mx/tot) > 0.35) && (pe > 1800.0) || ((mx/tot) > 0.5) || (pe > 3000.0)) {
  640. psyInfo->block_type = ONLY_SHORT_WINDOW;
  641. psyInfo->threeInARow++;
  642. } else if ((psyInfo->lastEnr > 0.5) || (psyInfo->lastPe > 3000.0)) {
  643. psyInfo->block_type = ONLY_SHORT_WINDOW;
  644. psyInfo->threeInARow++;
  645. } else if (psyInfo->threeInARow >= 3) {
  646. psyInfo->block_type = ONLY_SHORT_WINDOW;
  647. psyInfo->threeInARow = 0;
  648. } else {
  649. psyInfo->block_type = ONLY_LONG_WINDOW;
  650. }
  651.   psyInfo->lastEnr = mx/tot;
  652. psyInfo->pe = psyInfo->lastPe;
  653. psyInfo->lastPe = pe;
  654. }
  655. static void PsyThresholdMS(ChannelInfo *channelInfoL, GlobalPsyInfo *gpsyInfo,
  656.    PsyInfo *psyInfoL, PsyInfo *psyInfoR,
  657.    int *cb_width_long, int num_cb_long, int *cb_width_short,
  658.    int num_cb_short)
  659. {
  660. int b, bb, w, low, high, j;
  661. double ecb, tmp1, tmp2;
  662. double nb_tmpM[1024];
  663. double nb_tmpS[1024];
  664. double epartM, epartS, npartM, npartS;
  665. double nbM[MAX_NPART];
  666. double nbS[MAX_NPART];
  667. double eM[MAX_NPART];
  668. double eS[MAX_NPART];
  669. double cM[MAX_NPART];
  670. double cS[MAX_NPART];
  671. double mld;
  672. #ifdef _DEBUG
  673. int ms_used = 0;
  674. int ms_usedS = 0;
  675. #endif
  676. /* Energy in each partition and weighted unpredictability */
  677. high = 0;
  678. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  679. {
  680. double mid, side, ebM, ebS;
  681. low = high;
  682. high += gpsyInfo->psyPart->width[b];
  683. mid  = psyInfoL->energyMS[low];
  684. side = psyInfoR->energyMS[low];
  685. ebM = mid;
  686. ebS = side;
  687. for (w = low+1; w < high; w++)
  688. {
  689. mid  = psyInfoL->energyMS[w];
  690. side = psyInfoR->energyMS[w];
  691. ebM += mid;
  692. ebS += side;
  693. }
  694. eM[b] = ebM;
  695. eS[b] = ebS;
  696. cM[b] = ebM * min(psyInfoL->tonality[b], psyInfoR->tonality[b]);
  697. cS[b] = ebS * min(psyInfoL->tonality[b], psyInfoR->tonality[b]);
  698. }
  699. /* Convolve the partitioned energy and unpredictability
  700.    with the spreading function */
  701. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  702. {
  703. /* Mid channel */
  704. ecb = 0;
  705. for (bb = gpsyInfo->sprInd[b][0]; bb <= gpsyInfo->sprInd[b][1]; bb++)
  706. {
  707. ecb = mask_add(ecb, gpsyInfo->spreading[bb][b] * cM[bb], bb, bb-b, gpsyInfo->ath);
  708. }
  709. ecb *= 0.158489319246111;
  710. /* Actual energy threshold */
  711. nbM[b] = NS_INTERP(min(ecb, 2*psyInfoL->lastNbMS[b]), ecb, 1/*pcfact*/);
  712. /*
  713. nbM[b] = max(nbM[b], gpsyInfo->ath[b]);
  714. */
  715. psyInfoL->lastNbMS[b] = ecb;
  716. /* Side channel */
  717. ecb = 0;
  718. for (bb = gpsyInfo->sprInd[b][0]; bb <= gpsyInfo->sprInd[b][1]; bb++)
  719. {
  720. ecb = mask_add(ecb, gpsyInfo->spreading[bb][b] * cS[bb], bb, bb-b, gpsyInfo->ath);
  721. }
  722. ecb *= 0.158489319246111;
  723. /* Actual energy threshold */
  724. nbS[b] = NS_INTERP(min(ecb, 2*psyInfoR->lastNbMS[b]), ecb, 1/*pcfact*/);
  725. /*
  726. nbS[b] = max(nbS[b], gpsyInfo->ath[b]);
  727. */
  728. psyInfoR->lastNbMS[b] = ecb;
  729. if (psyInfoL->nb[b] <= 1.58*psyInfoR->nb[b]
  730. && psyInfoR->nb[b] <= 1.58*psyInfoL->nb[b]) {
  731. mld = gpsyInfo->mld[b]*eM[b];
  732. tmp1 = max(nbM[b], min(nbS[b],mld));
  733. mld = gpsyInfo->mld[b]*eS[b];
  734. tmp2 = max(nbS[b], min(nbM[b],mld));
  735. nbM[b] = tmp1;
  736. nbS[b] = tmp2;
  737. }
  738. }
  739. high = 0;
  740. for (b = 0; b < gpsyInfo->psyPart->len; b++)
  741. {
  742. low = high;
  743. high += gpsyInfo->psyPart->width[b];
  744. for (w = low; w < high; w++)
  745. {
  746. nb_tmpM[w] = nbM[b] / gpsyInfo->psyPart->width[b];
  747. nb_tmpS[w] = nbS[b] / gpsyInfo->psyPart->width[b];
  748. }
  749. }
  750. high = 0;
  751. for (b = 0; b < num_cb_long; b++)
  752. {
  753. low = high;
  754. high += cb_width_long[b];
  755. epartM = psyInfoL->energyMS[low];
  756. npartM = nb_tmpM[low];
  757. epartS = psyInfoR->energyMS[low];
  758. npartS = nb_tmpS[low];
  759. for (w = low+1; w < high; w++)
  760. {
  761. epartM += psyInfoL->energyMS[w];
  762. epartS += psyInfoR->energyMS[w];
  763. if (nb_tmpM[w] < npartM)
  764. npartM = nb_tmpM[w];
  765. if (nb_tmpS[w] < npartS)
  766. npartS = nb_tmpS[w];
  767. }
  768. npartM *= cb_width_long[b];
  769. npartS *= cb_width_long[b];
  770. psyInfoL->maskThrMS[b] = psyInfoL->maskThrNextMS[b];
  771. psyInfoR->maskThrMS[b] = psyInfoR->maskThrNextMS[b];
  772. psyInfoL->maskEnMS[b] = psyInfoL->maskEnNextMS[b];
  773. psyInfoR->maskEnMS[b] = psyInfoR->maskEnNextMS[b];
  774. psyInfoL->maskThrNextMS[b] = npartM;
  775. psyInfoR->maskThrNextMS[b] = npartS;
  776. psyInfoL->maskEnNextMS[b] = epartM;
  777. psyInfoR->maskEnNextMS[b] = epartS;
  778. {
  779. double thmL = psyInfoL->maskThr[b];
  780. double thmR = psyInfoR->maskThr[b];
  781. double thmM = psyInfoL->maskThrMS[b];
  782. double thmS = psyInfoR->maskThrMS[b];
  783. double msfix = 3.5;
  784. if (thmL*msfix < (thmM+thmS)/2) {
  785. double f = thmL*msfix / ((thmM+thmS)/2);
  786. thmM *= f;
  787. thmS *= f;
  788. }
  789. if (thmR*msfix < (thmM+thmS)/2) {
  790. double f = thmR*msfix / ((thmM+thmS)/2);
  791. thmM *= f;
  792. thmS *= f;
  793. }
  794. psyInfoL->maskThrMS[b] = min(thmM,psyInfoL->maskThrMS[b]);
  795. psyInfoR->maskThrMS[b] = min(thmS,psyInfoR->maskThrMS[b]);
  796. if (psyInfoL->maskThr[b] * psyInfoR->maskThr[b] < psyInfoL->maskThrMS[b] * psyInfoR->maskThrMS[b])
  797. channelInfoL->msInfo.ms_used[b] = 0;
  798. else
  799. channelInfoL->msInfo.ms_used[b] = 1;
  800. }
  801. }
  802. #ifdef _DEBUG
  803. printf("MSL:%3d ", ms_used);
  804. #endif
  805. /* Short windows */
  806. for (j = 0; j < 8; j++)
  807. {
  808. /* Energy in each partition and weighted unpredictability */
  809. high = 0;
  810. for (b = 0; b < gpsyInfo->psyPartS->len; b++)
  811. {
  812. double ebM, ebS;
  813. low = high;
  814. high += gpsyInfo->psyPartS->width[b];
  815. ebM = psyInfoL->energySMS[j][low];
  816. ebS = psyInfoR->energySMS[j][low];
  817. for (w = low+1; w < high; w++)
  818. {
  819. ebM += psyInfoL->energySMS[j][w];
  820. ebS += psyInfoR->energySMS[j][w];
  821. }
  822. eM[b] = ebM;
  823. eS[b] = ebS;
  824. }
  825. /* Convolve the partitioned energy and unpredictability
  826. with the spreading function */
  827. for (b = 0; b < gpsyInfo->psyPartS->len; b++)
  828. {
  829. /* Mid channel */
  830. /* Get power ratio */
  831. ecb = 0;
  832. for (bb = gpsyInfo->sprIndS[b][0]; bb <= gpsyInfo->sprIndS[b][1]; bb++)
  833. {
  834. ecb += gpsyInfo->spreadingS[b][bb] * eM[bb];
  835. }
  836. /* Actual energy threshold */
  837. nbM[b] = max(1e-6, ecb);
  838. /*
  839. nbM[b] = max(nbM[b], gpsyInfo->athS[b]);
  840. */
  841. /* Side channel */
  842. /* Get power ratio */
  843. ecb = 0;
  844. for (bb = gpsyInfo->sprIndS[b][0]; bb <= gpsyInfo->sprIndS[b][1]; bb++)
  845. {
  846. ecb += gpsyInfo->spreadingS[b][bb] * eS[bb];
  847. }
  848. /* Actual energy threshold */
  849. nbS[b] = max(1e-6, ecb);
  850. /*
  851. nbS[b] = max(nbS[b], gpsyInfo->athS[b]);
  852. */
  853. if (psyInfoL->nbS[j][b] <= 1.58*psyInfoR->nbS[j][b]
  854. && psyInfoR->nbS[j][b] <= 1.58*psyInfoL->nbS[j][b]) {
  855. mld = gpsyInfo->mldS[b]*eM[b];
  856. tmp1 = max(nbM[b], min(nbS[b],mld));
  857. mld = gpsyInfo->mldS[b]*eS[b];
  858. tmp2 = max(nbS[b], min(nbM[b],mld));
  859. nbM[b] = tmp1;
  860. nbS[b] = tmp2;
  861. }
  862. }
  863. high = 0;
  864. for (b = 0; b < gpsyInfo->psyPartS->len; b++)
  865. {
  866. low = high;
  867. high += gpsyInfo->psyPartS->width[b];
  868. for (w = low; w < high; w++)
  869. {
  870. nb_tmpM[w] = nbM[b] / gpsyInfo->psyPartS->width[b];
  871. nb_tmpS[w] = nbS[b] / gpsyInfo->psyPartS->width[b];
  872. }
  873. }
  874. high = 0;
  875. for (b = 0; b < num_cb_short; b++)
  876. {
  877. low = high;
  878. high += cb_width_short[b];
  879. epartM = psyInfoL->energySMS[j][low];
  880. epartS = psyInfoR->energySMS[j][low];
  881. npartM = nb_tmpM[low];
  882. npartS = nb_tmpS[low];
  883. for (w = low+1; w < high; w++)
  884. {
  885. epartM += psyInfoL->energySMS[j][w];
  886. epartS += psyInfoR->energySMS[j][w];
  887. if (nb_tmpM[w] < npartM)
  888. npartM = nb_tmpM[w];
  889. if (nb_tmpS[w] < npartS)
  890. npartS = nb_tmpS[w];
  891. }
  892. npartM *= cb_width_short[b];
  893. npartS *= cb_width_short[b];
  894. psyInfoL->maskThrSMS[j][b] = psyInfoL->maskThrNextSMS[j][b];
  895. psyInfoR->maskThrSMS[j][b] = psyInfoR->maskThrNextSMS[j][b];
  896. psyInfoL->maskEnSMS[j][b] = psyInfoL->maskEnNextSMS[j][b];
  897. psyInfoR->maskEnSMS[j][b] = psyInfoR->maskEnNextSMS[j][b];
  898. psyInfoL->maskThrNextSMS[j][b] = npartM;
  899. psyInfoR->maskThrNextSMS[j][b] = npartS;
  900. psyInfoL->maskEnNextSMS[j][b] = epartM;
  901. psyInfoR->maskEnNextSMS[j][b] = epartS;
  902. {
  903. double thmL = psyInfoL->maskThrS[j][b];
  904. double thmR = psyInfoR->maskThrS[j][b];
  905. double thmM = psyInfoL->maskThrSMS[j][b];
  906. double thmS = psyInfoR->maskThrSMS[j][b];
  907. double msfix = 3.5;
  908. if (thmL*msfix < (thmM+thmS)/2) {
  909. double f = thmL*msfix / ((thmM+thmS)/2);
  910. thmM *= f;
  911. thmS *= f;
  912. }
  913. if (thmR*msfix < (thmM+thmS)/2) {
  914. double f = thmR*msfix / ((thmM+thmS)/2);
  915. thmM *= f;
  916. thmS *= f;
  917. }
  918. psyInfoL->maskThrSMS[j][b] = min(thmM,psyInfoL->maskThrSMS[j][b]);
  919. psyInfoR->maskThrSMS[j][b] = min(thmS,psyInfoR->maskThrSMS[j][b]);
  920. if (psyInfoL->maskThrS[j][b] * psyInfoR->maskThrS[j][b] < 
  921. psyInfoL->maskThrSMS[j][b] * psyInfoR->maskThrSMS[j][b])
  922. channelInfoL->msInfo.ms_usedS[j][b] = 0;
  923. else
  924. channelInfoL->msInfo.ms_usedS[j][b] = 1;
  925. }
  926. }
  927. }
  928. #ifdef _DEBUG
  929. printf("MSS:%3d ", ms_usedS);
  930. #endif
  931. }
  932. void BlockSwitch(CoderInfo *coderInfo, PsyInfo *psyInfo, unsigned int numChannels)
  933. {
  934. unsigned int channel;
  935. int desire = ONLY_LONG_WINDOW;
  936. /* Use the same block type for all channels
  937.    If there is 1 channel that wants a short block,
  938.    use a short block on all channels.
  939. */
  940. for (channel = 0; channel < numChannels; channel++)
  941. {
  942. if (psyInfo[channel].block_type == ONLY_SHORT_WINDOW)
  943. desire = ONLY_SHORT_WINDOW;
  944. }
  945. for (channel = 0; channel < numChannels; channel++)
  946. {
  947. if ((coderInfo[channel].block_type == ONLY_SHORT_WINDOW) ||
  948. (coderInfo[channel].block_type == LONG_SHORT_WINDOW) ) {
  949. if ((coderInfo[channel].desired_block_type==ONLY_LONG_WINDOW) &&
  950. (desire == ONLY_LONG_WINDOW) ) {
  951. coderInfo[channel].block_type = SHORT_LONG_WINDOW;
  952. } else {
  953. coderInfo[channel].block_type = ONLY_SHORT_WINDOW;
  954. }
  955. } else if (desire == ONLY_SHORT_WINDOW) {
  956. coderInfo[channel].block_type = LONG_SHORT_WINDOW;
  957. } else {
  958. coderInfo[channel].block_type = ONLY_LONG_WINDOW;
  959. }
  960. coderInfo[channel].desired_block_type = desire;
  961. }
  962. #ifdef _DEBUG
  963. printf("%s ", (coderInfo[0].block_type == ONLY_SHORT_WINDOW) ? "SHORT" : "LONG ");
  964. #endif
  965. }
  966. static double freq2bark(double freq)
  967. {
  968.     double bark;
  969.     if(freq > 200.0)
  970. bark = 26.81 / (1 + (1960 / freq)) - 0.53; 
  971.     else
  972. bark = freq / 102.9;
  973.     return (bark);
  974. }
  975. static double ATHformula(double f)
  976. {
  977. double ath;
  978. f /= 1000;  /* convert to khz */
  979. f  = max(0.01, f);
  980. f  = min(18.0,f);
  981. /* from Painter & Spanias, 1997 */
  982. /* modified by Gabriel Bouvigne to better fit to the reality */
  983. ath =    3.640 * pow(f,-0.8)
  984. - 6.800 * exp(-0.6*pow(f-3.4,2.0))
  985. + 6.000 * exp(-0.15*pow(f-8.7,2.0))
  986. + 0.6* 0.001 * pow(f,4.0);
  987. return ath;
  988. }
  989. static PsyPartTable psyPartTableLong[12+1] =
  990. {
  991.   { 96000, 71,
  992.      { /* width */
  993.       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,
  994.       3,3,3,3,3,4,4,4,5,5,5,6,6,7,7,8,8,9,10,10,11,12,13,14,15,16,
  995.       18,19,21,24,26,30,34,39,45,53,64,78,98,127,113
  996.      }
  997.   },
  998.   { 88200, 72,
  999.      { /* width */
  1000.       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,
  1001.       3,3,3,3,3,4,4,4,4,5,5,5,6,6,7,7,8,8,9,10,10,11,12,13,14,15,
  1002.       16,18,19,21,23,26,29,32,37,42,49,58,69,85,106,137,35
  1003.      }
  1004.   },
  1005.   { 64000, 67,
  1006.      { /* width */
  1007.       2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,
  1008.       4,4,4,4,5,5,5,6,6,7,7,8,8,9,10,10,11,12,13,14,15,16,17,
  1009.       18,20,21,23,25,28,30,34,37,42,47,54,63,73,87,105,57
  1010.      }
  1011.   },
  1012.   { 48000, 69,
  1013.      { /* width */
  1014.       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
  1015.       3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12,
  1016.       13, 14, 15, 16, 17, 18, 20, 21, 23, 24, 26, 28, 31, 34, 37, 40, 45, 50,
  1017.       56, 63, 72, 84, 86
  1018.      }
  1019.   },
  1020.   { 44100, 70,
  1021.      { /* width */
  1022.       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 
  1023.       3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11,
  1024.       12, 13, 14, 15, 16, 17, 18, 20, 21, 23, 24, 26, 28, 30, 33, 36, 39,
  1025.       43, 47, 53, 59, 67, 76, 88, 27
  1026.      }
  1027.   },
  1028.   { 32000, 66,
  1029.      { /* width */
  1030.        3,3,3,3,3,3,3,3,3,3,3,
  1031.        3,3,3,3,3,3,3,3,4,4,4,
  1032.        4,4,4,4,5,5,5,5,6,6,6,
  1033.        7,7,8,8,9,10,10,11,12,13,14,
  1034.        15,16,17,19,20,22,23,25,27,29,31,
  1035.        33,35,38,41,45,48,53,58,64,71,62
  1036.      }
  1037.   },
  1038.   { 24000, 66,
  1039.      { /* width */
  1040.        3,3,3,3,3,3,3,3,3,3,3,
  1041.        4,4,4,4,4,4,4,4,4,4,4,
  1042.        5,5,5,5,5,6,6,6,6,7,7,
  1043.        7,8,8,9,9,10,11,12,12,13,14,
  1044.        15,17,18,19,21,22,24,26,28,30,32,
  1045.        34,37,39,42,45,49,53,57,62,67,34
  1046.      }
  1047.   },
  1048.   { 22050, 63,
  1049.      { /* width */
  1050.       4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5,
  1051.       6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
  1052.       19, 20, 22, 23, 25, 27, 29, 31, 33, 36, 38, 41, 44, 47, 51, 55, 59,
  1053.       64, 61
  1054.      }
  1055.   },
  1056.   { 16000, 60,
  1057.      { /* width */
  1058.        5,5,5,5,5,5,5,5,5,5,
  1059.        5,5,5,5,5,6,6,6,6,6,
  1060.        6,6,7,7,7,7,8,8,8,9,
  1061.        9,10,10,11,11,12,13,14,15,16,
  1062.        17,18,19,21,22,24,26,28,30,33,
  1063.        35,38,41,44,47,50,54,58,62,58
  1064.      }
  1065.   },
  1066.   { 12000, 57,
  1067.      { /* width */
  1068.        6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,
  1069.        8,8,8,8,8,9,9,9,10,10,11,11,12,12,13,13,
  1070.        14,15,16,17,18,19,20,22,23,25,27,29,31,
  1071.        34,36,39,42,45,49,53,57,61,58 
  1072.     }
  1073.   },
  1074.   { 11025, 56,
  1075.      { /* width */
  1076.        7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,
  1077.        9,9,9,9,10,10,10,11,11,12,12,13,13,14,15,16,17,18,19,20,
  1078.        21,23,24,26,28,30,33,35,38,41,44,48,51,55,59,64,9
  1079.      }
  1080.   },
  1081.   { 8000, 52,
  1082.      { /* width */
  1083.       9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11,
  1084.       12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 23, 24,
  1085.       26, 27, 29, 31, 33, 36, 38, 41, 44, 48, 52, 56, 60, 14
  1086.      }
  1087.   },
  1088.   { -1 }
  1089. };
  1090. static PsyPartTable psyPartTableShort[12+1] =
  1091. {
  1092.   { 96000, 36,
  1093.      { /* width */
  1094.       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,4,4,5,5,
  1095.       6,7,9,11,14,18,7
  1096.      }
  1097.    },
  1098.   { 88200, 37,
  1099.     { /* width */
  1100.       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,4,4,
  1101.       5,5,6,7,8,10,12,16,1
  1102.      }
  1103.   },
  1104.   { 64000, 39,
  1105.      { /* width */
  1106.       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,4,4,4,
  1107.       5,5,6,7,8,9,11,13,10
  1108.      }
  1109.   },
  1110.   { 48000, 42,
  1111.     { /* width */
  1112.       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
  1113.       2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 12, 1
  1114.      }
  1115.   },
  1116.   { 44100, 42, 
  1117.     { /* width */
  1118.       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
  1119.       2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 12
  1120.      }
  1121.   },
  1122.   { 32000, 44,
  1123.      { /* width */
  1124.        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1125.        2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,6,6,7,8,8,9,8
  1126.      }
  1127.   },
  1128.   { 24000, 46,
  1129.      { /* width */
  1130.        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1131.        2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,5,6,6,7,7,8,8,9,1
  1132.      }
  1133.   },
  1134.   { 22050, 46,
  1135.      { /* width */
  1136.       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
  1137.       2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 7
  1138.      }
  1139.   },
  1140.   { 16000, 47,
  1141.      { /* width */
  1142.        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1143.        2,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,5,6,6,7,7,8,8,7
  1144.      }
  1145.   },
  1146.   { 12000, 48,
  1147.      { /* width */
  1148.        1,1,1,1,1,1,1,1,1,1,1,1,
  1149.        1,1,1,1,1,1,1,2,2,2,2,2,
  1150.        2,2,2,2,2,2,3,3,3,3,3,4,
  1151.        4,4,5,5,5,6,6,7,7,8,8,3
  1152.      }
  1153.   },
  1154.   { 11025, 47,
  1155.      { /* width */
  1156.        1,1,1,1,1,1,1,1,1,1,
  1157.        1,1,1,1,1,1,1,1,2,2,
  1158.        2,2,2,2,2,2,2,2,2,3,
  1159.        3,3,3,3,4,4,4,4,5,5,
  1160.        5,6,6,7,7,8,8
  1161.      }
  1162.   },
  1163.   { 8000, 40,
  1164.     { /* width */
  1165.      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
  1166.      3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 3
  1167.     }
  1168.   },
  1169.   { -1 }
  1170. };