annotate src/libvorbis-1.3.3/lib/psytune.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 05aa0afa9217
children
rev   line source
Chris@1 1 /********************************************************************
Chris@1 2 * *
Chris@1 3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
Chris@1 4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
Chris@1 5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
Chris@1 6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
Chris@1 7 * *
Chris@1 8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
Chris@1 9 * by the Xiph.Org Foundation http://www.xiph.org/ *
Chris@1 10 * *
Chris@1 11 ********************************************************************
Chris@1 12
Chris@1 13 function: simple utility that runs audio through the psychoacoustics
Chris@1 14 without encoding
Chris@1 15 last mod: $Id: psytune.c 16037 2009-05-26 21:10:58Z xiphmont $
Chris@1 16
Chris@1 17 ********************************************************************/
Chris@1 18
Chris@1 19 /* NB: this is dead code, retained purely for doc and reference value
Chris@1 20 don't try to compile it */
Chris@1 21
Chris@1 22 #include <stdio.h>
Chris@1 23 #include <stdlib.h>
Chris@1 24 #include <string.h>
Chris@1 25 #include <math.h>
Chris@1 26
Chris@1 27 #include "vorbis/codec.h"
Chris@1 28 #include "codec_internal.h"
Chris@1 29 #include "os.h"
Chris@1 30 #include "misc.h"
Chris@1 31 #include "psy.h"
Chris@1 32 #include "mdct.h"
Chris@1 33 #include "smallft.h"
Chris@1 34 #include "window.h"
Chris@1 35 #include "scales.h"
Chris@1 36 #include "lpc.h"
Chris@1 37 #include "lsp.h"
Chris@1 38 #include "masking.h"
Chris@1 39 #include "registry.h"
Chris@1 40
Chris@1 41 static vorbis_info_psy_global _psy_set0G={
Chris@1 42 0, /* decaydBpms */
Chris@1 43 8, /* lines per eighth octave */
Chris@1 44
Chris@1 45 /* thresh sample period, preecho clamp trigger threshhold, range, minenergy */
Chris@1 46 256, {26.f,26.f,26.f,30.f}, {-90.f,-90.f,-90.f,-90.f}, -90.f,
Chris@1 47 -6.f,
Chris@1 48
Chris@1 49 0,
Chris@1 50
Chris@1 51 0.,
Chris@1 52 0.,
Chris@1 53 };
Chris@1 54
Chris@1 55 static vp_part _vp_part0[]={
Chris@1 56 { 1,9e10f, 9e10f, 1.f,9999.f},
Chris@1 57 { 9999, .75f, 9e10f, .5f,9999.f},
Chris@1 58 /*{ 9999, 1.5f, 9e10f, .5f,9999.f},*/
Chris@1 59 { 18,9e10f, 9e10f, .5f, 30.f},
Chris@1 60 { 9999,9e10f, 9e10f, .5f, 30.f}
Chris@1 61 };
Chris@1 62
Chris@1 63 static vp_couple _vp_couple0[]={
Chris@1 64 { 1, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}},
Chris@1 65 { 18, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}},
Chris@1 66 { 9999, {9e10f,9e10f,0}, { 0.f, 9e10f,0}, { 0.f,22.f,1}, {0.f,0.f,0}}
Chris@1 67 };
Chris@1 68
Chris@1 69 static vorbis_info_psy _psy_set0={
Chris@1 70 ATH_Bark_dB_lineaggressive,
Chris@1 71
Chris@1 72 -100.f,
Chris@1 73 -140.f,
Chris@1 74 6.f, /* floor master att */
Chris@1 75
Chris@1 76 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */
Chris@1 77 /* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */
Chris@1 78 /* y: 0 10 20 30 40 50 60 70 80 90 100 dB */
Chris@1 79 1, /* tonemaskp */
Chris@1 80 0.f, /* tone master att */
Chris@1 81 /* 0 10 20 30 40 50 60 70 80 90 100 */
Chris@1 82 {
Chris@1 83 {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*63*/
Chris@1 84 {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*88*/
Chris@1 85 {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*125*/
Chris@1 86
Chris@1 87 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*175*/
Chris@1 88 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*250*/
Chris@1 89 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*350*/
Chris@1 90 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*500*/
Chris@1 91 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*700*/
Chris@1 92 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1000*/
Chris@1 93 {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1400*/
Chris@1 94 {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2000*/
Chris@1 95 {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2800*/
Chris@1 96 {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*4000*/
Chris@1 97
Chris@1 98 {-30.f,-35.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*5600*/
Chris@1 99
Chris@1 100 {-30.f,-30.f,-33.f,-35.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*8000*/
Chris@1 101 {-30.f,-30.f,-33.f,-35.f,-40.f,-45.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*11500*/
Chris@1 102 {-24.f,-24.f,-26.f,-32.f,-32.f,-42.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*16000*/
Chris@1 103
Chris@1 104 },
Chris@1 105
Chris@1 106 1,/* peakattp */
Chris@1 107 {{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*63*/
Chris@1 108 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*88*/
Chris@1 109 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*125*/
Chris@1 110 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*175*/
Chris@1 111 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*250*/
Chris@1 112 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*350*/
Chris@1 113 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*500*/
Chris@1 114 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*700*/
Chris@1 115 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1000*/
Chris@1 116 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1400*/
Chris@1 117 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2000*/
Chris@1 118 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2800*/
Chris@1 119 {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*4000*/
Chris@1 120 {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*5600*/
Chris@1 121 {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*8000*/
Chris@1 122 {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*11500*/
Chris@1 123 {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*16000*/
Chris@1 124 },
Chris@1 125
Chris@1 126 1,/*noisemaskp */
Chris@1 127 -10.f, /* suppress any noise curve over maxspec+n */
Chris@1 128 .5f, /* low window */
Chris@1 129 .5f, /* high window */
Chris@1 130 10,
Chris@1 131 10,
Chris@1 132 25,
Chris@1 133 {.000f, 0.f, /*63*/
Chris@1 134 .000f, 0.f, /*88*/
Chris@1 135 .000f, 0.f, /*125*/
Chris@1 136 .000f, 0.f, /*175*/
Chris@1 137 .000f, 0.f, /*250*/
Chris@1 138 .000f, 0.f, /*350*/
Chris@1 139 .000f, 0.f, /*500*/
Chris@1 140 .000f, 0.f, /*700*/
Chris@1 141 .000f, 0.f, /*1000*/
Chris@1 142 .300f, 0.f, /*1400*/
Chris@1 143 .300f, 0.f, /*2000*/
Chris@1 144 .300f, 0.f, /*2800*/
Chris@1 145 .500f, 0.f, /*4000*/
Chris@1 146 .700f, 0.f, /*5600*/
Chris@1 147 .850f, 0.f, /*8000*/
Chris@1 148 .900f, 0.f, /*11500*/
Chris@1 149 .900f, 1.f, /*16000*/
Chris@1 150 },
Chris@1 151
Chris@1 152 95.f, /* even decade + 5 is important; saves an rint() later in a
Chris@1 153 tight loop) */
Chris@1 154 -44.,
Chris@1 155
Chris@1 156 32,
Chris@1 157 _vp_part0,_vp_couple0
Chris@1 158 };
Chris@1 159
Chris@1 160 static vorbis_info_floor1 _floor_set0={1,
Chris@1 161 {0},
Chris@1 162
Chris@1 163 {32},
Chris@1 164 {0},
Chris@1 165 {0},
Chris@1 166 {{-1}},
Chris@1 167
Chris@1 168 2,
Chris@1 169 {0,1024,
Chris@1 170
Chris@1 171 88,31,243,
Chris@1 172
Chris@1 173 14,54,143,460,
Chris@1 174
Chris@1 175 6,3,10, 22,18,26, 41,36,47,
Chris@1 176 69,61,78, 112,99,126, 185,162,211,
Chris@1 177 329,282,387, 672,553,825
Chris@1 178 },
Chris@1 179
Chris@1 180 60,30,400,
Chris@1 181 20,8,1,18.,
Chris@1 182 20,600,
Chris@1 183 960};
Chris@1 184
Chris@1 185
Chris@1 186 static vorbis_info_mapping0 mapping_info={1,{0,1},{0},{0},{0},0, 1, {0},{1}};
Chris@1 187 static codec_setup_info codec_setup0={ {0,0},
Chris@1 188 1,1,1,1,1,0,1,
Chris@1 189 {NULL},
Chris@1 190 {0},{&mapping_info},
Chris@1 191 {0},{NULL},
Chris@1 192 {1},{&_floor_set0},
Chris@1 193 {2},{NULL},
Chris@1 194 {NULL},
Chris@1 195 {&_psy_set0},
Chris@1 196 &_psy_set0G};
Chris@1 197
Chris@1 198 static int noisy=0;
Chris@1 199 void analysis(char *base,int i,float *v,int n,int bark,int dB){
Chris@1 200 if(noisy){
Chris@1 201 int j;
Chris@1 202 FILE *of;
Chris@1 203 char buffer[80];
Chris@1 204 sprintf(buffer,"%s_%d.m",base,i);
Chris@1 205 of=fopen(buffer,"w");
Chris@1 206
Chris@1 207 for(j=0;j<n;j++){
Chris@1 208 if(dB && v[j]==0)
Chris@1 209 fprintf(of,"\n\n");
Chris@1 210 else{
Chris@1 211 if(bark)
Chris@1 212 fprintf(of,"%g ",toBARK(22050.f*j/n));
Chris@1 213 else
Chris@1 214 fprintf(of,"%g ",(float)j);
Chris@1 215
Chris@1 216 if(dB){
Chris@1 217 fprintf(of,"%g\n",todB(v+j));
Chris@1 218 }else{
Chris@1 219 fprintf(of,"%g\n",v[j]);
Chris@1 220 }
Chris@1 221 }
Chris@1 222 }
Chris@1 223 fclose(of);
Chris@1 224 }
Chris@1 225 }
Chris@1 226
Chris@1 227 long frameno=0;
Chris@1 228
Chris@1 229 /****************************************************************/
Chris@1 230
Chris@1 231 int main(int argc,char *argv[]){
Chris@1 232 int eos=0;
Chris@1 233 float nonz=0.f;
Chris@1 234 float acc=0.f;
Chris@1 235 float tot=0.f;
Chris@1 236 float ampmax=-9999,newmax;
Chris@1 237 float local_ampmax[2];
Chris@1 238
Chris@1 239 int framesize=2048;
Chris@1 240 float ampmax_att_per_sec=-6.;
Chris@1 241
Chris@1 242 float *pcm[2],*out[2],*window,*flr[2],*mask[2],*work[2];
Chris@1 243 signed char *buffer,*buffer2;
Chris@1 244 mdct_lookup m_look;
Chris@1 245 drft_lookup f_look;
Chris@1 246 vorbis_look_psy p_look;
Chris@1 247 vorbis_look_psy_global *pg_look;
Chris@1 248 vorbis_look_floor *floor_look;
Chris@1 249 vorbis_info vi;
Chris@1 250 long i,j,k;
Chris@1 251
Chris@1 252 int ath=0;
Chris@1 253 int decayp=0;
Chris@1 254
Chris@1 255 argv++;
Chris@1 256 while(*argv){
Chris@1 257 if(*argv[0]=='-'){
Chris@1 258 /* option */
Chris@1 259 if(argv[0][1]=='v'){
Chris@1 260 noisy=0;
Chris@1 261 }
Chris@1 262 }else
Chris@1 263 if(*argv[0]=='+'){
Chris@1 264 /* option */
Chris@1 265 if(argv[0][1]=='v'){
Chris@1 266 noisy=1;
Chris@1 267 }
Chris@1 268 }else
Chris@1 269 framesize=atoi(argv[0]);
Chris@1 270 argv++;
Chris@1 271 }
Chris@1 272
Chris@1 273 vi.channels=2;
Chris@1 274 vi.codec_setup=&codec_setup0;
Chris@1 275
Chris@1 276 pcm[0]=_ogg_malloc(framesize*sizeof(float));
Chris@1 277 pcm[1]=_ogg_malloc(framesize*sizeof(float));
Chris@1 278 out[0]=_ogg_calloc(framesize/2,sizeof(float));
Chris@1 279 out[1]=_ogg_calloc(framesize/2,sizeof(float));
Chris@1 280 work[0]=_ogg_calloc(framesize,sizeof(float));
Chris@1 281 work[1]=_ogg_calloc(framesize,sizeof(float));
Chris@1 282 flr[0]=_ogg_calloc(framesize/2,sizeof(float));
Chris@1 283 flr[1]=_ogg_calloc(framesize/2,sizeof(float));
Chris@1 284 buffer=_ogg_malloc(framesize*4);
Chris@1 285 buffer2=buffer+framesize*2;
Chris@1 286 window=_vorbis_window_create(0,framesize,framesize/2,framesize/2);
Chris@1 287 mdct_init(&m_look,framesize);
Chris@1 288 drft_init(&f_look,framesize);
Chris@1 289 _vp_psy_init(&p_look,&_psy_set0,&_psy_set0G,framesize/2,44100);
Chris@1 290 pg_look=_vp_global_look(&vi);
Chris@1 291 floor_look=_floor_P[1]->look(NULL,NULL,&_floor_set0);
Chris@1 292
Chris@1 293 /* we cheat on the WAV header; we just bypass 44 bytes and never
Chris@1 294 verify that it matches 16bit/stereo/44.1kHz. */
Chris@1 295
Chris@1 296 fread(buffer,1,44,stdin);
Chris@1 297 fwrite(buffer,1,44,stdout);
Chris@1 298 memset(buffer,0,framesize*2);
Chris@1 299
Chris@1 300 analysis("window",0,window,framesize,0,0);
Chris@1 301
Chris@1 302 fprintf(stderr,"Processing for frame size %d...\n",framesize);
Chris@1 303
Chris@1 304 while(!eos){
Chris@1 305 long bytes=fread(buffer2,1,framesize*2,stdin);
Chris@1 306 if(bytes<framesize*2)
Chris@1 307 memset(buffer2+bytes,0,framesize*2-bytes);
Chris@1 308
Chris@1 309 if(bytes!=0){
Chris@1 310 int nonzero[2];
Chris@1 311
Chris@1 312 /* uninterleave samples */
Chris@1 313 for(i=0;i<framesize;i++){
Chris@1 314 pcm[0][i]=((buffer[i*4+1]<<8)|
Chris@1 315 (0x00ff&(int)buffer[i*4]))/32768.f;
Chris@1 316 pcm[1][i]=((buffer[i*4+3]<<8)|
Chris@1 317 (0x00ff&(int)buffer[i*4+2]))/32768.f;
Chris@1 318 }
Chris@1 319
Chris@1 320 {
Chris@1 321 float secs=framesize/44100.;
Chris@1 322
Chris@1 323 ampmax+=secs*ampmax_att_per_sec;
Chris@1 324 if(ampmax<-9999)ampmax=-9999;
Chris@1 325 }
Chris@1 326
Chris@1 327 for(i=0;i<2;i++){
Chris@1 328 float scale=4.f/framesize;
Chris@1 329 float *fft=work[i];
Chris@1 330 float *mdct=pcm[i];
Chris@1 331 float *logmdct=mdct+framesize/2;
Chris@1 332
Chris@1 333 analysis("pre",frameno+i,pcm[i],framesize,0,0);
Chris@1 334
Chris@1 335 /* fft and mdct transforms */
Chris@1 336 for(j=0;j<framesize;j++)
Chris@1 337 fft[j]=pcm[i][j]*=window[j];
Chris@1 338
Chris@1 339 drft_forward(&f_look,fft);
Chris@1 340
Chris@1 341 local_ampmax[i]=-9999.f;
Chris@1 342 fft[0]*=scale;
Chris@1 343 fft[0]=todB(fft);
Chris@1 344 for(j=1;j<framesize-1;j+=2){
Chris@1 345 float temp=scale*FAST_HYPOT(fft[j],fft[j+1]);
Chris@1 346 temp=fft[(j+1)>>1]=todB(&temp);
Chris@1 347 if(temp>local_ampmax[i])local_ampmax[i]=temp;
Chris@1 348 }
Chris@1 349 if(local_ampmax[i]>ampmax)ampmax=local_ampmax[i];
Chris@1 350
Chris@1 351 mdct_forward(&m_look,pcm[i],mdct);
Chris@1 352 for(j=0;j<framesize/2;j++)
Chris@1 353 logmdct[j]=todB(mdct+j);
Chris@1 354
Chris@1 355 analysis("mdct",frameno+i,logmdct,framesize/2,1,0);
Chris@1 356 analysis("fft",frameno+i,fft,framesize/2,1,0);
Chris@1 357 }
Chris@1 358
Chris@1 359 for(i=0;i<2;i++){
Chris@1 360 float amp;
Chris@1 361 float *fft=work[i];
Chris@1 362 float *logmax=fft;
Chris@1 363 float *mdct=pcm[i];
Chris@1 364 float *logmdct=mdct+framesize/2;
Chris@1 365 float *mask=fft+framesize/2;
Chris@1 366
Chris@1 367 /* floor psychoacoustics */
Chris@1 368 _vp_compute_mask(&p_look,
Chris@1 369 pg_look,
Chris@1 370 i,
Chris@1 371 fft,
Chris@1 372 logmdct,
Chris@1 373 mask,
Chris@1 374 ampmax,
Chris@1 375 local_ampmax[i],
Chris@1 376 framesize/2);
Chris@1 377
Chris@1 378 analysis("mask",frameno+i,mask,framesize/2,1,0);
Chris@1 379
Chris@1 380 {
Chris@1 381 vorbis_block vb;
Chris@1 382 vorbis_dsp_state vd;
Chris@1 383 memset(&vd,0,sizeof(vd));
Chris@1 384 vd.vi=&vi;
Chris@1 385 vb.vd=&vd;
Chris@1 386 vb.pcmend=framesize;
Chris@1 387
Chris@1 388 /* floor quantization/application */
Chris@1 389 nonzero[i]=_floor_P[1]->forward(&vb,floor_look,
Chris@1 390 mdct,
Chris@1 391 logmdct,
Chris@1 392 mask,
Chris@1 393 logmax,
Chris@1 394
Chris@1 395 flr[i]);
Chris@1 396 }
Chris@1 397
Chris@1 398 _vp_remove_floor(&p_look,
Chris@1 399 pg_look,
Chris@1 400 logmdct,
Chris@1 401 mdct,
Chris@1 402 flr[i],
Chris@1 403 pcm[i],
Chris@1 404 local_ampmax[i]);
Chris@1 405
Chris@1 406 for(j=0;j<framesize/2;j++)
Chris@1 407 if(fabs(pcm[i][j])>1500)
Chris@1 408 fprintf(stderr,"%ld ",frameno+i);
Chris@1 409
Chris@1 410 analysis("res",frameno+i,pcm[i],framesize/2,1,0);
Chris@1 411 analysis("codedflr",frameno+i,flr[i],framesize/2,1,1);
Chris@1 412 }
Chris@1 413
Chris@1 414 /* residue prequantization */
Chris@1 415 _vp_partition_prequant(&p_look,
Chris@1 416 &vi,
Chris@1 417 pcm,
Chris@1 418 nonzero);
Chris@1 419
Chris@1 420 for(i=0;i<2;i++)
Chris@1 421 analysis("quant",frameno+i,pcm[i],framesize/2,1,0);
Chris@1 422
Chris@1 423 /* channel coupling / stereo quantization */
Chris@1 424
Chris@1 425 _vp_couple(&p_look,
Chris@1 426 &mapping_info,
Chris@1 427 pcm,
Chris@1 428 nonzero);
Chris@1 429
Chris@1 430 for(i=0;i<2;i++)
Chris@1 431 analysis("coupled",frameno+i,pcm[i],framesize/2,1,0);
Chris@1 432
Chris@1 433 /* decoupling */
Chris@1 434 for(i=mapping_info.coupling_steps-1;i>=0;i--){
Chris@1 435 float *pcmM=pcm[mapping_info.coupling_mag[i]];
Chris@1 436 float *pcmA=pcm[mapping_info.coupling_ang[i]];
Chris@1 437
Chris@1 438 for(j=0;j<framesize/2;j++){
Chris@1 439 float mag=pcmM[j];
Chris@1 440 float ang=pcmA[j];
Chris@1 441
Chris@1 442 if(mag>0)
Chris@1 443 if(ang>0){
Chris@1 444 pcmM[j]=mag;
Chris@1 445 pcmA[j]=mag-ang;
Chris@1 446 }else{
Chris@1 447 pcmA[j]=mag;
Chris@1 448 pcmM[j]=mag+ang;
Chris@1 449 }
Chris@1 450 else
Chris@1 451 if(ang>0){
Chris@1 452 pcmM[j]=mag;
Chris@1 453 pcmA[j]=mag+ang;
Chris@1 454 }else{
Chris@1 455 pcmA[j]=mag;
Chris@1 456 pcmM[j]=mag-ang;
Chris@1 457 }
Chris@1 458 }
Chris@1 459 }
Chris@1 460
Chris@1 461 for(i=0;i<2;i++)
Chris@1 462 analysis("decoupled",frameno+i,pcm[i],framesize/2,1,0);
Chris@1 463
Chris@1 464 for(i=0;i<2;i++){
Chris@1 465 float amp;
Chris@1 466
Chris@1 467 for(j=0;j<framesize/2;j++)
Chris@1 468 pcm[i][j]*=flr[i][j];
Chris@1 469
Chris@1 470 analysis("final",frameno+i,pcm[i],framesize/2,1,1);
Chris@1 471
Chris@1 472 /* take it back to time */
Chris@1 473 mdct_backward(&m_look,pcm[i],pcm[i]);
Chris@1 474
Chris@1 475 for(j=0;j<framesize/2;j++)
Chris@1 476 out[i][j]+=pcm[i][j]*window[j];
Chris@1 477
Chris@1 478 analysis("out",frameno+i,out[i],framesize/2,0,0);
Chris@1 479
Chris@1 480
Chris@1 481 }
Chris@1 482
Chris@1 483 /* write data. Use the part of buffer we're about to shift out */
Chris@1 484 for(i=0;i<2;i++){
Chris@1 485 char *ptr=buffer+i*2;
Chris@1 486 float *mono=out[i];
Chris@1 487 int flag=0;
Chris@1 488 for(j=0;j<framesize/2;j++){
Chris@1 489 int val=mono[j]*32767.;
Chris@1 490 /* might as well guard against clipping */
Chris@1 491 if(val>32767){
Chris@1 492 if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i);
Chris@1 493 flag=1;
Chris@1 494 val=32767;
Chris@1 495 }
Chris@1 496 if(val<-32768){
Chris@1 497 if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i);
Chris@1 498 flag=1;
Chris@1 499 val=-32768;
Chris@1 500 }
Chris@1 501 ptr[0]=val&0xff;
Chris@1 502 ptr[1]=(val>>8)&0xff;
Chris@1 503 ptr+=4;
Chris@1 504 }
Chris@1 505 }
Chris@1 506
Chris@1 507 fprintf(stderr,"*");
Chris@1 508 fwrite(buffer,1,framesize*2,stdout);
Chris@1 509 memmove(buffer,buffer2,framesize*2);
Chris@1 510
Chris@1 511 for(i=0;i<2;i++){
Chris@1 512 for(j=0,k=framesize/2;j<framesize/2;j++,k++)
Chris@1 513 out[i][j]=pcm[i][k]*window[k];
Chris@1 514 }
Chris@1 515 frameno+=2;
Chris@1 516 }else
Chris@1 517 eos=1;
Chris@1 518 }
Chris@1 519 fprintf(stderr,"average raw bits of entropy: %.03g/sample\n",acc/tot);
Chris@1 520 fprintf(stderr,"average nonzero samples: %.03g/%d\n",nonz/tot*framesize/2,
Chris@1 521 framesize/2);
Chris@1 522 fprintf(stderr,"Done\n\n");
Chris@1 523 return 0;
Chris@1 524 }