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: random psychoacoustics (not including preecho)
15 last mod: $Id: psy.c,v 1.9 2000/01/04 09:05:02 xiphmont Exp $
17 ********************************************************************/
29 /* Set up decibel threshhold slopes on a Bark frequency scale */
31 static void set_curve(double *ref,double *c,int n, double crate){
34 for(i=0;i<MAX_BARK-1;i++){
35 int endpos=rint(fromBARK(i+1)*2*n/crate);
37 double delta=(ref[i+1]-base)/(endpos-j);
38 for(;j<endpos && j<n;j++){
45 void _vp_psy_init(psy_lookup *p,vorbis_info *vi,int n){
47 memset(p,0,sizeof(psy_lookup));
48 p->maskthresh=malloc(n*sizeof(double));
49 p->barknum=malloc(n*sizeof(double));
53 /* set up the lookups for a given blocksize and sample rate */
54 /* Vorbis max sample rate is limited by 26 Bark (54kHz) */
55 set_curve(vi->maskthresh, p->maskthresh, n,vi->rate);
58 p->barknum[i]=toBARK(vi->rate/2.*i/n);
66 sprintf(buffer,"mask_threshhold_%d.m",n);
67 out=fopen(buffer,"w+");
69 fprintf(out,"%g\n",p->maskthresh[j]);
76 void _vp_psy_clear(psy_lookup *p){
78 if(p->maskthresh)free(p->maskthresh);
79 if(p->barknum)free(p->barknum);
80 memset(p,0,sizeof(psy_lookup));
84 /* Masking curve: linear rolloff on a Bark/dB scale, attenuated by
87 void _vp_mask_floor(psy_lookup *p,double *f, double *m){
89 double hroll=p->vi->hrolldB;
90 double lroll=p->vi->lrolldB;
91 double curmask=todB(f[0])+p->maskthresh[0];
95 /* run mask forward then backward */
97 double newmask=todB(f[i])+p->maskthresh[i];
98 double newoc=p->barknum[i];
99 double roll=curmask-(newoc-curoc)*hroll;
102 roll=curmask=newmask;
106 if(m[i]<troll)m[i]=troll;
109 curmask=todB(f[n-1])+p->maskthresh[n-1];
110 curoc=p->barknum[n-1];
112 double newmask=todB(f[i])+p->maskthresh[i];
113 double newoc=p->barknum[i];
114 double roll=curmask-(curoc-newoc)*lroll;
117 roll=curmask=newmask;
121 if(m[i]<troll)m[i]=troll;
125 /* s must be padded at the end with m-1 zeroes */
126 static void time_convolve(double *s,double *r,int n,int m){
134 acc+=s[i+j]*r[m-j-1];