00001 #include <stdio.h>
00002 #include <math.h>
00003 #include "common.h"
00004 #include "ath.h"
00005 #include "encoder.h"
00006 #include "psycho_0.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 void psycho_0(double SMR[2][SBLIMIT], int nch, unsigned int scalar[2][3][SBLIMIT], FLOAT sfreq) {
00028 int ch, sb, gr;
00029 int minscaleindex[2][SBLIMIT];
00030 static FLOAT ath_min[SBLIMIT];
00031 int i;
00032 static int init=0;
00033
00034 if (!init) {
00035 FLOAT freqperline = sfreq/1024.0;
00036 for (sb=0;sb<SBLIMIT;sb++) {
00037 ath_min[sb] = 1000;
00038 }
00039
00040
00041 for (i=0;i<512;i++) {
00042 FLOAT thisfreq = i * freqperline;
00043 FLOAT ath_val = ATH_dB(thisfreq, 0);
00044 if (ath_val < ath_min[i>>4])
00045 ath_min[i>>4] = ath_val;
00046 }
00047 init++;
00048 }
00049
00050
00051 for (ch=0;ch<nch;ch++)
00052 for (sb=0;sb<SBLIMIT;sb++)
00053 minscaleindex[ch][sb] = scalar[ch][0][sb];
00054
00055 for (ch=0;ch<nch;ch++)
00056 for (gr=1;gr<3;gr++)
00057 for (sb=0;sb<SBLIMIT;sb++)
00058 if (minscaleindex[ch][sb] > scalar[ch][gr][sb])
00059 minscaleindex[ch][sb] = scalar[ch][gr][sb];
00060
00061
00062
00063
00064
00065
00066 for (ch=0;ch<nch;ch++)
00067 for (sb=0;sb<SBLIMIT;sb++)
00068 SMR[ch][sb] = 2.0 * (30.0 - minscaleindex[ch][sb]) - ath_min[sb];
00069 }