annotate hssf.h @ 13:de3961f74f30 tip

Add Linux/gcc Makefile; build fix
author Chris Cannam
date Mon, 05 Sep 2011 15:22:35 +0100
parents 977f541d6683
children
rev   line source
xue@11 1 /*
xue@11 2 Harmonic sinusoidal modelling and tools
xue@11 3
xue@11 4 C++ code package for harmonic sinusoidal modelling and relevant signal processing.
xue@11 5 Centre for Digital Music, Queen Mary, University of London.
xue@11 6 This file copyright 2011 Wen Xue.
xue@11 7
xue@11 8 This program is free software; you can redistribute it and/or
xue@11 9 modify it under the terms of the GNU General Public License as
xue@11 10 published by the Free Software Foundation; either version 2 of the
xue@11 11 License, or (at your option) any later version.
xue@11 12 */
xue@1 13 #ifndef hssfH
xue@1 14 #define hssfH
xue@1 15
Chris@5 16 /**
Chris@5 17 \file hssf.h - source-filter modeling for harmonic sinusoids
xue@1 18
xue@1 19 Further reading: Wen X. and M. Sandler, "Source-filter modeling in sinusoid domain," in Proc. AES 126th
xue@1 20 Convention, Munich, 2009.
xue@1 21 */
xue@1 22
xue@1 23
xue@1 24 #include <stdio.h>
xue@1 25 #include "hs.h"
xue@1 26
xue@1 27 //---------------------------------------------------------------------------
xue@1 28 const double Amel=1127.0104803341574386544633680278;
xue@1 29 const bool useA0=true; //if true, use A0D+A0C instead of A0C in S-F decomposition as pre-normalizer
xue@1 30
xue@1 31
Chris@5 32 /**
xue@1 33 TSF is the class implementing source-filter model for harmonic sinusoids. TSF shares the basic framework
xue@1 34 of the vibrato description class TVo, but implements a more compact source-filter representation. It does
xue@1 35 not go into detailed vibrato analysis such as extraction modulator shape.
xue@1 36
xue@1 37 An analysis/synthesis cycle converts THS to TSF and back.
xue@1 38 */
xue@1 39
xue@1 40 struct TSF
xue@1 41 {
xue@1 42 //basic characteristics
Chris@5 43 int M; ///< number of partials
Chris@5 44 int L; ///< number of frames
Chris@5 45 int P; ///< number of segmentation points
Chris@5 46 double offst; ///< hop size
Chris@5 47 double* F0C; ///< [0:L-1] pitch carrier
Chris@5 48 double* F0D; ///< [0:L-1] pitch modulator
Chris@5 49 double* logA0C; ///< [0:L-1] amplitude carreir
Chris@5 50 double* logA0D; ///< [0:L-1] amplitude modulator
xue@1 51
Chris@5 52 double* lp; ///< [0:P-1] peak positions
xue@1 53
Chris@5 54 double F; ///< filter: band with (linear or mel) associated to each b[][]
Chris@5 55 double Fs; ///< sampling frequency
Chris@5 56 int FScaleMode; ///< linear or mel
Chris@5 57 int K; ///< number of filter bands
Chris@5 58 double** b; ///< [0:L-1][0:M-1] single-frame source, in dB
Chris@5 59 double** h; ///< [0:L-1][0:K+1] single-frame filter, in dB
Chris@5 60 double* avgb; ///< [0:M-1] average source
Chris@5 61 double* avgh; ///< [0:K+1] average filter
xue@1 62
xue@1 63 //other properties
xue@1 64
Chris@5 65 double rate; ///< vibrato rate
Chris@5 66 double regularity;///< vibrato regularity
Chris@5 67 double F0max; ///< maximal fundamental frequency
Chris@5 68 double F0min; ///< minimal fundamental frequency
Chris@5 69 double F0Cmax; ///< maximal fundamental carrier frequency
Chris@5 70 double F0Cmin; ///< minimal fundamental carrier frequency
Chris@5 71 double F0Overall; ///< overall average fundamental frequency
Chris@5 72 double F0Dmax; ///< maximal fundamental modulator frequency
Chris@5 73 double F0Dmin; ///< minimal fundamental modulator frequency
Chris@5 74 double* F0; ///< [0:L-1] fundamental frequency
Chris@5 75 double* logA0; ///< [0:L-1] log amplitude
xue@1 76
xue@1 77 TSF();
xue@1 78 ~TSF();
xue@1 79
xue@1 80 //copy function
xue@1 81 void Duplicate(TSF& SF);
xue@1 82
xue@1 83 //output routines
xue@1 84 double LogAF(double f);
xue@1 85 double LogAF(double f, int fr);
xue@1 86 double LogAS(int m, int fr);
xue@1 87
xue@1 88 //memory handling routines
xue@1 89 void AllocateL(int AnL);
xue@1 90 void ReAllocateL(int newL);
xue@1 91 void AllocateP();
xue@1 92 void AllocateSF();
xue@1 93
xue@1 94 //I/O routines
xue@1 95 void SaveSFToFileHandle(FILE* f);
xue@1 96 void SaveToFileHandle(FILE* f);
xue@1 97 void LoadSFFromFileHandle(FILE* f);
xue@1 98 void LoadFromFileHandle(FILE* f);
xue@1 99 void SaveToFile(char* filename);
xue@1 100
xue@1 101 //other member functions
xue@1 102 void ShiftFilterByDB(double dB);
xue@1 103 };
xue@1 104
xue@1 105 //--tool procedures----------------------------------------------------------
xue@1 106 int Sign(double);
xue@1 107
xue@1 108 //--general source-filter model routines-------------------------------------
xue@1 109 void S_F_b(TSF& SF, atom** Partials);
xue@1 110
xue@1 111 //--slow-variation SF estimation routines------------------------------------
xue@1 112 double P2_DelFtr(double** d, int L, int K, double** x, double F);
xue@1 113 double P3_DelSrc(double** d, int L, int M, int K, double** x, double** f, double F);
xue@1 114 int SF_SV(double** h, int L, int M, int K, double** a, double** f, double F, double theta, double ep, int maxiter);
xue@1 115 double S_F_SV(int M, atom** Partials, double* logA0C, double* lp, int P, int& K, double** h, double* avgh, double** b, double* avgb, double F=0.005, int FScaleMode=0, double theta=0.5, double Fs=44100);
xue@1 116 void SF_SV_cf(double* h, double** b, int L, int M, int K, double** a, double** f, double F, double ep, int maxiter);
xue@1 117 double S_F_SV_cf(int afres, double* LogAF, double* LogAS, int Fr, int M, atom** Partials, double* A0C, double* lp, int P, int& K, double** h, double** b, double F=0.005, int FScaleMode=0, double Fs=44100);
xue@1 118
xue@1 119 //--filter-bank SF estimation routines---------------------------------------
xue@1 120 int SF_FB(double* hl, int M, int K, double** al, double** fl, double F, int LMode);
xue@1 121 double S_F_FB(int M, atom** Partials, double* logA0C, double* lp, int P, int& K, double** h, double* avgh, double** b, double* avgb, double F=0.005, int FScaleMode=0, double Fs=44100);
xue@1 122
xue@1 123 //--source-filter analysis and synthesis routines----------------------------
xue@1 124 void AnalyzeSF_1(THS& HS, TSF& SF, double sps, double offst);
xue@1 125 void AnalyzeSF_2(THS& HS, TSF& SF, double*& cyclefrs, double*& cyclefs, double sps, int* cyclefrcount=0, int SFMode=0, double SFF=0.01, int SFFScale=0, double SFtheta=0);
xue@1 126 void AnalyzeSF(THS& HS, TSF& SF, double*& cyclefrs, double*& cyclefs, double sps, double offst, int* cyclefrcount=0, int SFMode=0, double SFF=0.01, int SFFScale=0, double SFtheta=0);
xue@1 127 void SynthesizeSF(THS* HS, TSF* SF, double sps);
xue@1 128
xue@1 129
xue@1 130 #endif