cannam@86: /******************************************************************** cannam@86: * * cannam@86: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * cannam@86: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * cannam@86: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * cannam@86: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * cannam@86: * * cannam@86: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * cannam@86: * by the Xiph.Org Foundation http://www.xiph.org/ * cannam@86: * * cannam@86: ******************************************************************** cannam@86: cannam@86: function: simple utility that runs audio through the psychoacoustics cannam@86: without encoding cannam@86: last mod: $Id: psytune.c 16037 2009-05-26 21:10:58Z xiphmont $ cannam@86: cannam@86: ********************************************************************/ cannam@86: cannam@86: /* NB: this is dead code, retained purely for doc and reference value cannam@86: don't try to compile it */ cannam@86: cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: cannam@86: #include "vorbis/codec.h" cannam@86: #include "codec_internal.h" cannam@86: #include "os.h" cannam@86: #include "misc.h" cannam@86: #include "psy.h" cannam@86: #include "mdct.h" cannam@86: #include "smallft.h" cannam@86: #include "window.h" cannam@86: #include "scales.h" cannam@86: #include "lpc.h" cannam@86: #include "lsp.h" cannam@86: #include "masking.h" cannam@86: #include "registry.h" cannam@86: cannam@86: static vorbis_info_psy_global _psy_set0G={ cannam@86: 0, /* decaydBpms */ cannam@86: 8, /* lines per eighth octave */ cannam@86: cannam@86: /* thresh sample period, preecho clamp trigger threshhold, range, minenergy */ cannam@86: 256, {26.f,26.f,26.f,30.f}, {-90.f,-90.f,-90.f,-90.f}, -90.f, cannam@86: -6.f, cannam@86: cannam@86: 0, cannam@86: cannam@86: 0., cannam@86: 0., cannam@86: }; cannam@86: cannam@86: static vp_part _vp_part0[]={ cannam@86: { 1,9e10f, 9e10f, 1.f,9999.f}, cannam@86: { 9999, .75f, 9e10f, .5f,9999.f}, cannam@86: /*{ 9999, 1.5f, 9e10f, .5f,9999.f},*/ cannam@86: { 18,9e10f, 9e10f, .5f, 30.f}, cannam@86: { 9999,9e10f, 9e10f, .5f, 30.f} cannam@86: }; cannam@86: cannam@86: static vp_couple _vp_couple0[]={ cannam@86: { 1, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, cannam@86: { 18, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, cannam@86: { 9999, {9e10f,9e10f,0}, { 0.f, 9e10f,0}, { 0.f,22.f,1}, {0.f,0.f,0}} cannam@86: }; cannam@86: cannam@86: static vorbis_info_psy _psy_set0={ cannam@86: ATH_Bark_dB_lineaggressive, cannam@86: cannam@86: -100.f, cannam@86: -140.f, cannam@86: 6.f, /* floor master att */ cannam@86: cannam@86: /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ cannam@86: /* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */ cannam@86: /* y: 0 10 20 30 40 50 60 70 80 90 100 dB */ cannam@86: 1, /* tonemaskp */ cannam@86: 0.f, /* tone master att */ cannam@86: /* 0 10 20 30 40 50 60 70 80 90 100 */ cannam@86: { cannam@86: {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*63*/ cannam@86: {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*88*/ cannam@86: {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*125*/ cannam@86: cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*175*/ cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*250*/ cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*350*/ cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*500*/ cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*700*/ cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1000*/ cannam@86: {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1400*/ cannam@86: {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2000*/ cannam@86: {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2800*/ cannam@86: {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*4000*/ cannam@86: cannam@86: {-30.f,-35.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*5600*/ cannam@86: cannam@86: {-30.f,-30.f,-33.f,-35.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*8000*/ cannam@86: {-30.f,-30.f,-33.f,-35.f,-40.f,-45.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*11500*/ cannam@86: {-24.f,-24.f,-26.f,-32.f,-32.f,-42.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*16000*/ cannam@86: cannam@86: }, cannam@86: cannam@86: 1,/* peakattp */ cannam@86: {{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*63*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*88*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*125*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*175*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*250*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*350*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*500*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*700*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1000*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1400*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2000*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2800*/ cannam@86: {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*4000*/ cannam@86: {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*5600*/ cannam@86: {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*8000*/ cannam@86: {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*11500*/ cannam@86: {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*16000*/ cannam@86: }, cannam@86: cannam@86: 1,/*noisemaskp */ cannam@86: -10.f, /* suppress any noise curve over maxspec+n */ cannam@86: .5f, /* low window */ cannam@86: .5f, /* high window */ cannam@86: 10, cannam@86: 10, cannam@86: 25, cannam@86: {.000f, 0.f, /*63*/ cannam@86: .000f, 0.f, /*88*/ cannam@86: .000f, 0.f, /*125*/ cannam@86: .000f, 0.f, /*175*/ cannam@86: .000f, 0.f, /*250*/ cannam@86: .000f, 0.f, /*350*/ cannam@86: .000f, 0.f, /*500*/ cannam@86: .000f, 0.f, /*700*/ cannam@86: .000f, 0.f, /*1000*/ cannam@86: .300f, 0.f, /*1400*/ cannam@86: .300f, 0.f, /*2000*/ cannam@86: .300f, 0.f, /*2800*/ cannam@86: .500f, 0.f, /*4000*/ cannam@86: .700f, 0.f, /*5600*/ cannam@86: .850f, 0.f, /*8000*/ cannam@86: .900f, 0.f, /*11500*/ cannam@86: .900f, 1.f, /*16000*/ cannam@86: }, cannam@86: cannam@86: 95.f, /* even decade + 5 is important; saves an rint() later in a cannam@86: tight loop) */ cannam@86: -44., cannam@86: cannam@86: 32, cannam@86: _vp_part0,_vp_couple0 cannam@86: }; cannam@86: cannam@86: static vorbis_info_floor1 _floor_set0={1, cannam@86: {0}, cannam@86: cannam@86: {32}, cannam@86: {0}, cannam@86: {0}, cannam@86: {{-1}}, cannam@86: cannam@86: 2, cannam@86: {0,1024, cannam@86: cannam@86: 88,31,243, cannam@86: cannam@86: 14,54,143,460, cannam@86: cannam@86: 6,3,10, 22,18,26, 41,36,47, cannam@86: 69,61,78, 112,99,126, 185,162,211, cannam@86: 329,282,387, 672,553,825 cannam@86: }, cannam@86: cannam@86: 60,30,400, cannam@86: 20,8,1,18., cannam@86: 20,600, cannam@86: 960}; cannam@86: cannam@86: cannam@86: static vorbis_info_mapping0 mapping_info={1,{0,1},{0},{0},{0},0, 1, {0},{1}}; cannam@86: static codec_setup_info codec_setup0={ {0,0}, cannam@86: 1,1,1,1,1,0,1, cannam@86: {NULL}, cannam@86: {0},{&mapping_info}, cannam@86: {0},{NULL}, cannam@86: {1},{&_floor_set0}, cannam@86: {2},{NULL}, cannam@86: {NULL}, cannam@86: {&_psy_set0}, cannam@86: &_psy_set0G}; cannam@86: cannam@86: static int noisy=0; cannam@86: void analysis(char *base,int i,float *v,int n,int bark,int dB){ cannam@86: if(noisy){ cannam@86: int j; cannam@86: FILE *of; cannam@86: char buffer[80]; cannam@86: sprintf(buffer,"%s_%d.m",base,i); cannam@86: of=fopen(buffer,"w"); cannam@86: cannam@86: for(j=0;jlook(NULL,NULL,&_floor_set0); cannam@86: cannam@86: /* we cheat on the WAV header; we just bypass 44 bytes and never cannam@86: verify that it matches 16bit/stereo/44.1kHz. */ cannam@86: cannam@86: fread(buffer,1,44,stdin); cannam@86: fwrite(buffer,1,44,stdout); cannam@86: memset(buffer,0,framesize*2); cannam@86: cannam@86: analysis("window",0,window,framesize,0,0); cannam@86: cannam@86: fprintf(stderr,"Processing for frame size %d...\n",framesize); cannam@86: cannam@86: while(!eos){ cannam@86: long bytes=fread(buffer2,1,framesize*2,stdin); cannam@86: if(bytes>1]=todB(&temp); cannam@86: if(temp>local_ampmax[i])local_ampmax[i]=temp; cannam@86: } cannam@86: if(local_ampmax[i]>ampmax)ampmax=local_ampmax[i]; cannam@86: cannam@86: mdct_forward(&m_look,pcm[i],mdct); cannam@86: for(j=0;jforward(&vb,floor_look, cannam@86: mdct, cannam@86: logmdct, cannam@86: mask, cannam@86: logmax, cannam@86: cannam@86: flr[i]); cannam@86: } cannam@86: cannam@86: _vp_remove_floor(&p_look, cannam@86: pg_look, cannam@86: logmdct, cannam@86: mdct, cannam@86: flr[i], cannam@86: pcm[i], cannam@86: local_ampmax[i]); cannam@86: cannam@86: for(j=0;j1500) cannam@86: fprintf(stderr,"%ld ",frameno+i); cannam@86: cannam@86: analysis("res",frameno+i,pcm[i],framesize/2,1,0); cannam@86: analysis("codedflr",frameno+i,flr[i],framesize/2,1,1); cannam@86: } cannam@86: cannam@86: /* residue prequantization */ cannam@86: _vp_partition_prequant(&p_look, cannam@86: &vi, cannam@86: pcm, cannam@86: nonzero); cannam@86: cannam@86: for(i=0;i<2;i++) cannam@86: analysis("quant",frameno+i,pcm[i],framesize/2,1,0); cannam@86: cannam@86: /* channel coupling / stereo quantization */ cannam@86: cannam@86: _vp_couple(&p_look, cannam@86: &mapping_info, cannam@86: pcm, cannam@86: nonzero); cannam@86: cannam@86: for(i=0;i<2;i++) cannam@86: analysis("coupled",frameno+i,pcm[i],framesize/2,1,0); cannam@86: cannam@86: /* decoupling */ cannam@86: for(i=mapping_info.coupling_steps-1;i>=0;i--){ cannam@86: float *pcmM=pcm[mapping_info.coupling_mag[i]]; cannam@86: float *pcmA=pcm[mapping_info.coupling_ang[i]]; cannam@86: cannam@86: for(j=0;j0) cannam@86: if(ang>0){ cannam@86: pcmM[j]=mag; cannam@86: pcmA[j]=mag-ang; cannam@86: }else{ cannam@86: pcmA[j]=mag; cannam@86: pcmM[j]=mag+ang; cannam@86: } cannam@86: else cannam@86: if(ang>0){ cannam@86: pcmM[j]=mag; cannam@86: pcmA[j]=mag+ang; cannam@86: }else{ cannam@86: pcmA[j]=mag; cannam@86: pcmM[j]=mag-ang; cannam@86: } cannam@86: } cannam@86: } cannam@86: cannam@86: for(i=0;i<2;i++) cannam@86: analysis("decoupled",frameno+i,pcm[i],framesize/2,1,0); cannam@86: cannam@86: for(i=0;i<2;i++){ cannam@86: float amp; cannam@86: cannam@86: for(j=0;j32767){ cannam@86: if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); cannam@86: flag=1; cannam@86: val=32767; cannam@86: } cannam@86: if(val<-32768){ cannam@86: if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); cannam@86: flag=1; cannam@86: val=-32768; cannam@86: } cannam@86: ptr[0]=val&0xff; cannam@86: ptr[1]=(val>>8)&0xff; cannam@86: ptr+=4; cannam@86: } cannam@86: } cannam@86: cannam@86: fprintf(stderr,"*"); cannam@86: fwrite(buffer,1,framesize*2,stdout); cannam@86: memmove(buffer,buffer2,framesize*2); cannam@86: cannam@86: for(i=0;i<2;i++){ cannam@86: for(j=0,k=framesize/2;j