]> git.jsancho.org Git - lugaru.git/blob - libvorbis-1.0.1/lib/psy.c
Link against non-SSE2 libGLU.
[lugaru.git] / libvorbis-1.0.1 / lib / psy.c
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************
12
13  function: psychoacoustics not including preecho
14  last mod: $Id: psy.c,v 1.81 2002/10/21 07:00:11 xiphmont Exp $
15
16  ********************************************************************/
17
18 #include <stdlib.h>
19 #include <math.h>
20 #include <string.h>
21 #include "vorbis/codec.h"
22 #include "codec_internal.h"
23
24 #include "masking.h"
25 #include "psy.h"
26 #include "os.h"
27 #include "lpc.h"
28 #include "smallft.h"
29 #include "scales.h"
30 #include "misc.h"
31
32 #define NEGINF -9999.f
33 static double stereo_threshholds[]={0.0, .5, 1.0, 1.5, 2.5, 4.5, 8.5, 16.5, 9e10};
34
35 vorbis_look_psy_global *_vp_global_look(vorbis_info *vi){
36   codec_setup_info *ci=vi->codec_setup;
37   vorbis_info_psy_global *gi=&ci->psy_g_param;
38   vorbis_look_psy_global *look=_ogg_calloc(1,sizeof(*look));
39
40   look->channels=vi->channels;
41
42   look->ampmax=-9999.;
43   look->gi=gi;
44   return(look);
45 }
46
47 void _vp_global_free(vorbis_look_psy_global *look){
48   if(look){
49     memset(look,0,sizeof(*look));
50     _ogg_free(look);
51   }
52 }
53
54 void _vi_gpsy_free(vorbis_info_psy_global *i){
55   if(i){
56     memset(i,0,sizeof(*i));
57     _ogg_free(i);
58   }
59 }
60
61 void _vi_psy_free(vorbis_info_psy *i){
62   if(i){
63     memset(i,0,sizeof(*i));
64     _ogg_free(i);
65   }
66 }
67
68 static void min_curve(float *c,
69                        float *c2){
70   int i;  
71   for(i=0;i<EHMER_MAX;i++)if(c2[i]<c[i])c[i]=c2[i];
72 }
73 static void max_curve(float *c,
74                        float *c2){
75   int i;  
76   for(i=0;i<EHMER_MAX;i++)if(c2[i]>c[i])c[i]=c2[i];
77 }
78
79 static void attenuate_curve(float *c,float att){
80   int i;
81   for(i=0;i<EHMER_MAX;i++)
82     c[i]+=att;
83 }
84
85 static float ***setup_tone_curves(float curveatt_dB[P_BANDS],float binHz,int n,
86                                   float center_boost, float center_decay_rate){
87   int i,j,k,m;
88   float ath[EHMER_MAX];
89   float workc[P_BANDS][P_LEVELS][EHMER_MAX];
90   float athc[P_LEVELS][EHMER_MAX];
91   float *brute_buffer=alloca(n*sizeof(*brute_buffer));
92
93   float ***ret=_ogg_malloc(sizeof(*ret)*P_BANDS);
94
95   memset(workc,0,sizeof(workc));
96
97   for(i=0;i<P_BANDS;i++){
98     /* we add back in the ATH to avoid low level curves falling off to
99        -infinity and unnecessarily cutting off high level curves in the
100        curve limiting (last step). */
101
102     /* A half-band's settings must be valid over the whole band, and
103        it's better to mask too little than too much */  
104     int ath_offset=i*4;
105     for(j=0;j<EHMER_MAX;j++){
106       float min=999.;
107       for(k=0;k<4;k++)
108         if(j+k+ath_offset<MAX_ATH){
109           if(min>ATH[j+k+ath_offset])min=ATH[j+k+ath_offset];
110         }else{
111           if(min>ATH[MAX_ATH-1])min=ATH[MAX_ATH-1];
112         }
113       ath[j]=min;
114     }
115
116     /* copy curves into working space, replicate the 50dB curve to 30
117        and 40, replicate the 100dB curve to 110 */
118     for(j=0;j<6;j++)
119       memcpy(workc[i][j+2],tonemasks[i][j],EHMER_MAX*sizeof(*tonemasks[i][j]));
120     memcpy(workc[i][0],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0]));
121     memcpy(workc[i][1],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0]));
122     
123     /* apply centered curve boost/decay */
124     for(j=0;j<P_LEVELS;j++){
125       for(k=0;k<EHMER_MAX;k++){
126         float adj=center_boost+abs(EHMER_OFFSET-k)*center_decay_rate;
127         if(adj<0. && center_boost>0)adj=0.;
128         if(adj>0. && center_boost<0)adj=0.;
129         workc[i][j][k]+=adj;
130       }
131     }
132
133     /* normalize curves so the driving amplitude is 0dB */
134     /* make temp curves with the ATH overlayed */
135     for(j=0;j<P_LEVELS;j++){
136       attenuate_curve(workc[i][j],curveatt_dB[i]+100.-(j<2?2:j)*10.-P_LEVEL_0);
137       memcpy(athc[j],ath,EHMER_MAX*sizeof(**athc));
138       attenuate_curve(athc[j],+100.-j*10.f-P_LEVEL_0);
139       max_curve(athc[j],workc[i][j]);
140     }
141
142     /* Now limit the louder curves.
143        
144        the idea is this: We don't know what the playback attenuation
145        will be; 0dB SL moves every time the user twiddles the volume
146        knob. So that means we have to use a single 'most pessimal' curve
147        for all masking amplitudes, right?  Wrong.  The *loudest* sound
148        can be in (we assume) a range of ...+100dB] SL.  However, sounds
149        20dB down will be in a range ...+80], 40dB down is from ...+60],
150        etc... */
151     
152     for(j=1;j<P_LEVELS;j++){
153       min_curve(athc[j],athc[j-1]);
154       min_curve(workc[i][j],athc[j]);
155     }
156   }
157
158   for(i=0;i<P_BANDS;i++){
159     int hi_curve,lo_curve,bin;
160     ret[i]=_ogg_malloc(sizeof(**ret)*P_LEVELS);
161
162     /* low frequency curves are measured with greater resolution than
163        the MDCT/FFT will actually give us; we want the curve applied
164        to the tone data to be pessimistic and thus apply the minimum
165        masking possible for a given bin.  That means that a single bin
166        could span more than one octave and that the curve will be a
167        composite of multiple octaves.  It also may mean that a single
168        bin may span > an eighth of an octave and that the eighth
169        octave values may also be composited. */
170     
171     /* which octave curves will we be compositing? */
172     bin=floor(fromOC(i*.5)/binHz);
173     lo_curve=  ceil(toOC(bin*binHz+1)*2);
174     hi_curve=  floor(toOC((bin+1)*binHz)*2);
175     if(lo_curve>i)lo_curve=i;
176     if(lo_curve<0)lo_curve=0;
177     if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1;
178
179     for(m=0;m<P_LEVELS;m++){
180       ret[i][m]=_ogg_malloc(sizeof(***ret)*(EHMER_MAX+2));
181       
182       for(j=0;j<n;j++)brute_buffer[j]=999.;
183       
184       /* render the curve into bins, then pull values back into curve.
185          The point is that any inherent subsampling aliasing results in
186          a safe minimum */
187       for(k=lo_curve;k<=hi_curve;k++){
188         int l=0;
189
190         for(j=0;j<EHMER_MAX;j++){
191           int lo_bin= fromOC(j*.125+k*.5-2.0625)/binHz;
192           int hi_bin= fromOC(j*.125+k*.5-1.9375)/binHz+1;
193           
194           if(lo_bin<0)lo_bin=0;
195           if(lo_bin>n)lo_bin=n;
196           if(lo_bin<l)l=lo_bin;
197           if(hi_bin<0)hi_bin=0;
198           if(hi_bin>n)hi_bin=n;
199
200           for(;l<hi_bin && l<n;l++)
201             if(brute_buffer[l]>workc[k][m][j])
202               brute_buffer[l]=workc[k][m][j];
203         }
204
205         for(;l<n;l++)
206           if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
207             brute_buffer[l]=workc[k][m][EHMER_MAX-1];
208
209       }
210
211       /* be equally paranoid about being valid up to next half ocatve */
212       if(i+1<P_BANDS){
213         int l=0;
214         k=i+1;
215         for(j=0;j<EHMER_MAX;j++){
216           int lo_bin= fromOC(j*.125+i*.5-2.0625)/binHz;
217           int hi_bin= fromOC(j*.125+i*.5-1.9375)/binHz+1;
218           
219           if(lo_bin<0)lo_bin=0;
220           if(lo_bin>n)lo_bin=n;
221           if(lo_bin<l)l=lo_bin;
222           if(hi_bin<0)hi_bin=0;
223           if(hi_bin>n)hi_bin=n;
224
225           for(;l<hi_bin && l<n;l++)
226             if(brute_buffer[l]>workc[k][m][j])
227               brute_buffer[l]=workc[k][m][j];
228         }
229
230         for(;l<n;l++)
231           if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
232             brute_buffer[l]=workc[k][m][EHMER_MAX-1];
233
234       }
235
236
237       for(j=0;j<EHMER_MAX;j++){
238         int bin=fromOC(j*.125+i*.5-2.)/binHz;
239         if(bin<0){
240           ret[i][m][j+2]=-999.;
241         }else{
242           if(bin>=n){
243             ret[i][m][j+2]=-999.;
244           }else{
245             ret[i][m][j+2]=brute_buffer[bin];
246           }
247         }
248       }
249
250       /* add fenceposts */
251       for(j=0;j<EHMER_OFFSET;j++)
252         if(ret[i][m][j+2]>-200.f)break;  
253       ret[i][m][0]=j;
254       
255       for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--)
256         if(ret[i][m][j+2]>-200.f)
257           break;
258       ret[i][m][1]=j;
259
260     }
261   }
262
263   return(ret);
264 }
265
266 void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,
267                   vorbis_info_psy_global *gi,int n,long rate){
268   long i,j,lo=-99,hi=1;
269   long maxoc;
270   memset(p,0,sizeof(*p));
271
272   p->eighth_octave_lines=gi->eighth_octave_lines;
273   p->shiftoc=rint(log(gi->eighth_octave_lines*8.f)/log(2.f))-1;
274
275   p->firstoc=toOC(.25f*rate*.5/n)*(1<<(p->shiftoc+1))-gi->eighth_octave_lines;
276   maxoc=toOC((n+.25f)*rate*.5/n)*(1<<(p->shiftoc+1))+.5f;
277   p->total_octave_lines=maxoc-p->firstoc+1;
278   p->ath=_ogg_malloc(n*sizeof(*p->ath));
279
280   p->octave=_ogg_malloc(n*sizeof(*p->octave));
281   p->bark=_ogg_malloc(n*sizeof(*p->bark));
282   p->vi=vi;
283   p->n=n;
284   p->rate=rate;
285
286   /* set up the lookups for a given blocksize and sample rate */
287
288   for(i=0,j=0;i<MAX_ATH-1;i++){
289     int endpos=rint(fromOC((i+1)*.125-2.)*2*n/rate);
290     float base=ATH[i];
291     if(j<endpos){
292       float delta=(ATH[i+1]-base)/(endpos-j);
293       for(;j<endpos && j<n;j++){
294         p->ath[j]=base+100.;
295         base+=delta;
296       }
297     }
298   }
299
300   for(i=0;i<n;i++){
301     float bark=toBARK(rate/(2*n)*i); 
302
303     for(;lo+vi->noisewindowlomin<i && 
304           toBARK(rate/(2*n)*lo)<(bark-vi->noisewindowlo);lo++);
305     
306     for(;hi<=n && (hi<i+vi->noisewindowhimin ||
307           toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++);
308     
309     p->bark[i]=((lo-1)<<16)+(hi-1);
310
311   }
312
313   for(i=0;i<n;i++)
314     p->octave[i]=toOC((i+.25f)*.5*rate/n)*(1<<(p->shiftoc+1))+.5f;
315
316   p->tonecurves=setup_tone_curves(vi->toneatt,rate*.5/n,n,
317                                   vi->tone_centerboost,vi->tone_decay);
318   
319   /* set up rolling noise median */
320   p->noiseoffset=_ogg_malloc(P_NOISECURVES*sizeof(*p->noiseoffset));
321   for(i=0;i<P_NOISECURVES;i++)
322     p->noiseoffset[i]=_ogg_malloc(n*sizeof(**p->noiseoffset));
323   
324   for(i=0;i<n;i++){
325     float halfoc=toOC((i+.5)*rate/(2.*n))*2.;
326     int inthalfoc;
327     float del;
328     
329     if(halfoc<0)halfoc=0;
330     if(halfoc>=P_BANDS-1)halfoc=P_BANDS-1;
331     inthalfoc=(int)halfoc;
332     del=halfoc-inthalfoc;
333     
334     for(j=0;j<P_NOISECURVES;j++)
335       p->noiseoffset[j][i]=
336         p->vi->noiseoff[j][inthalfoc]*(1.-del) + 
337         p->vi->noiseoff[j][inthalfoc+1]*del;
338     
339   }
340 #if 0
341   {
342     static int ls=0;
343     _analysis_output_always("noiseoff0",ls,p->noiseoffset[0],n,1,0,0);
344     _analysis_output_always("noiseoff1",ls,p->noiseoffset[1],n,1,0,0);
345     _analysis_output_always("noiseoff2",ls++,p->noiseoffset[2],n,1,0,0);
346   }
347 #endif
348 }
349
350 void _vp_psy_clear(vorbis_look_psy *p){
351   int i,j;
352   if(p){
353     if(p->ath)_ogg_free(p->ath);
354     if(p->octave)_ogg_free(p->octave);
355     if(p->bark)_ogg_free(p->bark);
356     if(p->tonecurves){
357       for(i=0;i<P_BANDS;i++){
358         for(j=0;j<P_LEVELS;j++){
359           _ogg_free(p->tonecurves[i][j]);
360         }
361         _ogg_free(p->tonecurves[i]);
362       }
363       _ogg_free(p->tonecurves);
364     }
365     if(p->noiseoffset){
366       for(i=0;i<P_NOISECURVES;i++){
367         _ogg_free(p->noiseoffset[i]);
368       }
369       _ogg_free(p->noiseoffset);
370     }
371     memset(p,0,sizeof(*p));
372   }
373 }
374
375 /* octave/(8*eighth_octave_lines) x scale and dB y scale */
376 static void seed_curve(float *seed,
377                        const float **curves,
378                        float amp,
379                        int oc, int n,
380                        int linesper,float dBoffset){
381   int i,post1;
382   int seedptr;
383   const float *posts,*curve;
384
385   int choice=(int)((amp+dBoffset-P_LEVEL_0)*.1f);
386   choice=max(choice,0);
387   choice=min(choice,P_LEVELS-1);
388   posts=curves[choice];
389   curve=posts+2;
390   post1=(int)posts[1];
391   seedptr=oc+(posts[0]-EHMER_OFFSET)*linesper-(linesper>>1);
392
393   for(i=posts[0];i<post1;i++){
394     if(seedptr>0){
395       float lin=amp+curve[i];
396       if(seed[seedptr]<lin)seed[seedptr]=lin;
397     }
398     seedptr+=linesper;
399     if(seedptr>=n)break;
400   }
401 }
402
403 static void seed_loop(vorbis_look_psy *p,
404                       const float ***curves,
405                       const float *f, 
406                       const float *flr,
407                       float *seed,
408                       float specmax){
409   vorbis_info_psy *vi=p->vi;
410   long n=p->n,i;
411   float dBoffset=vi->max_curve_dB-specmax;
412
413   /* prime the working vector with peak values */
414
415   for(i=0;i<n;i++){
416     float max=f[i];
417     long oc=p->octave[i];
418     while(i+1<n && p->octave[i+1]==oc){
419       i++;
420       if(f[i]>max)max=f[i];
421     }
422     
423     if(max+6.f>flr[i]){
424       oc=oc>>p->shiftoc;
425
426       if(oc>=P_BANDS)oc=P_BANDS-1;
427       if(oc<0)oc=0;
428
429       seed_curve(seed,
430                  curves[oc],
431                  max,
432                  p->octave[i]-p->firstoc,
433                  p->total_octave_lines,
434                  p->eighth_octave_lines,
435                  dBoffset);
436     }
437   }
438 }
439
440 static void seed_chase(float *seeds, int linesper, long n){
441   long  *posstack=alloca(n*sizeof(*posstack));
442   float *ampstack=alloca(n*sizeof(*ampstack));
443   long   stack=0;
444   long   pos=0;
445   long   i;
446
447   for(i=0;i<n;i++){
448     if(stack<2){
449       posstack[stack]=i;
450       ampstack[stack++]=seeds[i];
451     }else{
452       while(1){
453         if(seeds[i]<ampstack[stack-1]){
454           posstack[stack]=i;
455           ampstack[stack++]=seeds[i];
456           break;
457         }else{
458           if(i<posstack[stack-1]+linesper){
459             if(stack>1 && ampstack[stack-1]<=ampstack[stack-2] &&
460                i<posstack[stack-2]+linesper){
461               /* we completely overlap, making stack-1 irrelevant.  pop it */
462               stack--;
463               continue;
464             }
465           }
466           posstack[stack]=i;
467           ampstack[stack++]=seeds[i];
468           break;
469
470         }
471       }
472     }
473   }
474
475   /* the stack now contains only the positions that are relevant. Scan
476      'em straight through */
477
478   for(i=0;i<stack;i++){
479     long endpos;
480     if(i<stack-1 && ampstack[i+1]>ampstack[i]){
481       endpos=posstack[i+1];
482     }else{
483       endpos=posstack[i]+linesper+1; /* +1 is important, else bin 0 is
484                                         discarded in short frames */
485     }
486     if(endpos>n)endpos=n;
487     for(;pos<endpos;pos++)
488       seeds[pos]=ampstack[i];
489   }
490   
491   /* there.  Linear time.  I now remember this was on a problem set I
492      had in Grad Skool... I didn't solve it at the time ;-) */
493
494 }
495
496 /* bleaugh, this is more complicated than it needs to be */
497 #include<stdio.h>
498 static void max_seeds(vorbis_look_psy *p,
499                       float *seed,
500                       float *flr){
501   long   n=p->total_octave_lines;
502   int    linesper=p->eighth_octave_lines;
503   long   linpos=0;
504   long   pos;
505
506   seed_chase(seed,linesper,n); /* for masking */
507  
508   pos=p->octave[0]-p->firstoc-(linesper>>1);
509
510   while(linpos+1<p->n){
511     float minV=seed[pos];
512     long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc;
513     if(minV>p->vi->tone_abs_limit)minV=p->vi->tone_abs_limit;
514     while(pos+1<=end){
515       pos++;
516       if((seed[pos]>NEGINF && seed[pos]<minV) || minV==NEGINF)
517         minV=seed[pos];
518     }
519     
520     end=pos+p->firstoc;
521     for(;linpos<p->n && p->octave[linpos]<=end;linpos++)
522       if(flr[linpos]<minV)flr[linpos]=minV;
523   }
524   
525   {
526     float minV=seed[p->total_octave_lines-1];
527     for(;linpos<p->n;linpos++)
528       if(flr[linpos]<minV)flr[linpos]=minV;
529   }
530   
531 }
532
533 static void bark_noise_hybridmp(int n,const long *b,
534                                 const float *f,
535                                 float *noise,
536                                 const float offset,
537                                 const int fixed){
538   
539   float *N=alloca(n*sizeof(*N));
540   float *X=alloca(n*sizeof(*N));
541   float *XX=alloca(n*sizeof(*N));
542   float *Y=alloca(n*sizeof(*N));
543   float *XY=alloca(n*sizeof(*N));
544
545   float tN, tX, tXX, tY, tXY;
546   int i;
547
548   int lo, hi;
549   float R, A, B, D;
550   float w, x, y;
551
552   tN = tX = tXX = tY = tXY = 0.f;
553
554   y = f[0] + offset;
555   if (y < 1.f) y = 1.f;
556
557   w = y * y * .5;
558     
559   tN += w;
560   tX += w;
561   tY += w * y;
562
563   N[0] = tN;
564   X[0] = tX;
565   XX[0] = tXX;
566   Y[0] = tY;
567   XY[0] = tXY;
568
569   for (i = 1, x = 1.f; i < n; i++, x += 1.f) {
570     
571     y = f[i] + offset;
572     if (y < 1.f) y = 1.f;
573
574     w = y * y;
575     
576     tN += w;
577     tX += w * x;
578     tXX += w * x * x;
579     tY += w * y;
580     tXY += w * x * y;
581
582     N[i] = tN;
583     X[i] = tX;
584     XX[i] = tXX;
585     Y[i] = tY;
586     XY[i] = tXY;
587   }
588   
589   for (i = 0, x = 0.f;; i++, x += 1.f) {
590     
591     lo = b[i] >> 16;
592     if( lo>=0 ) break;
593     hi = b[i] & 0xffff;
594     
595     tN = N[hi] + N[-lo];
596     tX = X[hi] - X[-lo];
597     tXX = XX[hi] + XX[-lo];
598     tY = Y[hi] + Y[-lo];    
599     tXY = XY[hi] - XY[-lo];
600     
601     A = tY * tXX - tX * tXY;
602     B = tN * tXY - tX * tY;
603     D = tN * tXX - tX * tX;
604     R = (A + x * B) / D;
605     if (R < 0.f)
606       R = 0.f;
607     
608     noise[i] = R - offset;
609   }
610   
611   for ( ;; i++, x += 1.f) {
612     
613     lo = b[i] >> 16;
614     hi = b[i] & 0xffff;
615     if(hi>=n)break;
616     
617     tN = N[hi] - N[lo];
618     tX = X[hi] - X[lo];
619     tXX = XX[hi] - XX[lo];
620     tY = Y[hi] - Y[lo];
621     tXY = XY[hi] - XY[lo];
622     
623     A = tY * tXX - tX * tXY;
624     B = tN * tXY - tX * tY;
625     D = tN * tXX - tX * tX;
626     R = (A + x * B) / D;
627     if (R < 0.f) R = 0.f;
628     
629     noise[i] = R - offset;
630   }
631   for ( ; i < n; i++, x += 1.f) {
632     
633     R = (A + x * B) / D;
634     if (R < 0.f) R = 0.f;
635     
636     noise[i] = R - offset;
637   }
638   
639   if (fixed <= 0) return;
640   
641   for (i = 0, x = 0.f;; i++, x += 1.f) {
642     hi = i + fixed / 2;
643     lo = hi - fixed;
644     if(lo>=0)break;
645
646     tN = N[hi] + N[-lo];
647     tX = X[hi] - X[-lo];
648     tXX = XX[hi] + XX[-lo];
649     tY = Y[hi] + Y[-lo];
650     tXY = XY[hi] - XY[-lo];
651     
652     
653     A = tY * tXX - tX * tXY;
654     B = tN * tXY - tX * tY;
655     D = tN * tXX - tX * tX;
656     R = (A + x * B) / D;
657
658     if (R - offset < noise[i]) noise[i] = R - offset;
659   }
660   for ( ;; i++, x += 1.f) {
661     
662     hi = i + fixed / 2;
663     lo = hi - fixed;
664     if(hi>=n)break;
665     
666     tN = N[hi] - N[lo];
667     tX = X[hi] - X[lo];
668     tXX = XX[hi] - XX[lo];
669     tY = Y[hi] - Y[lo];
670     tXY = XY[hi] - XY[lo];
671     
672     A = tY * tXX - tX * tXY;
673     B = tN * tXY - tX * tY;
674     D = tN * tXX - tX * tX;
675     R = (A + x * B) / D;
676     
677     if (R - offset < noise[i]) noise[i] = R - offset;
678   }
679   for ( ; i < n; i++, x += 1.f) {
680     R = (A + x * B) / D;
681     if (R - offset < noise[i]) noise[i] = R - offset;
682   }
683 }
684
685 static float FLOOR1_fromdB_INV_LOOKUP[256]={
686   0.F, 8.81683e+06F, 8.27882e+06F, 7.77365e+06F, 
687   7.29930e+06F, 6.85389e+06F, 6.43567e+06F, 6.04296e+06F, 
688   5.67422e+06F, 5.32798e+06F, 5.00286e+06F, 4.69759e+06F, 
689   4.41094e+06F, 4.14178e+06F, 3.88905e+06F, 3.65174e+06F, 
690   3.42891e+06F, 3.21968e+06F, 3.02321e+06F, 2.83873e+06F, 
691   2.66551e+06F, 2.50286e+06F, 2.35014e+06F, 2.20673e+06F, 
692   2.07208e+06F, 1.94564e+06F, 1.82692e+06F, 1.71544e+06F, 
693   1.61076e+06F, 1.51247e+06F, 1.42018e+06F, 1.33352e+06F, 
694   1.25215e+06F, 1.17574e+06F, 1.10400e+06F, 1.03663e+06F, 
695   973377.F, 913981.F, 858210.F, 805842.F, 
696   756669.F, 710497.F, 667142.F, 626433.F, 
697   588208.F, 552316.F, 518613.F, 486967.F, 
698   457252.F, 429351.F, 403152.F, 378551.F, 
699   355452.F, 333762.F, 313396.F, 294273.F, 
700   276316.F, 259455.F, 243623.F, 228757.F, 
701   214798.F, 201691.F, 189384.F, 177828.F, 
702   166977.F, 156788.F, 147221.F, 138237.F, 
703   129802.F, 121881.F, 114444.F, 107461.F, 
704   100903.F, 94746.3F, 88964.9F, 83536.2F, 
705   78438.8F, 73652.5F, 69158.2F, 64938.1F, 
706   60975.6F, 57254.9F, 53761.2F, 50480.6F, 
707   47400.3F, 44507.9F, 41792.0F, 39241.9F, 
708   36847.3F, 34598.9F, 32487.7F, 30505.3F, 
709   28643.8F, 26896.0F, 25254.8F, 23713.7F, 
710   22266.7F, 20908.0F, 19632.2F, 18434.2F, 
711   17309.4F, 16253.1F, 15261.4F, 14330.1F, 
712   13455.7F, 12634.6F, 11863.7F, 11139.7F, 
713   10460.0F, 9821.72F, 9222.39F, 8659.64F, 
714   8131.23F, 7635.06F, 7169.17F, 6731.70F, 
715   6320.93F, 5935.23F, 5573.06F, 5232.99F, 
716   4913.67F, 4613.84F, 4332.30F, 4067.94F, 
717   3819.72F, 3586.64F, 3367.78F, 3162.28F, 
718   2969.31F, 2788.13F, 2617.99F, 2458.24F, 
719   2308.24F, 2167.39F, 2035.14F, 1910.95F, 
720   1794.35F, 1684.85F, 1582.04F, 1485.51F, 
721   1394.86F, 1309.75F, 1229.83F, 1154.78F, 
722   1084.32F, 1018.15F, 956.024F, 897.687F, 
723   842.910F, 791.475F, 743.179F, 697.830F, 
724   655.249F, 615.265F, 577.722F, 542.469F, 
725   509.367F, 478.286F, 449.101F, 421.696F, 
726   395.964F, 371.803F, 349.115F, 327.812F, 
727   307.809F, 289.026F, 271.390F, 254.830F, 
728   239.280F, 224.679F, 210.969F, 198.096F, 
729   186.008F, 174.658F, 164.000F, 153.993F, 
730   144.596F, 135.773F, 127.488F, 119.708F, 
731   112.404F, 105.545F, 99.1046F, 93.0572F, 
732   87.3788F, 82.0469F, 77.0404F, 72.3394F, 
733   67.9252F, 63.7804F, 59.8885F, 56.2341F, 
734   52.8027F, 49.5807F, 46.5553F, 43.7144F, 
735   41.0470F, 38.5423F, 36.1904F, 33.9821F, 
736   31.9085F, 29.9614F, 28.1332F, 26.4165F, 
737   24.8045F, 23.2910F, 21.8697F, 20.5352F, 
738   19.2822F, 18.1056F, 17.0008F, 15.9634F, 
739   14.9893F, 14.0746F, 13.2158F, 12.4094F, 
740   11.6522F, 10.9411F, 10.2735F, 9.64662F, 
741   9.05798F, 8.50526F, 7.98626F, 7.49894F, 
742   7.04135F, 6.61169F, 6.20824F, 5.82941F, 
743   5.47370F, 5.13970F, 4.82607F, 4.53158F, 
744   4.25507F, 3.99542F, 3.75162F, 3.52269F, 
745   3.30774F, 3.10590F, 2.91638F, 2.73842F, 
746   2.57132F, 2.41442F, 2.26709F, 2.12875F, 
747   1.99885F, 1.87688F, 1.76236F, 1.65482F, 
748   1.55384F, 1.45902F, 1.36999F, 1.28640F, 
749   1.20790F, 1.13419F, 1.06499F, 1.F
750 };
751
752 void _vp_remove_floor(vorbis_look_psy *p,
753                       float *mdct,
754                       int *codedflr,
755                       float *residue,
756                       int sliding_lowpass){ 
757
758   int i,n=p->n;
759  
760   if(sliding_lowpass>n)sliding_lowpass=n;
761   
762   for(i=0;i<sliding_lowpass;i++){
763     residue[i]=
764       mdct[i]*FLOOR1_fromdB_INV_LOOKUP[codedflr[i]];
765   }
766
767   for(;i<n;i++)
768     residue[i]=0.;
769 }
770
771 void _vp_noisemask(vorbis_look_psy *p,
772                    float *logmdct, 
773                    float *logmask){
774
775   int i,n=p->n;
776   float *work=alloca(n*sizeof(*work));
777
778   bark_noise_hybridmp(n,p->bark,logmdct,logmask,
779                       140.,-1);
780
781   for(i=0;i<n;i++)work[i]=logmdct[i]-logmask[i];
782
783   bark_noise_hybridmp(n,p->bark,work,logmask,0.,
784                       p->vi->noisewindowfixed);
785
786   for(i=0;i<n;i++)work[i]=logmdct[i]-work[i];
787   
788 #if 0
789   {
790     static int seq=0;
791
792     float work2[n];
793     for(i=0;i<n;i++){
794       work2[i]=logmask[i]+work[i];
795     }
796     
797     if(seq&1)
798       _analysis_output("median2R",seq/2,work,n,1,0,0);
799     else
800       _analysis_output("median2L",seq/2,work,n,1,0,0);
801     
802     if(seq&1)
803       _analysis_output("envelope2R",seq/2,work2,n,1,0,0);
804     else
805       _analysis_output("envelope2L",seq/2,work2,n,1,0,0);
806     seq++;
807   }
808 #endif
809
810   for(i=0;i<n;i++){
811     int dB=logmask[i]+.5;
812     if(dB>=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1;
813     if(dB<0)dB=0;
814     logmask[i]= work[i]+p->vi->noisecompand[dB];
815   }
816
817 }
818
819 void _vp_tonemask(vorbis_look_psy *p,
820                   float *logfft,
821                   float *logmask,
822                   float global_specmax,
823                   float local_specmax){
824
825   int i,n=p->n;
826
827   float *seed=alloca(sizeof(*seed)*p->total_octave_lines);
828   float att=local_specmax+p->vi->ath_adjatt;
829   for(i=0;i<p->total_octave_lines;i++)seed[i]=NEGINF;
830   
831   /* set the ATH (floating below localmax, not global max by a
832      specified att) */
833   if(att<p->vi->ath_maxatt)att=p->vi->ath_maxatt;
834   
835   for(i=0;i<n;i++)
836     logmask[i]=p->ath[i]+att;
837
838   /* tone masking */
839   seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax);
840   max_seeds(p,seed,logmask);
841
842 }
843
844 void _vp_offset_and_mix(vorbis_look_psy *p,
845                         float *noise,
846                         float *tone,
847                         int offset_select,
848                         float *logmask){
849   int i,n=p->n;
850   float toneatt=p->vi->tone_masteratt[offset_select];
851   
852   for(i=0;i<n;i++){
853     float val= noise[i]+p->noiseoffset[offset_select][i];
854     if(val>p->vi->noisemaxsupp)val=p->vi->noisemaxsupp;
855     logmask[i]=max(val,tone[i]+toneatt);
856   }
857 }
858
859 float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){
860   vorbis_info *vi=vd->vi;
861   codec_setup_info *ci=vi->codec_setup;
862   vorbis_info_psy_global *gi=&ci->psy_g_param;
863
864   int n=ci->blocksizes[vd->W]/2;
865   float secs=(float)n/vi->rate;
866
867   amp+=secs*gi->ampmax_att_per_sec;
868   if(amp<-9999)amp=-9999;
869   return(amp);
870 }
871
872 static void couple_lossless(float A, float B, 
873                             float *qA, float *qB){
874   int test1=fabs(*qA)>fabs(*qB);
875   test1-= fabs(*qA)<fabs(*qB);
876   
877   if(!test1)test1=((fabs(A)>fabs(B))<<1)-1;
878   if(test1==1){
879     *qB=(*qA>0.f?*qA-*qB:*qB-*qA);
880   }else{
881     float temp=*qB;  
882     *qB=(*qB>0.f?*qA-*qB:*qB-*qA);
883     *qA=temp;
884   }
885
886   if(*qB>fabs(*qA)*1.9999f){
887     *qB= -fabs(*qA)*2.f;
888     *qA= -*qA;
889   }
890 }
891
892 static float hypot_lookup[32]={
893   -0.009935, -0.011245, -0.012726, -0.014397, 
894   -0.016282, -0.018407, -0.020800, -0.023494, 
895   -0.026522, -0.029923, -0.033737, -0.038010, 
896   -0.042787, -0.048121, -0.054064, -0.060671, 
897   -0.068000, -0.076109, -0.085054, -0.094892, 
898   -0.105675, -0.117451, -0.130260, -0.144134, 
899   -0.159093, -0.175146, -0.192286, -0.210490, 
900   -0.229718, -0.249913, -0.271001, -0.292893};
901
902 static void precomputed_couple_point(float premag,
903                                      int floorA,int floorB,
904                                      float *mag, float *ang){
905   
906   int test=(floorA>floorB)-1;
907   int offset=31-abs(floorA-floorB);
908   float floormag=hypot_lookup[((offset<0)-1)&offset]+1.f;
909
910   floormag*=FLOOR1_fromdB_INV_LOOKUP[(floorB&test)|(floorA&(~test))];
911
912   *mag=premag*floormag;
913   *ang=0.f;
914 }
915
916 /* just like below, this is currently set up to only do
917    single-step-depth coupling.  Otherwise, we'd have to do more
918    copying (which will be inevitable later) */
919
920 /* doing the real circular magnitude calculation is audibly superior
921    to (A+B)/sqrt(2) */
922 static float dipole_hypot(float a, float b){
923   if(a>0.){
924     if(b>0.)return sqrt(a*a+b*b);
925     if(a>-b)return sqrt(a*a-b*b);
926     return -sqrt(b*b-a*a);
927   }
928   if(b<0.)return -sqrt(a*a+b*b);
929   if(-a>b)return -sqrt(a*a-b*b);
930   return sqrt(b*b-a*a);
931 }
932 static float round_hypot(float a, float b){
933   if(a>0.){
934     if(b>0.)return sqrt(a*a+b*b);
935     if(a>-b)return sqrt(a*a+b*b);
936     return -sqrt(b*b+a*a);
937   }
938   if(b<0.)return -sqrt(a*a+b*b);
939   if(-a>b)return -sqrt(a*a+b*b);
940   return sqrt(b*b+a*a);
941 }
942
943 /* revert to round hypot for now */
944 float **_vp_quantize_couple_memo(vorbis_block *vb,
945                                  vorbis_info_psy_global *g,
946                                  vorbis_look_psy *p,
947                                  vorbis_info_mapping0 *vi,
948                                  float **mdct){
949   
950   int i,j,n=p->n;
951   float **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
952   int limit=g->coupling_pointlimit[p->vi->blockflag][PACKETBLOBS/2];
953   
954   for(i=0;i<vi->coupling_steps;i++){
955     float *mdctM=mdct[vi->coupling_mag[i]];
956     float *mdctA=mdct[vi->coupling_ang[i]];
957     ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
958     for(j=0;j<limit;j++)
959       ret[i][j]=dipole_hypot(mdctM[j],mdctA[j]);
960     for(;j<n;j++)
961       ret[i][j]=round_hypot(mdctM[j],mdctA[j]);
962   }
963
964   return(ret);
965 }
966
967 /* this is for per-channel noise normalization */
968 static int apsort(const void *a, const void *b){
969   float f1=fabs(**(float**)a);
970   float f2=fabs(**(float**)b);
971   return (f1<f2)-(f1>f2);
972 }
973
974 int **_vp_quantize_couple_sort(vorbis_block *vb,
975                                vorbis_look_psy *p,
976                                vorbis_info_mapping0 *vi,
977                                float **mags){
978
979
980   if(p->vi->normal_point_p){
981     int i,j,k,n=p->n;
982     int **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
983     int partition=p->vi->normal_partition;
984     float **work=alloca(sizeof(*work)*partition);
985     
986     for(i=0;i<vi->coupling_steps;i++){
987       ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
988       
989       for(j=0;j<n;j+=partition){
990         for(k=0;k<partition;k++)work[k]=mags[i]+k+j;
991         qsort(work,partition,sizeof(*work),apsort);
992         for(k=0;k<partition;k++)ret[i][k+j]=work[k]-mags[i];
993       }
994     }
995     return(ret);
996   }
997   return(NULL);
998 }
999
1000 void _vp_noise_normalize_sort(vorbis_look_psy *p,
1001                               float *magnitudes,int *sortedindex){
1002   int i,j,n=p->n;
1003   vorbis_info_psy *vi=p->vi;
1004   int partition=vi->normal_partition;
1005   float **work=alloca(sizeof(*work)*partition);
1006   int start=vi->normal_start;
1007
1008   for(j=start;j<n;j+=partition){
1009     if(j+partition>n)partition=n-j;
1010     for(i=0;i<partition;i++)work[i]=magnitudes+i+j;
1011     qsort(work,partition,sizeof(*work),apsort);
1012     for(i=0;i<partition;i++){
1013       sortedindex[i+j-start]=work[i]-magnitudes;
1014     }
1015   }
1016 }
1017
1018 void _vp_noise_normalize(vorbis_look_psy *p,
1019                          float *in,float *out,int *sortedindex){
1020   int flag=0,i,j=0,n=p->n;
1021   vorbis_info_psy *vi=p->vi;
1022   int partition=vi->normal_partition;
1023   int start=vi->normal_start;
1024
1025   if(start>n)start=n;
1026
1027   if(vi->normal_channel_p){
1028     for(;j<start;j++)
1029       out[j]=rint(in[j]);
1030     
1031     for(;j+partition<=n;j+=partition){
1032       float acc=0.;
1033       int k;
1034       
1035       for(i=j;i<j+partition;i++)
1036         acc+=in[i]*in[i];
1037       
1038       for(i=0;i<partition;i++){
1039         k=sortedindex[i+j-start];
1040         
1041         if(in[k]*in[k]>=.25f){
1042           out[k]=rint(in[k]);
1043           acc-=in[k]*in[k];
1044           flag=1;
1045         }else{
1046           if(acc<vi->normal_thresh)break;
1047           out[k]=unitnorm(in[k]);
1048           acc-=1.;
1049         }
1050       }
1051       
1052       for(;i<partition;i++){
1053         k=sortedindex[i+j-start];
1054         out[k]=0.;
1055       }
1056     }
1057   }
1058   
1059   for(;j<n;j++)
1060     out[j]=rint(in[j]);
1061   
1062 }
1063
1064 void _vp_couple(int blobno,
1065                 vorbis_info_psy_global *g,
1066                 vorbis_look_psy *p,
1067                 vorbis_info_mapping0 *vi,
1068                 float **res,
1069                 float **mag_memo,
1070                 int   **mag_sort,
1071                 int   **ifloor,
1072                 int   *nonzero,
1073                 int  sliding_lowpass){
1074
1075   int i,j,k,n=p->n;
1076
1077   /* perform any requested channel coupling */
1078   /* point stereo can only be used in a first stage (in this encoder)
1079      because of the dependency on floor lookups */
1080   for(i=0;i<vi->coupling_steps;i++){
1081
1082     /* once we're doing multistage coupling in which a channel goes
1083        through more than one coupling step, the floor vector
1084        magnitudes will also have to be recalculated an propogated
1085        along with PCM.  Right now, we're not (that will wait until 5.1
1086        most likely), so the code isn't here yet. The memory management
1087        here is all assuming single depth couplings anyway. */
1088
1089     /* make sure coupling a zero and a nonzero channel results in two
1090        nonzero channels. */
1091     if(nonzero[vi->coupling_mag[i]] ||
1092        nonzero[vi->coupling_ang[i]]){
1093      
1094
1095       float *rM=res[vi->coupling_mag[i]];
1096       float *rA=res[vi->coupling_ang[i]];
1097       float *qM=rM+n;
1098       float *qA=rA+n;
1099       int *floorM=ifloor[vi->coupling_mag[i]];
1100       int *floorA=ifloor[vi->coupling_ang[i]];
1101       float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]];
1102       float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]];
1103       int partition=(p->vi->normal_point_p?p->vi->normal_partition:p->n);
1104       int limit=g->coupling_pointlimit[p->vi->blockflag][blobno];
1105       int pointlimit=limit;
1106
1107       nonzero[vi->coupling_mag[i]]=1; 
1108       nonzero[vi->coupling_ang[i]]=1; 
1109
1110       for(j=0;j<p->n;j+=partition){
1111         float acc=0.f;
1112
1113         for(k=0;k<partition;k++){
1114           int l=k+j;
1115
1116           if(l<sliding_lowpass){
1117             if((l>=limit && fabs(rM[l])<postpoint && fabs(rA[l])<postpoint) ||
1118                (fabs(rM[l])<prepoint && fabs(rA[l])<prepoint)){
1119
1120
1121               precomputed_couple_point(mag_memo[i][l],
1122                                        floorM[l],floorA[l],
1123                                        qM+l,qA+l);
1124
1125               if(rint(qM[l])==0.f)acc+=qM[l]*qM[l];
1126             }else{
1127               couple_lossless(rM[l],rA[l],qM+l,qA+l);
1128             }
1129           }else{
1130             qM[l]=0.;
1131             qA[l]=0.;
1132           }
1133         }
1134         
1135         if(p->vi->normal_point_p){
1136           for(k=0;k<partition && acc>=p->vi->normal_thresh;k++){
1137             int l=mag_sort[i][j+k];
1138             if(l<sliding_lowpass && l>=pointlimit && rint(qM[l])==0.f){
1139               qM[l]=unitnorm(qM[l]);
1140               acc-=1.f;
1141             }
1142           } 
1143         }
1144       }
1145     }
1146   }
1147 }
1148