1 /********************************************************************
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. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
9 * by the XIPHOPHORUS Company http://www.xiph.org/ *
11 ********************************************************************
13 function: psychoacoustics not including preecho
14 last mod: $Id: psy.c,v 1.81 2002/10/21 07:00:11 xiphmont Exp $
16 ********************************************************************/
21 #include "vorbis/codec.h"
22 #include "codec_internal.h"
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};
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));
40 look->channels=vi->channels;
47 void _vp_global_free(vorbis_look_psy_global *look){
49 memset(look,0,sizeof(*look));
54 void _vi_gpsy_free(vorbis_info_psy_global *i){
56 memset(i,0,sizeof(*i));
61 void _vi_psy_free(vorbis_info_psy *i){
63 memset(i,0,sizeof(*i));
68 static void min_curve(float *c,
71 for(i=0;i<EHMER_MAX;i++)if(c2[i]<c[i])c[i]=c2[i];
73 static void max_curve(float *c,
76 for(i=0;i<EHMER_MAX;i++)if(c2[i]>c[i])c[i]=c2[i];
79 static void attenuate_curve(float *c,float att){
81 for(i=0;i<EHMER_MAX;i++)
85 static float ***setup_tone_curves(float curveatt_dB[P_BANDS],float binHz,int n,
86 float center_boost, float center_decay_rate){
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));
93 float ***ret=_ogg_malloc(sizeof(*ret)*P_BANDS);
95 memset(workc,0,sizeof(workc));
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). */
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 */
105 for(j=0;j<EHMER_MAX;j++){
108 if(j+k+ath_offset<MAX_ATH){
109 if(min>ATH[j+k+ath_offset])min=ATH[j+k+ath_offset];
111 if(min>ATH[MAX_ATH-1])min=ATH[MAX_ATH-1];
116 /* copy curves into working space, replicate the 50dB curve to 30
117 and 40, replicate the 100dB curve to 110 */
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]));
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.;
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]);
142 /* Now limit the louder curves.
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],
152 for(j=1;j<P_LEVELS;j++){
153 min_curve(athc[j],athc[j-1]);
154 min_curve(workc[i][j],athc[j]);
158 for(i=0;i<P_BANDS;i++){
159 int hi_curve,lo_curve,bin;
160 ret[i]=_ogg_malloc(sizeof(**ret)*P_LEVELS);
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. */
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;
179 for(m=0;m<P_LEVELS;m++){
180 ret[i][m]=_ogg_malloc(sizeof(***ret)*(EHMER_MAX+2));
182 for(j=0;j<n;j++)brute_buffer[j]=999.;
184 /* render the curve into bins, then pull values back into curve.
185 The point is that any inherent subsampling aliasing results in
187 for(k=lo_curve;k<=hi_curve;k++){
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;
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;
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];
206 if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
207 brute_buffer[l]=workc[k][m][EHMER_MAX-1];
211 /* be equally paranoid about being valid up to next half ocatve */
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;
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;
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];
231 if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
232 brute_buffer[l]=workc[k][m][EHMER_MAX-1];
237 for(j=0;j<EHMER_MAX;j++){
238 int bin=fromOC(j*.125+i*.5-2.)/binHz;
240 ret[i][m][j+2]=-999.;
243 ret[i][m][j+2]=-999.;
245 ret[i][m][j+2]=brute_buffer[bin];
251 for(j=0;j<EHMER_OFFSET;j++)
252 if(ret[i][m][j+2]>-200.f)break;
255 for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--)
256 if(ret[i][m][j+2]>-200.f)
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;
270 memset(p,0,sizeof(*p));
272 p->eighth_octave_lines=gi->eighth_octave_lines;
273 p->shiftoc=rint(log(gi->eighth_octave_lines*8.f)/log(2.f))-1;
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));
280 p->octave=_ogg_malloc(n*sizeof(*p->octave));
281 p->bark=_ogg_malloc(n*sizeof(*p->bark));
286 /* set up the lookups for a given blocksize and sample rate */
288 for(i=0,j=0;i<MAX_ATH-1;i++){
289 int endpos=rint(fromOC((i+1)*.125-2.)*2*n/rate);
292 float delta=(ATH[i+1]-base)/(endpos-j);
293 for(;j<endpos && j<n;j++){
301 float bark=toBARK(rate/(2*n)*i);
303 for(;lo+vi->noisewindowlomin<i &&
304 toBARK(rate/(2*n)*lo)<(bark-vi->noisewindowlo);lo++);
306 for(;hi<=n && (hi<i+vi->noisewindowhimin ||
307 toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++);
309 p->bark[i]=((lo-1)<<16)+(hi-1);
314 p->octave[i]=toOC((i+.25f)*.5*rate/n)*(1<<(p->shiftoc+1))+.5f;
316 p->tonecurves=setup_tone_curves(vi->toneatt,rate*.5/n,n,
317 vi->tone_centerboost,vi->tone_decay);
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));
325 float halfoc=toOC((i+.5)*rate/(2.*n))*2.;
329 if(halfoc<0)halfoc=0;
330 if(halfoc>=P_BANDS-1)halfoc=P_BANDS-1;
331 inthalfoc=(int)halfoc;
332 del=halfoc-inthalfoc;
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;
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);
350 void _vp_psy_clear(vorbis_look_psy *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);
357 for(i=0;i<P_BANDS;i++){
358 for(j=0;j<P_LEVELS;j++){
359 _ogg_free(p->tonecurves[i][j]);
361 _ogg_free(p->tonecurves[i]);
363 _ogg_free(p->tonecurves);
366 for(i=0;i<P_NOISECURVES;i++){
367 _ogg_free(p->noiseoffset[i]);
369 _ogg_free(p->noiseoffset);
371 memset(p,0,sizeof(*p));
375 /* octave/(8*eighth_octave_lines) x scale and dB y scale */
376 static void seed_curve(float *seed,
377 const float **curves,
380 int linesper,float dBoffset){
383 const float *posts,*curve;
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];
391 seedptr=oc+(posts[0]-EHMER_OFFSET)*linesper-(linesper>>1);
393 for(i=posts[0];i<post1;i++){
395 float lin=amp+curve[i];
396 if(seed[seedptr]<lin)seed[seedptr]=lin;
403 static void seed_loop(vorbis_look_psy *p,
404 const float ***curves,
409 vorbis_info_psy *vi=p->vi;
411 float dBoffset=vi->max_curve_dB-specmax;
413 /* prime the working vector with peak values */
417 long oc=p->octave[i];
418 while(i+1<n && p->octave[i+1]==oc){
420 if(f[i]>max)max=f[i];
426 if(oc>=P_BANDS)oc=P_BANDS-1;
432 p->octave[i]-p->firstoc,
433 p->total_octave_lines,
434 p->eighth_octave_lines,
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));
450 ampstack[stack++]=seeds[i];
453 if(seeds[i]<ampstack[stack-1]){
455 ampstack[stack++]=seeds[i];
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 */
467 ampstack[stack++]=seeds[i];
475 /* the stack now contains only the positions that are relevant. Scan
476 'em straight through */
478 for(i=0;i<stack;i++){
480 if(i<stack-1 && ampstack[i+1]>ampstack[i]){
481 endpos=posstack[i+1];
483 endpos=posstack[i]+linesper+1; /* +1 is important, else bin 0 is
484 discarded in short frames */
486 if(endpos>n)endpos=n;
487 for(;pos<endpos;pos++)
488 seeds[pos]=ampstack[i];
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 ;-) */
496 /* bleaugh, this is more complicated than it needs to be */
498 static void max_seeds(vorbis_look_psy *p,
501 long n=p->total_octave_lines;
502 int linesper=p->eighth_octave_lines;
506 seed_chase(seed,linesper,n); /* for masking */
508 pos=p->octave[0]-p->firstoc-(linesper>>1);
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;
516 if((seed[pos]>NEGINF && seed[pos]<minV) || minV==NEGINF)
521 for(;linpos<p->n && p->octave[linpos]<=end;linpos++)
522 if(flr[linpos]<minV)flr[linpos]=minV;
526 float minV=seed[p->total_octave_lines-1];
527 for(;linpos<p->n;linpos++)
528 if(flr[linpos]<minV)flr[linpos]=minV;
533 static void bark_noise_hybridmp(int n,const long *b,
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));
545 float tN, tX, tXX, tY, tXY;
552 tN = tX = tXX = tY = tXY = 0.f;
555 if (y < 1.f) y = 1.f;
569 for (i = 1, x = 1.f; i < n; i++, x += 1.f) {
572 if (y < 1.f) y = 1.f;
589 for (i = 0, x = 0.f;; i++, x += 1.f) {
597 tXX = XX[hi] + XX[-lo];
599 tXY = XY[hi] - XY[-lo];
601 A = tY * tXX - tX * tXY;
602 B = tN * tXY - tX * tY;
603 D = tN * tXX - tX * tX;
608 noise[i] = R - offset;
611 for ( ;; i++, x += 1.f) {
619 tXX = XX[hi] - XX[lo];
621 tXY = XY[hi] - XY[lo];
623 A = tY * tXX - tX * tXY;
624 B = tN * tXY - tX * tY;
625 D = tN * tXX - tX * tX;
627 if (R < 0.f) R = 0.f;
629 noise[i] = R - offset;
631 for ( ; i < n; i++, x += 1.f) {
634 if (R < 0.f) R = 0.f;
636 noise[i] = R - offset;
639 if (fixed <= 0) return;
641 for (i = 0, x = 0.f;; i++, x += 1.f) {
648 tXX = XX[hi] + XX[-lo];
650 tXY = XY[hi] - XY[-lo];
653 A = tY * tXX - tX * tXY;
654 B = tN * tXY - tX * tY;
655 D = tN * tXX - tX * tX;
658 if (R - offset < noise[i]) noise[i] = R - offset;
660 for ( ;; i++, x += 1.f) {
668 tXX = XX[hi] - XX[lo];
670 tXY = XY[hi] - XY[lo];
672 A = tY * tXX - tX * tXY;
673 B = tN * tXY - tX * tY;
674 D = tN * tXX - tX * tX;
677 if (R - offset < noise[i]) noise[i] = R - offset;
679 for ( ; i < n; i++, x += 1.f) {
681 if (R - offset < noise[i]) noise[i] = R - offset;
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
752 void _vp_remove_floor(vorbis_look_psy *p,
756 int sliding_lowpass){
760 if(sliding_lowpass>n)sliding_lowpass=n;
762 for(i=0;i<sliding_lowpass;i++){
764 mdct[i]*FLOOR1_fromdB_INV_LOOKUP[codedflr[i]];
771 void _vp_noisemask(vorbis_look_psy *p,
776 float *work=alloca(n*sizeof(*work));
778 bark_noise_hybridmp(n,p->bark,logmdct,logmask,
781 for(i=0;i<n;i++)work[i]=logmdct[i]-logmask[i];
783 bark_noise_hybridmp(n,p->bark,work,logmask,0.,
784 p->vi->noisewindowfixed);
786 for(i=0;i<n;i++)work[i]=logmdct[i]-work[i];
794 work2[i]=logmask[i]+work[i];
798 _analysis_output("median2R",seq/2,work,n,1,0,0);
800 _analysis_output("median2L",seq/2,work,n,1,0,0);
803 _analysis_output("envelope2R",seq/2,work2,n,1,0,0);
805 _analysis_output("envelope2L",seq/2,work2,n,1,0,0);
811 int dB=logmask[i]+.5;
812 if(dB>=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1;
814 logmask[i]= work[i]+p->vi->noisecompand[dB];
819 void _vp_tonemask(vorbis_look_psy *p,
822 float global_specmax,
823 float local_specmax){
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;
831 /* set the ATH (floating below localmax, not global max by a
833 if(att<p->vi->ath_maxatt)att=p->vi->ath_maxatt;
836 logmask[i]=p->ath[i]+att;
839 seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax);
840 max_seeds(p,seed,logmask);
844 void _vp_offset_and_mix(vorbis_look_psy *p,
850 float toneatt=p->vi->tone_masteratt[offset_select];
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);
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;
864 int n=ci->blocksizes[vd->W]/2;
865 float secs=(float)n/vi->rate;
867 amp+=secs*gi->ampmax_att_per_sec;
868 if(amp<-9999)amp=-9999;
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);
877 if(!test1)test1=((fabs(A)>fabs(B))<<1)-1;
879 *qB=(*qA>0.f?*qA-*qB:*qB-*qA);
882 *qB=(*qB>0.f?*qA-*qB:*qB-*qA);
886 if(*qB>fabs(*qA)*1.9999f){
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};
902 static void precomputed_couple_point(float premag,
903 int floorA,int floorB,
904 float *mag, float *ang){
906 int test=(floorA>floorB)-1;
907 int offset=31-abs(floorA-floorB);
908 float floormag=hypot_lookup[((offset<0)-1)&offset]+1.f;
910 floormag*=FLOOR1_fromdB_INV_LOOKUP[(floorB&test)|(floorA&(~test))];
912 *mag=premag*floormag;
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) */
920 /* doing the real circular magnitude calculation is audibly superior
922 static float dipole_hypot(float a, float b){
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);
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);
932 static float round_hypot(float a, float b){
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);
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);
943 /* revert to round hypot for now */
944 float **_vp_quantize_couple_memo(vorbis_block *vb,
945 vorbis_info_psy_global *g,
947 vorbis_info_mapping0 *vi,
951 float **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
952 int limit=g->coupling_pointlimit[p->vi->blockflag][PACKETBLOBS/2];
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));
959 ret[i][j]=dipole_hypot(mdctM[j],mdctA[j]);
961 ret[i][j]=round_hypot(mdctM[j],mdctA[j]);
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);
974 int **_vp_quantize_couple_sort(vorbis_block *vb,
976 vorbis_info_mapping0 *vi,
980 if(p->vi->normal_point_p){
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);
986 for(i=0;i<vi->coupling_steps;i++){
987 ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
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];
1000 void _vp_noise_normalize_sort(vorbis_look_psy *p,
1001 float *magnitudes,int *sortedindex){
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;
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;
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;
1027 if(vi->normal_channel_p){
1031 for(;j+partition<=n;j+=partition){
1035 for(i=j;i<j+partition;i++)
1038 for(i=0;i<partition;i++){
1039 k=sortedindex[i+j-start];
1041 if(in[k]*in[k]>=.25f){
1046 if(acc<vi->normal_thresh)break;
1047 out[k]=unitnorm(in[k]);
1052 for(;i<partition;i++){
1053 k=sortedindex[i+j-start];
1064 void _vp_couple(int blobno,
1065 vorbis_info_psy_global *g,
1067 vorbis_info_mapping0 *vi,
1073 int sliding_lowpass){
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++){
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. */
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]]){
1095 float *rM=res[vi->coupling_mag[i]];
1096 float *rA=res[vi->coupling_ang[i]];
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;
1107 nonzero[vi->coupling_mag[i]]=1;
1108 nonzero[vi->coupling_ang[i]]=1;
1110 for(j=0;j<p->n;j+=partition){
1113 for(k=0;k<partition;k++){
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)){
1121 precomputed_couple_point(mag_memo[i][l],
1122 floorM[l],floorA[l],
1125 if(rint(qM[l])==0.f)acc+=qM[l]*qM[l];
1127 couple_lossless(rM[l],rA[l],qM+l,qA+l);
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]);