1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: psychoacoustics not including preecho
15 last mod: $Id: psy.c,v 1.18 2000/04/03 08:30:49 xiphmont Exp $
17 ********************************************************************/
23 #include "vorbis/codec.h"
32 /* Set up decibel threshhold slopes on a Bark frequency scale */
34 static void set_curve(double *ref,double *c,int n, double crate){
37 for(i=0;i<MAX_BARK-1;i++){
38 int endpos=rint(fromBARK(i+1)*2*n/crate);
40 double delta=(ref[i+1]-base)/(endpos-j);
41 for(;j<endpos && j<n;j++){
48 void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,int n,long rate){
50 memset(p,0,sizeof(vorbis_look_psy));
51 p->maskthresh=malloc(n*sizeof(double));
52 p->barknum=malloc(n*sizeof(double));
56 /* set up the lookups for a given blocksize and sample rate */
57 /* Vorbis max sample rate is limited by 26 Bark (54kHz) */
58 set_curve(vi->maskthresh, p->maskthresh, n,rate);
61 p->barknum[i]=toBARK(rate/2.*i/n);
69 sprintf(buffer,"mask_threshhold_%d.m",n);
70 out=fopen(buffer,"w+");
72 fprintf(out,"%g\n",p->maskthresh[j]);
79 void _vp_psy_clear(vorbis_look_psy *p){
81 if(p->maskthresh)free(p->maskthresh);
82 if(p->barknum)free(p->barknum);
83 memset(p,0,sizeof(vorbis_look_psy));
87 /* Masking curve: linear rolloff on a Bark/dB scale, attenuated by
90 void _vp_mask_floor(vorbis_look_psy *p,double *f, double *floor,int attp){
92 double hroll=p->vi->hrolldB;
93 double lroll=p->vi->lrolldB;
94 double curmask=todB(f[0])+(attp?p->maskthresh[0]:0);
98 /* run mask forward then backward */
100 double newmask=todB(f[i])+(attp?p->maskthresh[i]:0);
101 double newoc=p->barknum[i];
102 double roll=curmask-(newoc-curoc)*hroll;
105 roll=curmask=newmask;
109 if(floor[i]<troll)floor[i]=troll;
112 curmask=todB(f[n-1])+(attp?p->maskthresh[n-1]:0);
113 curoc=p->barknum[n-1];
115 double newmask=todB(f[i])+(attp?p->maskthresh[i]:0);
116 double newoc=p->barknum[i];
117 double roll=curmask-(curoc-newoc)*lroll;
120 roll=curmask=newmask;
124 if(floor[i]<troll)floor[i]=troll;
128 /* s must be padded at the end with m-1 zeroes */
129 static void time_convolve(double *s,double *r,int n,int m){
137 acc+=s[i+j]*r[m-j-1];
143 void _vi_psy_free(vorbis_info_psy *i){
145 memset(i,0,sizeof(vorbis_info_psy));