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-2001 *
9 * by the XIPHOPHORUS Company http://www.xiph.org/ *
11 ********************************************************************
13 function: psychoacoustics not including preecho
14 last mod: $Id: psy.c,v 1.70 2002/06/30 08:31:00 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=0;
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/n)*(1<<(p->shiftoc+1))-gi->eighth_octave_lines;
276 maxoc=toOC((n*.5f-.25f)*rate/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<<16)+hi;
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 */
497 static void max_seeds(vorbis_look_psy *p,
500 long n=p->total_octave_lines;
501 int linesper=p->eighth_octave_lines;
505 seed_chase(seed,linesper,n); /* for masking */
507 pos=p->octave[0]-p->firstoc-(linesper>>1);
508 while(linpos+1<p->n){
509 float minV=seed[pos];
510 long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc;
511 if(minV>p->vi->tone_abs_limit)minV=p->vi->tone_abs_limit;
514 if((seed[pos]>NEGINF && seed[pos]<minV) || minV==NEGINF)
518 /* seed scale is log. Floor is linear. Map back to it */
520 for(;linpos<p->n && p->octave[linpos]<=end;linpos++)
521 if(flr[linpos]<minV)flr[linpos]=minV;
525 float minV=seed[p->total_octave_lines-1];
526 for(;linpos<p->n;linpos++)
527 if(flr[linpos]<minV)flr[linpos]=minV;
532 static void bark_noise_hybridmp(int n,const long *b,
538 float *N=alloca((n+1)*sizeof(*N));
539 float *X=alloca((n+1)*sizeof(*N));
540 float *XX=alloca((n+1)*sizeof(*N));
541 float *Y=alloca((n+1)*sizeof(*N));
542 float *XY=alloca((n+1)*sizeof(*N));
544 float tN, tX, tXX, tY, tXY;
551 tN = tX = tXX = tY = tXY = 0.f;
552 for (i = 0, fi = 0.f; i < n; i++, fi += 1.f) {
557 if (y < 1.f) y = 1.f;
576 for (i = 0, fi = 0.f;; i++, fi += 1.f) {
584 tXX = XX[hi] + XX[-lo];
586 tXY = XY[hi] - XY[-lo];
588 A = tY * tXX - tX * tXY;
589 B = tN * tXY - tX * tY;
590 D = tN * tXX - tX * tX;
591 R = (A + fi * B) / D;
595 noise[i] = R - offset;
598 for ( ; hi < n; i++, fi += 1.f) {
605 tXX = XX[hi] - XX[lo];
607 tXY = XY[hi] - XY[lo];
609 A = tY * tXX - tX * tXY;
610 B = tN * tXY - tX * tY;
611 D = tN * tXX - tX * tX;
612 R = (A + fi * B) / D;
613 if (R < 0.f) R = 0.f;
615 noise[i] = R - offset;
617 for ( ; i < n; i++, fi += 1.f) {
619 R = (A + fi * B) / D;
620 if (R < 0.f) R = 0.f;
622 noise[i] = R - offset;
625 if (fixed <= 0) return;
627 for (i = 0, fi = 0.f; i < (fixed + 1) / 2; i++, fi += 1.f) {
633 tXX = XX[hi] + XX[-lo];
635 tXY = XY[hi] - XY[-lo];
638 A = tY * tXX - tX * tXY;
639 B = tN * tXY - tX * tY;
640 D = tN * tXX - tX * tX;
641 R = (A + fi * B) / D;
643 if (R > 0.f && R - offset < noise[i]) noise[i] = R - offset;
645 for ( ; hi < n; i++, fi += 1.f) {
652 tXX = XX[hi] - XX[lo];
654 tXY = XY[hi] - XY[lo];
656 A = tY * tXX - tX * tXY;
657 B = tN * tXY - tX * tY;
658 D = tN * tXX - tX * tX;
659 R = (A + fi * B) / D;
661 if (R > 0.f && R - offset < noise[i]) noise[i] = R - offset;
663 for ( ; i < n; i++, fi += 1.f) {
664 R = (A + fi * B) / D;
665 if (R > 0.f && R - offset < noise[i]) noise[i] = R - offset;
669 static float FLOOR1_fromdB_INV_LOOKUP[256]={
670 0.F, 8.81683e+06F, 8.27882e+06F, 7.77365e+06F,
671 7.29930e+06F, 6.85389e+06F, 6.43567e+06F, 6.04296e+06F,
672 5.67422e+06F, 5.32798e+06F, 5.00286e+06F, 4.69759e+06F,
673 4.41094e+06F, 4.14178e+06F, 3.88905e+06F, 3.65174e+06F,
674 3.42891e+06F, 3.21968e+06F, 3.02321e+06F, 2.83873e+06F,
675 2.66551e+06F, 2.50286e+06F, 2.35014e+06F, 2.20673e+06F,
676 2.07208e+06F, 1.94564e+06F, 1.82692e+06F, 1.71544e+06F,
677 1.61076e+06F, 1.51247e+06F, 1.42018e+06F, 1.33352e+06F,
678 1.25215e+06F, 1.17574e+06F, 1.10400e+06F, 1.03663e+06F,
679 973377.F, 913981.F, 858210.F, 805842.F,
680 756669.F, 710497.F, 667142.F, 626433.F,
681 588208.F, 552316.F, 518613.F, 486967.F,
682 457252.F, 429351.F, 403152.F, 378551.F,
683 355452.F, 333762.F, 313396.F, 294273.F,
684 276316.F, 259455.F, 243623.F, 228757.F,
685 214798.F, 201691.F, 189384.F, 177828.F,
686 166977.F, 156788.F, 147221.F, 138237.F,
687 129802.F, 121881.F, 114444.F, 107461.F,
688 100903.F, 94746.3F, 88964.9F, 83536.2F,
689 78438.8F, 73652.5F, 69158.2F, 64938.1F,
690 60975.6F, 57254.9F, 53761.2F, 50480.6F,
691 47400.3F, 44507.9F, 41792.0F, 39241.9F,
692 36847.3F, 34598.9F, 32487.7F, 30505.3F,
693 28643.8F, 26896.0F, 25254.8F, 23713.7F,
694 22266.7F, 20908.0F, 19632.2F, 18434.2F,
695 17309.4F, 16253.1F, 15261.4F, 14330.1F,
696 13455.7F, 12634.6F, 11863.7F, 11139.7F,
697 10460.0F, 9821.72F, 9222.39F, 8659.64F,
698 8131.23F, 7635.06F, 7169.17F, 6731.70F,
699 6320.93F, 5935.23F, 5573.06F, 5232.99F,
700 4913.67F, 4613.84F, 4332.30F, 4067.94F,
701 3819.72F, 3586.64F, 3367.78F, 3162.28F,
702 2969.31F, 2788.13F, 2617.99F, 2458.24F,
703 2308.24F, 2167.39F, 2035.14F, 1910.95F,
704 1794.35F, 1684.85F, 1582.04F, 1485.51F,
705 1394.86F, 1309.75F, 1229.83F, 1154.78F,
706 1084.32F, 1018.15F, 956.024F, 897.687F,
707 842.910F, 791.475F, 743.179F, 697.830F,
708 655.249F, 615.265F, 577.722F, 542.469F,
709 509.367F, 478.286F, 449.101F, 421.696F,
710 395.964F, 371.803F, 349.115F, 327.812F,
711 307.809F, 289.026F, 271.390F, 254.830F,
712 239.280F, 224.679F, 210.969F, 198.096F,
713 186.008F, 174.658F, 164.000F, 153.993F,
714 144.596F, 135.773F, 127.488F, 119.708F,
715 112.404F, 105.545F, 99.1046F, 93.0572F,
716 87.3788F, 82.0469F, 77.0404F, 72.3394F,
717 67.9252F, 63.7804F, 59.8885F, 56.2341F,
718 52.8027F, 49.5807F, 46.5553F, 43.7144F,
719 41.0470F, 38.5423F, 36.1904F, 33.9821F,
720 31.9085F, 29.9614F, 28.1332F, 26.4165F,
721 24.8045F, 23.2910F, 21.8697F, 20.5352F,
722 19.2822F, 18.1056F, 17.0008F, 15.9634F,
723 14.9893F, 14.0746F, 13.2158F, 12.4094F,
724 11.6522F, 10.9411F, 10.2735F, 9.64662F,
725 9.05798F, 8.50526F, 7.98626F, 7.49894F,
726 7.04135F, 6.61169F, 6.20824F, 5.82941F,
727 5.47370F, 5.13970F, 4.82607F, 4.53158F,
728 4.25507F, 3.99542F, 3.75162F, 3.52269F,
729 3.30774F, 3.10590F, 2.91638F, 2.73842F,
730 2.57132F, 2.41442F, 2.26709F, 2.12875F,
731 1.99885F, 1.87688F, 1.76236F, 1.65482F,
732 1.55384F, 1.45902F, 1.36999F, 1.28640F,
733 1.20790F, 1.13419F, 1.06499F, 1.F
736 void _vp_remove_floor(vorbis_look_psy *p,
740 int sliding_lowpass){
744 if(sliding_lowpass>n)sliding_lowpass=n;
746 for(i=0;i<sliding_lowpass;i++){
748 mdct[i]*FLOOR1_fromdB_INV_LOOKUP[codedflr[i]];
755 void _vp_noisemask(vorbis_look_psy *p,
760 float *work=alloca(n*sizeof(*work));
762 bark_noise_hybridmp(n,p->bark,logmdct,logmask,
765 for(i=0;i<n;i++)work[i]=logmdct[i]-logmask[i];
767 bark_noise_hybridmp(n,p->bark,work,logmask,0.,
768 p->vi->noisewindowfixed);
770 for(i=0;i<n;i++)work[i]=logmdct[i]-work[i];
772 /* work[i] holds the median line (.5), logmask holds the upper
773 envelope line (1.) */
776 int dB=logmask[i]+.5;
777 if(dB>=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1;
778 logmask[i]= work[i]+p->vi->noisecompand[dB];
782 void _vp_tonemask(vorbis_look_psy *p,
785 float global_specmax,
786 float local_specmax){
790 float *seed=alloca(sizeof(*seed)*p->total_octave_lines);
791 float att=local_specmax+p->vi->ath_adjatt;
792 for(i=0;i<p->total_octave_lines;i++)seed[i]=NEGINF;
794 /* set the ATH (floating below localmax, not global max by a
796 if(att<p->vi->ath_maxatt)att=p->vi->ath_maxatt;
799 logmask[i]=p->ath[i]+att;
802 seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax);
803 max_seeds(p,seed,logmask);
807 void _vp_offset_and_mix(vorbis_look_psy *p,
813 float toneatt=p->vi->tone_masteratt[offset_select];
816 float val= noise[i]+p->noiseoffset[offset_select][i];
817 if(val>p->vi->noisemaxsupp)val=p->vi->noisemaxsupp;
818 logmask[i]=max(val,tone[i]+toneatt);
822 float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){
823 vorbis_info *vi=vd->vi;
824 codec_setup_info *ci=vi->codec_setup;
825 vorbis_info_psy_global *gi=&ci->psy_g_param;
827 int n=ci->blocksizes[vd->W]/2;
828 float secs=(float)n/vi->rate;
830 amp+=secs*gi->ampmax_att_per_sec;
831 if(amp<-9999)amp=-9999;
835 static void couple_lossless(float A, float B,
836 float *qA, float *qB){
837 int test1=fabs(*qA)>fabs(*qB);
838 test1-= fabs(*qA)<fabs(*qB);
840 if(!test1)test1=((fabs(A)>fabs(B))<<1)-1;
842 *qB=(*qA>0.f?*qA-*qB:*qB-*qA);
845 *qB=(*qB>0.f?*qA-*qB:*qB-*qA);
849 if(*qB>fabs(*qA)*1.9999f){
855 static float hypot_lookup[32]={
856 -0.009935, -0.011245, -0.012726, -0.014397,
857 -0.016282, -0.018407, -0.020800, -0.023494,
858 -0.026522, -0.029923, -0.033737, -0.038010,
859 -0.042787, -0.048121, -0.054064, -0.060671,
860 -0.068000, -0.076109, -0.085054, -0.094892,
861 -0.105675, -0.117451, -0.130260, -0.144134,
862 -0.159093, -0.175146, -0.192286, -0.210490,
863 -0.229718, -0.249913, -0.271001, -0.292893};
865 static void precomputed_couple_point(float premag,
866 int floorA,int floorB,
867 float *mag, float *ang){
869 int test=(floorA>floorB)-1;
870 int offset=31-abs(floorA-floorB);
871 float floormag=hypot_lookup[((offset<0)-1)&offset]+1.f;
873 floormag*=FLOOR1_fromdB_INV_LOOKUP[(floorB&test)|(floorA&(~test))];
875 *mag=premag*floormag;
879 /* just like below, this is currently set up to only do
880 single-step-depth coupling. Otherwise, we'd have to do more
881 copying (which will be inevitable later) */
883 /* doing the real circular magnitude calculation is audibly superior
885 static float cardoid_hypot(float a, float b){
887 if(b>0.)return sqrt(a*a+b*b);
888 if(a>-b)return sqrt(a*a-b*b);
889 return -sqrt(b*b-a*a);
891 if(b<0.)return -sqrt(a*a+b*b);
892 if(-a>b)return -sqrt(a*a-b*b);
893 return sqrt(b*b-a*a);
896 float **_vp_quantize_couple_memo(vorbis_block *vb,
898 vorbis_info_mapping0 *vi,
902 float **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
904 for(i=0;i<vi->coupling_steps;i++){
905 float *mdctM=mdct[vi->coupling_mag[i]];
906 float *mdctA=mdct[vi->coupling_ang[i]];
907 ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
909 ret[i][j]=cardoid_hypot(mdctM[j],mdctA[j]);
915 /* this is for per-channel noise normalization */
916 static int apsort(const void *a, const void *b){
917 if(fabs(**(float **)a)>fabs(**(float **)b))return -1;
921 int **_vp_quantize_couple_sort(vorbis_block *vb,
923 vorbis_info_mapping0 *vi,
927 if(p->vi->normal_point_p){
929 int **ret=_vorbis_block_alloc(vb,vi->coupling_steps*sizeof(*ret));
930 int partition=p->vi->normal_partition;
931 float **work=alloca(sizeof(*work)*partition);
933 for(i=0;i<vi->coupling_steps;i++){
934 ret[i]=_vorbis_block_alloc(vb,n*sizeof(**ret));
936 for(j=0;j<n;j+=partition){
937 for(k=0;k<partition;k++)work[k]=mags[i]+k+j;
938 qsort(work,partition,sizeof(*work),apsort);
939 for(k=0;k<partition;k++)ret[i][k+j]=work[k]-mags[i];
947 void _vp_noise_normalize_sort(vorbis_look_psy *p,
948 float *magnitudes,int *sortedindex){
950 vorbis_info_psy *vi=p->vi;
951 int partition=vi->normal_partition;
952 float **work=alloca(sizeof(*work)*partition);
953 int start=vi->normal_start;
955 for(j=start;j<n;j+=partition){
956 if(j+partition>n)partition=n-j;
957 for(i=0;i<partition;i++)work[i]=magnitudes+i+j;
958 qsort(work,partition,sizeof(*work),apsort);
959 for(i=0;i<partition;i++){
960 sortedindex[i+j-start]=work[i]-magnitudes;
966 void _vp_noise_normalize(vorbis_look_psy *p,
967 float *in,float *out,int *sortedindex){
968 int flag=0,i,j=0,n=p->n;
969 vorbis_info_psy *vi=p->vi;
970 int partition=vi->normal_partition;
971 int start=vi->normal_start;
975 if(vi->normal_channel_p){
979 for(;j+partition<=n;j+=partition){
983 for(i=j;i<j+partition;i++)
986 for(i=0;i<partition;i++){
987 k=sortedindex[i+j-start];
989 if(in[k]*in[k]>=.25f){
994 if(acc<vi->normal_thresh)break;
995 out[k]=unitnorm(in[k]);
1000 //if(!flag && i<3)i=0;
1001 for(;i<partition;i++){
1002 k=sortedindex[i+j-start];
1013 void _vp_couple(int blobno,
1014 vorbis_info_psy_global *g,
1016 vorbis_info_mapping0 *vi,
1022 int sliding_lowpass){
1026 /* perform any requested channel coupling */
1027 /* point stereo can only be used in a first stage (in this encoder)
1028 because of the dependency on floor lookups */
1029 for(i=0;i<vi->coupling_steps;i++){
1031 /* once we're doing multistage coupling in which a channel goes
1032 through more than one coupling step, the floor vector
1033 magnitudes will also have to be recalculated an propogated
1034 along with PCM. Right now, we're not (that will wait until 5.1
1035 most likely), so the code isn't here yet. The memory management
1036 here is all assuming single depth couplings anyway. */
1038 /* make sure coupling a zero and a nonzero channel results in two
1039 nonzero channels. */
1040 if(nonzero[vi->coupling_mag[i]] ||
1041 nonzero[vi->coupling_ang[i]]){
1044 float *rM=res[vi->coupling_mag[i]];
1045 float *rA=res[vi->coupling_ang[i]];
1048 int *floorM=ifloor[vi->coupling_mag[i]];
1049 int *floorA=ifloor[vi->coupling_ang[i]];
1050 float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]];
1051 float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]];
1052 int partition=(p->vi->normal_point_p?p->vi->normal_partition:p->n);
1053 int limit=g->coupling_pointlimit[p->vi->blockflag][blobno];
1054 int pointlimit=limit;
1056 nonzero[vi->coupling_mag[i]]=1;
1057 nonzero[vi->coupling_ang[i]]=1;
1059 for(j=0;j<p->n;j+=partition){
1062 for(k=0;k<partition;k++){
1065 if(l<sliding_lowpass){
1066 if((l>=limit && fabs(rM[l])<postpoint && fabs(rA[l])<postpoint) ||
1067 (fabs(rM[l])<prepoint && fabs(rA[l])<prepoint)){
1068 precomputed_couple_point(mag_memo[i][l],
1069 floorM[l],floorA[l],
1071 if(rint(qM[l])==0.f)acc+=qM[l]*qM[l];
1073 couple_lossless(rM[l],rA[l],qM+l,qA+l);
1081 if(p->vi->normal_point_p){
1082 for(k=0;k<partition && acc>=p->vi->normal_thresh;k++){
1083 int l=mag_sort[i][j+k];
1084 if(l<sliding_lowpass && l>=pointlimit && rint(qM[l])==0.f){
1085 qM[l]=unitnorm(qM[l]);