annotate procedures.h @ 5:5f3c32dc6e17

* Adjust comment syntax to permit Doxygen to generate HTML documentation; add Doxyfile
author Chris Cannam
date Wed, 06 Oct 2010 15:19:49 +0100
parents 6422640a802f
children 977f541d6683
rev   line source
xue@1 1 #ifndef proceduresH
xue@1 2 #define proceduresH
xue@1 3
Chris@5 4 /**
Chris@5 5 \file procedures.h - this file collects miscellaneous structures and functions. Not all of these are
xue@1 6 referenced somewhere else.
xue@1 7 */
xue@1 8
xue@1 9
xue@1 10 //---------------------------------------------------------------------------
xue@1 11 #include <memory.h>
xue@1 12 #include <stdlib.h>
xue@1 13 #include <values.h>
xue@1 14 #include "fft.h"
xue@1 15 #include "windowfunctions.h"
xue@1 16
Chris@5 17 /**
xue@1 18 macro testnn: non-negative test. This macro throws out an exception if the value of x is negative.
xue@1 19 */
xue@1 20 #ifndef testnn
xue@1 21 #define testnn(x) {try{if (x<0) throw("testnn");}catch(...){x=0;}}
xue@1 22 #endif
xue@1 23
xue@1 24 /*
xue@1 25 macro AllocateGMM and ReleaseGMM: allocates and frees buffers that hosts descriptors of a Gaussian-
xue@1 26 mixture model.
xue@1 27 */
xue@1 28 #define AllocateGMM(_MIXS, _DIM, _P, _M, _DEV) \
xue@1 29 double* _P=new double[_MIXS]; double** _M=new double*[_MIXS]; double ** _DEV=new double*[_MIXS]; \
xue@1 30 _M[0]=new double[(_MIXS)*(_DIM)]; _DEV[0]=new double[(_MIXS)*(_DIM)]; \
xue@1 31 for (int _MIX=1; _MIX<_MIXS; _MIX++) _M[_MIX]=&_M[0][_MIX*(_DIM)], _DEV[_MIX]=&_DEV[0][_MIX*(_DIM)];
xue@1 32 #define ReleaseGMM(_P, _M, _DEV) \
xue@1 33 delete[] _P; if (_M) {delete[] _M[0]; delete[] _M;} if (_DEV) {delete[] _DEV[0]; delete[] _DEV;}
xue@1 34
xue@1 35
xue@1 36 //---------------------------------------------------------------------------
Chris@5 37 /**
xue@1 38 Tick count tool (stop watch) is made up of a TickClock struct and three macros that uses this
xue@1 39 structure as augument.
xue@1 40
xue@1 41 Use of TickClock: declare the instance directly. Use StartClock() and StopClock() to start and stop
xue@1 42 tick counting. Each time the clock is stopped the interval between last start and stop operations is
xue@1 43 added to run-time t. Clear the recorded run-time with ResetClock().
xue@1 44 */
xue@1 45 struct TickClock //tick counter struct
xue@1 46 {
xue@1 47 double t; //accumulated run time
xue@1 48 __int64 Ticks; //tick count recorded at start trigger
xue@1 49 __int64 Ticks2; //tick count recorded at stop trigger
xue@1 50 };
xue@1 51 #define ResetClock(AClock) {AClock.t=0;}
xue@1 52 #define StartClock(AClock) {AClock.Ticks=GetTickCount();}
xue@1 53 #define StopClock(AClock) {AClock.Ticks2=GetTickCount(); AClock.t+=0.001*(AClock.Ticks2-AClock.Ticks);}
xue@1 54
xue@1 55 //---------------------------------------------------------------------------
xue@1 56
xue@1 57 struct fftparams //buffers used by FFT routines
xue@1 58 {
xue@1 59 double* Amp; //amplitude output buffer
xue@1 60 double* Arg; //phase angle output buffer
xue@1 61 cdouble* w; //twiddle factor buffer
xue@1 62 cdouble* x; //data buffer
xue@1 63 };
xue@1 64
xue@1 65 struct TGMM //Gaussian mixture model
xue@1 66 {
xue@1 67 public:
xue@1 68 bool mcs;
xue@1 69 int mixs; //number of mixtures
xue@1 70 int dim; //data dimension
xue@1 71 double* p; //mixture weights
xue@1 72 double** m; //mixture component centres
xue@1 73 double** dev; //diagonal mixture component correlation
xue@1 74 double acct;
xue@1 75 TGMM();
xue@1 76 ~TGMM();
xue@1 77 };
xue@1 78
xue@1 79 struct TTFSpan //a rectanguar area in the T-F plane
xue@1 80 {
xue@1 81 int T1; //start time
xue@1 82 int T2; //finish time
xue@1 83 double F1; //lowest frequency
xue@1 84 double F2; //highest frequency
xue@1 85 };
xue@1 86
xue@1 87 struct TSpecPeak //spectral peak
xue@1 88 {
xue@1 89 int t; //time in samples
xue@1 90 int tres; //time resolution
xue@1 91 double f; //digital frequency
xue@1 92 double fres; //frequency resolution
xue@1 93 double df; //derivative of f
xue@1 94 double am; //amplitude
xue@1 95 double ph; //phase angle
xue@1 96 };
xue@1 97
Chris@5 98 /**
xue@1 99 TSpecTrack is a class that maintains a list of TSpecPeak objects that form a spectral track. It models
xue@1 100 a sinusid track in sinusoid modeling.
xue@1 101 */
xue@1 102 class TSpecTrack
xue@1 103 {
xue@1 104 private:
xue@1 105 int Capacity; //number of peaks the current storage space is allocated to host
xue@1 106 public:
xue@1 107 int t1; //time of first peak
xue@1 108 int t2; //time of last peak
xue@1 109 double fmin; //minimum peak frequency
xue@1 110 double fmax; //maximum peak frequency
xue@1 111
xue@1 112 int Count; //number of peaks in the track
xue@1 113 TSpecPeak* Peaks; //peaks in the track, ordered by time
xue@1 114
xue@1 115 TSpecTrack(int ACapacity=50);
xue@1 116 ~TSpecTrack();
xue@1 117
xue@1 118 void InsertPeak(TSpecPeak& APeak, int index);
xue@1 119 int LocatePeak(TSpecPeak& APeak);
xue@1 120 int Add(TSpecPeak& APeak);
xue@1 121 };
xue@1 122
Chris@5 123 /**
xue@1 124 TTFSpans is a class that maintains a list of TFSpans. This is used to mark selected areas in the time-
xue@1 125 frequency plane for further processing.
xue@1 126 */
xue@1 127 class TTFSpans
xue@1 128 {
xue@1 129 public:
xue@1 130 int Count; //number of spans
xue@1 131 int Capacity; //number of spans the current storage space is allocated to host
xue@1 132 TTFSpan* Items; //the hosted spans
xue@1 133
xue@1 134 TTFSpans();
xue@1 135 ~TTFSpans();
xue@1 136 void Add(TTFSpan& ATFSpan);
xue@1 137 void Clear();
xue@1 138 int Delete(int Index);
xue@1 139 };
xue@1 140
xue@1 141 double ACPower(double* data, int Count, void*);
xue@1 142 void Add(double* dest, double* source, int Count);
xue@1 143 void Add(double* out, double* addend, double* adder, int count);
xue@1 144 void ApplyWindow(double* OutBuffer, double* Buffer, double* Weights, int Size);
xue@1 145 double Avg(double*, int, void*);
xue@1 146 void AvgFilter(double* dataout, double* data, int Count, int HWid);
xue@1 147 int BitInv(int value, int order);
xue@1 148 void CalculateSpectrogram(double* data, int Count, int start, int end, int Wid, int Offst, double* Window=0, double** Spec=0, double** Ph=0, double amp=1, bool half=true);
xue@1 149 void Conv(double* out, int N1, double* in1, int N2, double* in2);
xue@1 150 void DCT( double* output, double* input, int N);
xue@1 151 void IDCT( double* output, double* input, int N);
xue@1 152 double DCAmplitude(double*, int, void*);
xue@1 153 double DCPower(double*, int, void*);
xue@1 154 double ddIPHann(double, void*);
xue@1 155 void DeDC(double* data, int Count, int HWid);
xue@1 156 void DeDC_static(double* data, int Count);
xue@1 157 void DoubleToInt(void* out, int BytesPerSample, double* in, int Count);
xue@1 158 void DoubleToIntAdd(void* out, int BytesPerSample, double* in, int Count);
xue@1 159 double DPower(double* data, int Count, void*);
xue@1 160 double Energy(double* data, int Count);
xue@1 161 double ExpOnsetFilter(double* dataout, double* data, int Count, double Tr, double Ta);
xue@1 162 double ExpOnsetFilter_balanced(double* dataout, double* data, int Count, double Tr, double Ta, int bal=5);
xue@1 163 double ExtractLinearComponent(double* dataout, double* data, int Count);
xue@1 164 void FFTConv(double* dest, double* source1, int size1, double* source2, int size2, int zero=0, double* pre_buffer=NULL, double* post_buffer=NULL);
xue@1 165 void FFTConv(unsigned char* dest, unsigned char* source1, int bps, int size1, double* source2, int size2, int zero=0, unsigned char* pre_buffer=NULL, unsigned char* post_buffer=NULL);
xue@1 166 void FFTConv(double* dest, double* source1, int size1, double* source2, int size2, double* pre_buffer=NULL);
xue@1 167 void FFTFilter(double* dataout, double* data, int Count, int Wid, int On, int Off);
xue@1 168 void FFTFilterOLA(double* dataout, double* data, int Count, int Wid, int On, int Off, double* pre_buffer=NULL);
xue@1 169 void FFTFilterOLA(unsigned char* dataout, unsigned char* data, int BytesPerSample, int Count, int Wid, int On, int Off, unsigned char* pre_buffer=NULL);
xue@1 170 void FFTFilterOLA(double* dataout, double* data, int Count, double* amp, double* ph, int Wid, double* pre_buffer=NULL);
xue@1 171 double FFTMask(double* dataout, double* data, int Count, int Wid, double DigiOn, double DigiOff, double maskcoef=1);
xue@1 172 int FindInc(double value, double* data, int Count);
xue@1 173 double Gaussian(int Dim, double* Vector, double* Mean, double* Dev, bool StartFrom1);
xue@1 174 void HalfDCT(double* data, int Count, double* CC, int order);
xue@1 175 double Hamming(double f, double T);
xue@1 176 double Hann(double x, double N);
xue@1 177 double HannSq(double x, double N);
xue@1 178 int HxPeak2(double*& hps, double*& vhps, double (*F)(double, void*), double (*dF)(double, void*), double(*ddF)(double, void*), void* params, double st, double en, double epf=1e-6);
xue@1 179 double I0(double x);
xue@1 180 int InsertDec(double value, double* data, int Count);
xue@1 181 int InsertDec(int value, int* data, int Count);
xue@1 182 int InsertDec(double value, int index, double* data, int* indices, int Count);
xue@1 183 int InsertInc(void* value, void** data, int Count, int (*Compare)(void*, void*));
xue@1 184 int InsertInc(double value, double* data, int Count, bool doinsert=true);
xue@1 185 int InsertInc(double value, int index, double* data, int* indices, int Count);
xue@1 186 int InsertInc(double value, double index, double* data, double* indices, int Count);
xue@1 187 int InsertInc(double value, int* data, int Count, bool doinsert=true);
xue@1 188 int InsertIncApp(double value, double* data, int Count);
xue@1 189 double InstantFreq(int k, int hwid, cdouble* x, int mode=1);
xue@1 190 void InstantFreq(double* freqspec, int hwid, cdouble* x, int mode=1);
xue@1 191 void IntToDouble(double* out, void* in, int BytesPerSample, int Count);
xue@1 192 double IPHannC(double f, cdouble* x, int N, int K1, int K2);
xue@1 193 double IPHannC(double f, void* params);
xue@1 194 double IPHannCP(double f, void* params);
xue@1 195 void lse(double* x, double* y, int Count, double& a, double& b);
xue@1 196 void memdoubleadd(double* dest, double* source, int count);
xue@1 197 void MFCC(int FrameWidth, int NumBands, int Ceps_Order, double* Data, double* Bands, double* C, double* Amps, cdouble* W, cdouble* X);
xue@1 198 double* MFCCPrepareBands(int NumberOfBands, int SamplesPerSec, int NumberOfBins);
xue@1 199 void Multi(double* data, int count, double mul);
xue@1 200 void Multi(double* out, double* in, int count, double mul);
xue@1 201 void MultiAdd(double* out, double* in, double* adder, int count, double mul);
xue@1 202 int NearestPeak(double* data, int count, int anindex);
xue@1 203 double NegativeExp(double* x, double* y, int Count, double& lmd, int sample=1, double step=0.05, double eps=1e-6, int maxiter=50);
xue@1 204 double NL(double* data, int Count, int Wid);
xue@1 205 double Normalize(double* data, int Count, double Maxi=1);
xue@1 206 double Normalize2(double* data, int Count, double Norm=1);
xue@1 207 double nextdouble(double x, double dir);
xue@1 208 double PhaseSpan(double* data, int Count, void*);
xue@1 209 void PolyFit(int P, double* a, int N, double* x, double* y);
xue@1 210 void Pow(double* data, int Count, double ex);
xue@1 211 //int prevcand(candid** cands, int p, int n, int ap);
xue@1 212 int Rectify(double* data, int Count, double th=0);
xue@1 213 double Res(double in, double mod);
xue@1 214 double Romberg(int n, double(*f)(double, void*), double a, double b, void* params=0);
xue@1 215 double Romberg(double(*f)(double, void*), double a, double b, void* params=0, int maxiter=50, double ep=1e-6);
xue@1 216 double sinca(double x);
xue@1 217 double sincd_unn(double x, int N);
xue@1 218 double SmoothPhase(double* Arg, int Count, int mpi=2);
xue@1 219 //int SortCandid(candid cand, candid* cands, int newN);
xue@1 220 double StiffB(double f0, double fm, int m);
xue@1 221 double StiffFm(double f0, int m, double B);
xue@1 222 double StiffF0(double fm, int m, double B);
xue@1 223 double StiffM(double f0, double fm, double B);
xue@1 224 void TFFilter(double* data, double* dataout, int Count, int Wid, TTFSpans* Spans, bool Pass, WindowType wt, double windp, int Sps, int TOffst=0);
xue@1 225 void TFFilter(void* data, void* dataout, int BytesPerSample, int Count, int Wid, TTFSpans* Spans, bool Pass, WindowType wt, double windp, int Sps, int TOffst);
xue@1 226 void TFMask(double* data, double* dataout, int Count, int Wid, TTFSpans* Spans, double masklevel, WindowType wt, double windp, int Sps, int TOffst);
xue@1 227 void TFMask(void* data, void* dataout, int BytesPerSec, int Count, int Wid, TTFSpans* Spans, double masklevel, WindowType wt, double windp, int Sps, int TOffst);
xue@1 228 //double dIPHannC(double f, void* params);
xue@1 229 //void ddsIPWindowStiff(double& df0f0, double& df0B, double& dBB, double& df0, double& dB, double& y, double f0, double B, cdouble* x, int N, int M, double* c, double iH2, double hB, int maxp);
xue@1 230 //void dsIPWindowStiff(double& df0, double& dB, double& y, double f0, double B, cdouble* x, int N, int M, double* c, double iH2, double hB, int maxp);
xue@1 231 //double IPWindowStiff(double f0, double B, cdouble* x, int N, int M, double* c, double iH2, double* ffp, double* vfp, double* pfp, double hB, int maxp);
xue@1 232 //double sIPWindowStiff(double f0, double B, cdouble* x, int N, int M, double* c, double iH2, double* ffp, double* vfp, double* pfp, double hB, int maxp);
xue@1 233 //double sIPWindowStiff(double f0, double B, cdouble* x, int N, int M, double* c, double iH2, double hB, int maxp);
xue@1 234 //double IPWindowMulti(double* f, int ss, cdouble* x, int N, int M, double* c, double iH2, int K1, int K2);
xue@1 235
xue@1 236 #endif