18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/******************************************************************** 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/ * 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ******************************************************************** 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: simple utility that runs audio through the psychoacoustics 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels without encoding 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: psytune.c 16037 2009-05-26 21:10:58Z xiphmont $ 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/ 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* NB: this is dead code, retained purely for doc and reference value 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels don't try to compile it */ 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdio.h> 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h> 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <string.h> 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h> 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "vorbis/codec.h" 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "codec_internal.h" 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "os.h" 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "misc.h" 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "psy.h" 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "mdct.h" 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "smallft.h" 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "window.h" 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "scales.h" 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "lpc.h" 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "lsp.h" 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "masking.h" 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "registry.h" 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vorbis_info_psy_global _psy_set0G={ 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 0, /* decaydBpms */ 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8, /* lines per eighth octave */ 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* thresh sample period, preecho clamp trigger threshhold, range, minenergy */ 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 256, {26.f,26.f,26.f,30.f}, {-90.f,-90.f,-90.f,-90.f}, -90.f, 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -6.f, 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 0, 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 0., 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 0., 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}; 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vp_part _vp_part0[]={ 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 1,9e10f, 9e10f, 1.f,9999.f}, 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 9999, .75f, 9e10f, .5f,9999.f}, 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/*{ 9999, 1.5f, 9e10f, .5f,9999.f},*/ 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 18,9e10f, 9e10f, .5f, 30.f}, 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 9999,9e10f, 9e10f, .5f, 30.f} 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}; 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vp_couple _vp_couple0[]={ 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 1, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 18, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 9999, {9e10f,9e10f,0}, { 0.f, 9e10f,0}, { 0.f,22.f,1}, {0.f,0.f,0}} 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}; 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vorbis_info_psy _psy_set0={ 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ATH_Bark_dB_lineaggressive, 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -100.f, 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -140.f, 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6.f, /* floor master att */ 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */ 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* y: 0 10 20 30 40 50 60 70 80 90 100 dB */ 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1, /* tonemaskp */ 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 0.f, /* tone master att */ 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* 0 10 20 30 40 50 60 70 80 90 100 */ 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*63*/ 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*88*/ 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*125*/ 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*175*/ 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*250*/ 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*350*/ 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*500*/ 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*700*/ 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1000*/ 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1400*/ 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2000*/ 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2800*/ 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*4000*/ 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-35.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*5600*/ 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-33.f,-35.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*8000*/ 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-30.f,-30.f,-33.f,-35.f,-40.f,-45.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*11500*/ 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-24.f,-24.f,-26.f,-32.f,-32.f,-42.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*16000*/ 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }, 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1,/* peakattp */ 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*63*/ 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*88*/ 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*125*/ 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*175*/ 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*250*/ 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*350*/ 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*500*/ 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*700*/ 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1000*/ 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1400*/ 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2000*/ 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2800*/ 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*4000*/ 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*5600*/ 1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*8000*/ 1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*11500*/ 1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*16000*/ 1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }, 1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1,/*noisemaskp */ 1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -10.f, /* suppress any noise curve over maxspec+n */ 1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .5f, /* low window */ 1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .5f, /* high window */ 1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10, 1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10, 1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 25, 1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {.000f, 0.f, /*63*/ 1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*88*/ 1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*125*/ 1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*175*/ 1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*250*/ 1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*350*/ 1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*500*/ 1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*700*/ 1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .000f, 0.f, /*1000*/ 1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .300f, 0.f, /*1400*/ 1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .300f, 0.f, /*2000*/ 1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .300f, 0.f, /*2800*/ 1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .500f, 0.f, /*4000*/ 1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .700f, 0.f, /*5600*/ 1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .850f, 0.f, /*8000*/ 1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .900f, 0.f, /*11500*/ 1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels .900f, 1.f, /*16000*/ 1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }, 1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 95.f, /* even decade + 5 is important; saves an rint() later in a 1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tight loop) */ 1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -44., 1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 32, 1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels _vp_part0,_vp_couple0 1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}; 1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vorbis_info_floor1 _floor_set0={1, 1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {0}, 1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {32}, 1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {0}, 1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {0}, 1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {{-1}}, 1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2, 1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {0,1024, 1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 88,31,243, 1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 14,54,143,460, 1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6,3,10, 22,18,26, 41,36,47, 1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 69,61,78, 112,99,126, 185,162,211, 1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 329,282,387, 672,553,825 1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }, 1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 60,30,400, 1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 20,8,1,18., 1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 20,600, 1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 960}; 1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic vorbis_info_mapping0 mapping_info={1,{0,1},{0},{0},{0},0, 1, {0},{1}}; 1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic codec_setup_info codec_setup0={ {0,0}, 1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1,1,1,1,1,0,1, 1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {NULL}, 1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {0},{&mapping_info}, 1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {0},{NULL}, 1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {1},{&_floor_set0}, 1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {2},{NULL}, 1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {NULL}, 1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels {&_psy_set0}, 1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels &_psy_set0G}; 1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic int noisy=0; 1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid analysis(char *base,int i,float *v,int n,int bark,int dB){ 2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(noisy){ 2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int j; 2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels FILE *of; 2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels char buffer[80]; 2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels sprintf(buffer,"%s_%d.m",base,i); 2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels of=fopen(buffer,"w"); 2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<n;j++){ 2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(dB && v[j]==0) 2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"\n\n"); 2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else{ 2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(bark) 2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%g ",toBARK(22050.f*j/n)); 2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%g ",(float)j); 2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(dB){ 2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%g\n",todB(v+j)); 2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else{ 2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(of,"%g\n",v[j]); 2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fclose(of); 2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslong frameno=0; 2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/****************************************************************/ 2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsint main(int argc,char *argv[]){ 2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int eos=0; 2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float nonz=0.f; 2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float acc=0.f; 2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float tot=0.f; 2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ampmax=-9999,newmax; 2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float local_ampmax[2]; 2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int framesize=2048; 2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ampmax_att_per_sec=-6.; 2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *pcm[2],*out[2],*window,*flr[2],*mask[2],*work[2]; 2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels signed char *buffer,*buffer2; 2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mdct_lookup m_look; 2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels drft_lookup f_look; 2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_look_psy p_look; 2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_look_psy_global *pg_look; 2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_look_floor *floor_look; 2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info vi; 2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long i,j,k; 2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ath=0; 2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int decayp=0; 2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels argv++; 2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while(*argv){ 2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(*argv[0]=='-'){ 2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* option */ 2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(argv[0][1]=='v'){ 2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels noisy=0; 2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else 2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(*argv[0]=='+'){ 2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* option */ 2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(argv[0][1]=='v'){ 2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels noisy=1; 2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else 2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels framesize=atoi(argv[0]); 2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels argv++; 2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vi.channels=2; 2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vi.codec_setup=&codec_setup0; 2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm[0]=_ogg_malloc(framesize*sizeof(float)); 2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm[1]=_ogg_malloc(framesize*sizeof(float)); 2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels out[0]=_ogg_calloc(framesize/2,sizeof(float)); 2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels out[1]=_ogg_calloc(framesize/2,sizeof(float)); 2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels work[0]=_ogg_calloc(framesize,sizeof(float)); 2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels work[1]=_ogg_calloc(framesize,sizeof(float)); 2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels flr[0]=_ogg_calloc(framesize/2,sizeof(float)); 2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels flr[1]=_ogg_calloc(framesize/2,sizeof(float)); 2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels buffer=_ogg_malloc(framesize*4); 2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels buffer2=buffer+framesize*2; 2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels window=_vorbis_window_create(0,framesize,framesize/2,framesize/2); 2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mdct_init(&m_look,framesize); 2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels drft_init(&f_look,framesize); 2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels _vp_psy_init(&p_look,&_psy_set0,&_psy_set0G,framesize/2,44100); 2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pg_look=_vp_global_look(&vi); 2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels floor_look=_floor_P[1]->look(NULL,NULL,&_floor_set0); 2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* we cheat on the WAV header; we just bypass 44 bytes and never 2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels verify that it matches 16bit/stereo/44.1kHz. */ 2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fread(buffer,1,44,stdin); 2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fwrite(buffer,1,44,stdout); 2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memset(buffer,0,framesize*2); 2998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("window",0,window,framesize,0,0); 3018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(stderr,"Processing for frame size %d...\n",framesize); 3038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while(!eos){ 3058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long bytes=fread(buffer2,1,framesize*2,stdin); 3068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(bytes<framesize*2) 3078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memset(buffer2+bytes,0,framesize*2-bytes); 3088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(bytes!=0){ 3108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int nonzero[2]; 3118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* uninterleave samples */ 3138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<framesize;i++){ 3148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm[0][i]=((buffer[i*4+1]<<8)| 3158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels (0x00ff&(int)buffer[i*4]))/32768.f; 3168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm[1][i]=((buffer[i*4+3]<<8)| 3178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels (0x00ff&(int)buffer[i*4+2]))/32768.f; 3188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 3218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float secs=framesize/44100.; 3228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ampmax+=secs*ampmax_att_per_sec; 3248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ampmax<-9999)ampmax=-9999; 3258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++){ 3288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float scale=4.f/framesize; 3298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *fft=work[i]; 3308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *mdct=pcm[i]; 3318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmdct=mdct+framesize/2; 3328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("pre",frameno+i,pcm[i],framesize,0,0); 3348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* fft and mdct transforms */ 3368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize;j++) 3378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fft[j]=pcm[i][j]*=window[j]; 3388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels drft_forward(&f_look,fft); 3408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels local_ampmax[i]=-9999.f; 3428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fft[0]*=scale; 3438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fft[0]=todB(fft); 3448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<framesize-1;j+=2){ 3458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float temp=scale*FAST_HYPOT(fft[j],fft[j+1]); 3468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels temp=fft[(j+1)>>1]=todB(&temp); 3478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(temp>local_ampmax[i])local_ampmax[i]=temp; 3488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(local_ampmax[i]>ampmax)ampmax=local_ampmax[i]; 3508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mdct_forward(&m_look,pcm[i],mdct); 3528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize/2;j++) 3538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels logmdct[j]=todB(mdct+j); 3548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("mdct",frameno+i,logmdct,framesize/2,1,0); 3568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("fft",frameno+i,fft,framesize/2,1,0); 3578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++){ 3608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float amp; 3618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *fft=work[i]; 3628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmax=fft; 3638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *mdct=pcm[i]; 3648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmdct=mdct+framesize/2; 3658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *mask=fft+framesize/2; 3668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* floor psychoacoustics */ 3688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels _vp_compute_mask(&p_look, 3698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pg_look, 3708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels i, 3718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fft, 3728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels logmdct, 3738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mask, 3748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ampmax, 3758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels local_ampmax[i], 3768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels framesize/2); 3778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("mask",frameno+i,mask,framesize/2,1,0); 3798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 3818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_block vb; 3828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_dsp_state vd; 3838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memset(&vd,0,sizeof(vd)); 3848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vd.vi=&vi; 3858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vb.vd=&vd; 3868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vb.pcmend=framesize; 3878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* floor quantization/application */ 3898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nonzero[i]=_floor_P[1]->forward(&vb,floor_look, 3908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mdct, 3918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels logmdct, 3928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mask, 3938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels logmax, 3948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels flr[i]); 3968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels _vp_remove_floor(&p_look, 3998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pg_look, 4008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels logmdct, 4018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mdct, 4028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels flr[i], 4038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm[i], 4048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels local_ampmax[i]); 4058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize/2;j++) 4078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(fabs(pcm[i][j])>1500) 4088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(stderr,"%ld ",frameno+i); 4098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("res",frameno+i,pcm[i],framesize/2,1,0); 4118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("codedflr",frameno+i,flr[i],framesize/2,1,1); 4128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* residue prequantization */ 4158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels _vp_partition_prequant(&p_look, 4168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels &vi, 4178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm, 4188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nonzero); 4198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++) 4218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("quant",frameno+i,pcm[i],framesize/2,1,0); 4228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* channel coupling / stereo quantization */ 4248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels _vp_couple(&p_look, 4268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels &mapping_info, 4278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm, 4288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nonzero); 4298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++) 4318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("coupled",frameno+i,pcm[i],framesize/2,1,0); 4328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* decoupling */ 4348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=mapping_info.coupling_steps-1;i>=0;i--){ 4358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *pcmM=pcm[mapping_info.coupling_mag[i]]; 4368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *pcmA=pcm[mapping_info.coupling_ang[i]]; 4378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize/2;j++){ 4398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float mag=pcmM[j]; 4408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ang=pcmA[j]; 4418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(mag>0) 4438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ang>0){ 4448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmM[j]=mag; 4458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmA[j]=mag-ang; 4468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else{ 4478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmA[j]=mag; 4488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmM[j]=mag+ang; 4498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 4518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ang>0){ 4528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmM[j]=mag; 4538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmA[j]=mag+ang; 4548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else{ 4558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmA[j]=mag; 4568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcmM[j]=mag-ang; 4578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++) 4628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("decoupled",frameno+i,pcm[i],framesize/2,1,0); 4638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++){ 4658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float amp; 4668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize/2;j++) 4688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pcm[i][j]*=flr[i][j]; 4698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("final",frameno+i,pcm[i],framesize/2,1,1); 4718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* take it back to time */ 4738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mdct_backward(&m_look,pcm[i],pcm[i]); 4748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize/2;j++) 4768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels out[i][j]+=pcm[i][j]*window[j]; 4778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels analysis("out",frameno+i,out[i],framesize/2,0,0); 4798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* write data. Use the part of buffer we're about to shift out */ 4848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++){ 4858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels char *ptr=buffer+i*2; 4868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *mono=out[i]; 4878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int flag=0; 4888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0;j<framesize/2;j++){ 4898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int val=mono[j]*32767.; 4908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* might as well guard against clipping */ 4918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(val>32767){ 4928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); 4938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels flag=1; 4948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels val=32767; 4958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(val<-32768){ 4978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); 4988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels flag=1; 4998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels val=-32768; 5008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ptr[0]=val&0xff; 5028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ptr[1]=(val>>8)&0xff; 5038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ptr+=4; 5048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(stderr,"*"); 5088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fwrite(buffer,1,framesize*2,stdout); 5098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memmove(buffer,buffer2,framesize*2); 5108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<2;i++){ 5128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=0,k=framesize/2;j<framesize/2;j++,k++) 5138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels out[i][j]=pcm[i][k]*window[k]; 5148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels frameno+=2; 5168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else 5178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels eos=1; 5188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(stderr,"average raw bits of entropy: %.03g/sample\n",acc/tot); 5208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(stderr,"average nonzero samples: %.03g/%d\n",nonz/tot*framesize/2, 5218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels framesize/2); 5228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fprintf(stderr,"Done\n\n"); 5238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels return 0; 5248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 525