annotate hssf.h @ 1:6422640a802f

first upload
author Wen X <xue.wen@elec.qmul.ac.uk>
date Tue, 05 Oct 2010 10:45:57 +0100
parents
children 5f3c32dc6e17
rev   line source
xue@1 1 #ifndef hssfH
xue@1 2 #define hssfH
xue@1 3
xue@1 4 /*
xue@1 5 hssf.cpp - source-filter modeling for harmonic sinusoids
xue@1 6
xue@1 7 Further reading: Wen X. and M. Sandler, "Source-filter modeling in sinusoid domain," in Proc. AES 126th
xue@1 8 Convention, Munich, 2009.
xue@1 9 */
xue@1 10
xue@1 11
xue@1 12 #include <stdio.h>
xue@1 13 #include "hs.h"
xue@1 14
xue@1 15 //---------------------------------------------------------------------------
xue@1 16 const double Amel=1127.0104803341574386544633680278;
xue@1 17 const bool useA0=true; //if true, use A0D+A0C instead of A0C in S-F decomposition as pre-normalizer
xue@1 18
xue@1 19
xue@1 20 /*
xue@1 21 TSF is the class implementing source-filter model for harmonic sinusoids. TSF shares the basic framework
xue@1 22 of the vibrato description class TVo, but implements a more compact source-filter representation. It does
xue@1 23 not go into detailed vibrato analysis such as extraction modulator shape.
xue@1 24
xue@1 25 An analysis/synthesis cycle converts THS to TSF and back.
xue@1 26 */
xue@1 27
xue@1 28 struct TSF
xue@1 29 {
xue@1 30 //basic characteristics
xue@1 31 int M; //number of partials
xue@1 32 int L; //number of frames
xue@1 33 int P; //number of segmentation points
xue@1 34 double offst; //hop size
xue@1 35 double* F0C; //[0:L-1] pitch carrier
xue@1 36 double* F0D; //[0:L-1] pitch modulator
xue@1 37 double* logA0C; //[0:L-1] amplitude carreir
xue@1 38 double* logA0D; //[0:L-1] amplitude modulator
xue@1 39
xue@1 40 double* lp; //[0:P-1] peak positions
xue@1 41
xue@1 42 double F; //filter: band with (linear or mel) associated to each b[][]
xue@1 43 double Fs; //sampling frequency
xue@1 44 int FScaleMode; //linear or mel
xue@1 45 int K; //number of filter bands
xue@1 46 double** b; //[0:L-1][0:M-1] single-frame source, in dB
xue@1 47 double** h; //[0:L-1][0:K+1] single-frame filter, in dB
xue@1 48 double* avgb; //[0:M-1] average source
xue@1 49 double* avgh; //[0:K+1] average filter
xue@1 50
xue@1 51 //other properties
xue@1 52
xue@1 53 double rate; //vibrato rate
xue@1 54 double regularity;//vibrato regularity
xue@1 55 double F0max; //maximal fundamental frequency
xue@1 56 double F0min; //minimal fundamental frequency
xue@1 57 double F0Cmax; //maximal fundamental carrier frequency
xue@1 58 double F0Cmin; //minimal fundamental carrier frequency
xue@1 59 double F0Overall; //overall average fundamental frequency
xue@1 60 double F0Dmax; //maximal fundamental modulator frequency
xue@1 61 double F0Dmin; //minimal fundamental modulator frequency
xue@1 62 double* F0; //[0:L-1] fundamental frequency
xue@1 63 double* logA0; //[0:L-1] log amplitude
xue@1 64
xue@1 65 TSF();
xue@1 66 ~TSF();
xue@1 67
xue@1 68 //copy function
xue@1 69 void Duplicate(TSF& SF);
xue@1 70
xue@1 71 //output routines
xue@1 72 double LogAF(double f);
xue@1 73 double LogAF(double f, int fr);
xue@1 74 double LogAS(int m, int fr);
xue@1 75
xue@1 76 //memory handling routines
xue@1 77 void AllocateL(int AnL);
xue@1 78 void ReAllocateL(int newL);
xue@1 79 void AllocateP();
xue@1 80 void AllocateSF();
xue@1 81
xue@1 82 //I/O routines
xue@1 83 void SaveSFToFileHandle(FILE* f);
xue@1 84 void SaveToFileHandle(FILE* f);
xue@1 85 void LoadSFFromFileHandle(FILE* f);
xue@1 86 void LoadFromFileHandle(FILE* f);
xue@1 87 void SaveToFile(char* filename);
xue@1 88
xue@1 89 //other member functions
xue@1 90 void ShiftFilterByDB(double dB);
xue@1 91 };
xue@1 92
xue@1 93 //--tool procedures----------------------------------------------------------
xue@1 94 int Sign(double);
xue@1 95
xue@1 96 //--general source-filter model routines-------------------------------------
xue@1 97 void S_F_b(TSF& SF, atom** Partials);
xue@1 98
xue@1 99 //--slow-variation SF estimation routines------------------------------------
xue@1 100 double P2_DelFtr(double** d, int L, int K, double** x, double F);
xue@1 101 double P3_DelSrc(double** d, int L, int M, int K, double** x, double** f, double F);
xue@1 102 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 103 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 104 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 105 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 106
xue@1 107 //--filter-bank SF estimation routines---------------------------------------
xue@1 108 int SF_FB(double* hl, int M, int K, double** al, double** fl, double F, int LMode);
xue@1 109 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 110
xue@1 111 //--source-filter analysis and synthesis routines----------------------------
xue@1 112 void AnalyzeSF_1(THS& HS, TSF& SF, double sps, double offst);
xue@1 113 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 114 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 115 void SynthesizeSF(THS* HS, TSF* SF, double sps);
xue@1 116
xue@1 117
xue@1 118 #endif