xref: /aosp_15_r20/external/speex/libspeexdsp/vorbis_psy.h (revision 28e138c64d234588b5cd2a8a403b584bd3036e4e)
1*28e138c6SAndroid Build Coastguard Worker /* Copyright (C) 2005 Jean-Marc Valin, CSIRO, Christopher Montgomery
2*28e138c6SAndroid Build Coastguard Worker    File: vorbis_psy.h
3*28e138c6SAndroid Build Coastguard Worker 
4*28e138c6SAndroid Build Coastguard Worker    Redistribution and use in source and binary forms, with or without
5*28e138c6SAndroid Build Coastguard Worker    modification, are permitted provided that the following conditions
6*28e138c6SAndroid Build Coastguard Worker    are met:
7*28e138c6SAndroid Build Coastguard Worker 
8*28e138c6SAndroid Build Coastguard Worker    - Redistributions of source code must retain the above copyright
9*28e138c6SAndroid Build Coastguard Worker    notice, this list of conditions and the following disclaimer.
10*28e138c6SAndroid Build Coastguard Worker 
11*28e138c6SAndroid Build Coastguard Worker    - Redistributions in binary form must reproduce the above copyright
12*28e138c6SAndroid Build Coastguard Worker    notice, this list of conditions and the following disclaimer in the
13*28e138c6SAndroid Build Coastguard Worker    documentation and/or other materials provided with the distribution.
14*28e138c6SAndroid Build Coastguard Worker 
15*28e138c6SAndroid Build Coastguard Worker    - Neither the name of the Xiph.org Foundation nor the names of its
16*28e138c6SAndroid Build Coastguard Worker    contributors may be used to endorse or promote products derived from
17*28e138c6SAndroid Build Coastguard Worker    this software without specific prior written permission.
18*28e138c6SAndroid Build Coastguard Worker 
19*28e138c6SAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*28e138c6SAndroid Build Coastguard Worker    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*28e138c6SAndroid Build Coastguard Worker    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*28e138c6SAndroid Build Coastguard Worker    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23*28e138c6SAndroid Build Coastguard Worker    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24*28e138c6SAndroid Build Coastguard Worker    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25*28e138c6SAndroid Build Coastguard Worker    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26*28e138c6SAndroid Build Coastguard Worker    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27*28e138c6SAndroid Build Coastguard Worker    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28*28e138c6SAndroid Build Coastguard Worker    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29*28e138c6SAndroid Build Coastguard Worker    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*28e138c6SAndroid Build Coastguard Worker */
31*28e138c6SAndroid Build Coastguard Worker 
32*28e138c6SAndroid Build Coastguard Worker #ifndef VORBIS_PSY_H
33*28e138c6SAndroid Build Coastguard Worker #define VORBIS_PSY_H
34*28e138c6SAndroid Build Coastguard Worker 
35*28e138c6SAndroid Build Coastguard Worker #ifdef VORBIS_PSYCHO
36*28e138c6SAndroid Build Coastguard Worker 
37*28e138c6SAndroid Build Coastguard Worker #include "smallft.h"
38*28e138c6SAndroid Build Coastguard Worker #define P_BANDS 17      /* 62Hz to 16kHz */
39*28e138c6SAndroid Build Coastguard Worker #define NOISE_COMPAND_LEVELS 40
40*28e138c6SAndroid Build Coastguard Worker 
41*28e138c6SAndroid Build Coastguard Worker 
42*28e138c6SAndroid Build Coastguard Worker #define todB(x)   ((x)>1e-13?log((x)*(x))*4.34294480f:-30)
43*28e138c6SAndroid Build Coastguard Worker #define fromdB(x) (exp((x)*.11512925f))
44*28e138c6SAndroid Build Coastguard Worker 
45*28e138c6SAndroid Build Coastguard Worker /* The bark scale equations are approximations, since the original
46*28e138c6SAndroid Build Coastguard Worker    table was somewhat hand rolled.  The below are chosen to have the
47*28e138c6SAndroid Build Coastguard Worker    best possible fit to the rolled tables, thus their somewhat odd
48*28e138c6SAndroid Build Coastguard Worker    appearance (these are more accurate and over a longer range than
49*28e138c6SAndroid Build Coastguard Worker    the oft-quoted bark equations found in the texts I have).  The
50*28e138c6SAndroid Build Coastguard Worker    approximations are valid from 0 - 30kHz (nyquist) or so.
51*28e138c6SAndroid Build Coastguard Worker 
52*28e138c6SAndroid Build Coastguard Worker    all f in Hz, z in Bark */
53*28e138c6SAndroid Build Coastguard Worker 
54*28e138c6SAndroid Build Coastguard Worker #define toBARK(n)   (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
55*28e138c6SAndroid Build Coastguard Worker #define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)
56*28e138c6SAndroid Build Coastguard Worker 
57*28e138c6SAndroid Build Coastguard Worker /* Frequency to octave.  We arbitrarily declare 63.5 Hz to be octave
58*28e138c6SAndroid Build Coastguard Worker    0.0 */
59*28e138c6SAndroid Build Coastguard Worker 
60*28e138c6SAndroid Build Coastguard Worker #define toOC(n)     (log(n)*1.442695f-5.965784f)
61*28e138c6SAndroid Build Coastguard Worker #define fromOC(o)   (exp(((o)+5.965784f)*.693147f))
62*28e138c6SAndroid Build Coastguard Worker 
63*28e138c6SAndroid Build Coastguard Worker 
64*28e138c6SAndroid Build Coastguard Worker typedef struct {
65*28e138c6SAndroid Build Coastguard Worker 
66*28e138c6SAndroid Build Coastguard Worker   float noisewindowlo;
67*28e138c6SAndroid Build Coastguard Worker   float noisewindowhi;
68*28e138c6SAndroid Build Coastguard Worker   int   noisewindowlomin;
69*28e138c6SAndroid Build Coastguard Worker   int   noisewindowhimin;
70*28e138c6SAndroid Build Coastguard Worker   int   noisewindowfixed;
71*28e138c6SAndroid Build Coastguard Worker   float noiseoff[P_BANDS];
72*28e138c6SAndroid Build Coastguard Worker   float noisecompand[NOISE_COMPAND_LEVELS];
73*28e138c6SAndroid Build Coastguard Worker 
74*28e138c6SAndroid Build Coastguard Worker } VorbisPsyInfo;
75*28e138c6SAndroid Build Coastguard Worker 
76*28e138c6SAndroid Build Coastguard Worker 
77*28e138c6SAndroid Build Coastguard Worker 
78*28e138c6SAndroid Build Coastguard Worker typedef struct {
79*28e138c6SAndroid Build Coastguard Worker   int n;
80*28e138c6SAndroid Build Coastguard Worker   int rate;
81*28e138c6SAndroid Build Coastguard Worker   struct drft_lookup lookup;
82*28e138c6SAndroid Build Coastguard Worker   VorbisPsyInfo *vi;
83*28e138c6SAndroid Build Coastguard Worker 
84*28e138c6SAndroid Build Coastguard Worker   float *window;
85*28e138c6SAndroid Build Coastguard Worker   float *noiseoffset;
86*28e138c6SAndroid Build Coastguard Worker   long  *bark;
87*28e138c6SAndroid Build Coastguard Worker 
88*28e138c6SAndroid Build Coastguard Worker } VorbisPsy;
89*28e138c6SAndroid Build Coastguard Worker 
90*28e138c6SAndroid Build Coastguard Worker 
91*28e138c6SAndroid Build Coastguard Worker VorbisPsy *vorbis_psy_init(int rate, int size);
92*28e138c6SAndroid Build Coastguard Worker void vorbis_psy_destroy(VorbisPsy *psy);
93*28e138c6SAndroid Build Coastguard Worker void compute_curve(VorbisPsy *psy, float *audio, float *curve);
94*28e138c6SAndroid Build Coastguard Worker void curve_to_lpc(VorbisPsy *psy, float *curve, float *awk1, float *awk2, int ord);
95*28e138c6SAndroid Build Coastguard Worker 
96*28e138c6SAndroid Build Coastguard Worker #endif
97*28e138c6SAndroid Build Coastguard Worker #endif
98