xue@11: /* xue@11: Harmonic sinusoidal modelling and tools xue@11: xue@11: C++ code package for harmonic sinusoidal modelling and relevant signal processing. xue@11: Centre for Digital Music, Queen Mary, University of London. xue@11: This file copyright 2011 Wen Xue. xue@11: xue@11: This program is free software; you can redistribute it and/or xue@11: modify it under the terms of the GNU General Public License as xue@11: published by the Free Software Foundation; either version 2 of the xue@11: License, or (at your option) any later version. xue@11: */ xue@1: #ifndef hssfH xue@1: #define hssfH xue@1: Chris@5: /** Chris@5: \file hssf.h - source-filter modeling for harmonic sinusoids xue@1: xue@1: Further reading: Wen X. and M. Sandler, "Source-filter modeling in sinusoid domain," in Proc. AES 126th xue@1: Convention, Munich, 2009. xue@1: */ xue@1: xue@1: xue@1: #include xue@1: #include "hs.h" xue@1: xue@1: //--------------------------------------------------------------------------- xue@1: const double Amel=1127.0104803341574386544633680278; xue@1: const bool useA0=true; //if true, use A0D+A0C instead of A0C in S-F decomposition as pre-normalizer xue@1: xue@1: Chris@5: /** xue@1: TSF is the class implementing source-filter model for harmonic sinusoids. TSF shares the basic framework xue@1: of the vibrato description class TVo, but implements a more compact source-filter representation. It does xue@1: not go into detailed vibrato analysis such as extraction modulator shape. xue@1: xue@1: An analysis/synthesis cycle converts THS to TSF and back. xue@1: */ xue@1: xue@1: struct TSF xue@1: { xue@1: //basic characteristics Chris@5: int M; ///< number of partials Chris@5: int L; ///< number of frames Chris@5: int P; ///< number of segmentation points Chris@5: double offst; ///< hop size Chris@5: double* F0C; ///< [0:L-1] pitch carrier Chris@5: double* F0D; ///< [0:L-1] pitch modulator Chris@5: double* logA0C; ///< [0:L-1] amplitude carreir Chris@5: double* logA0D; ///< [0:L-1] amplitude modulator xue@1: Chris@5: double* lp; ///< [0:P-1] peak positions xue@1: Chris@5: double F; ///< filter: band with (linear or mel) associated to each b[][] Chris@5: double Fs; ///< sampling frequency Chris@5: int FScaleMode; ///< linear or mel Chris@5: int K; ///< number of filter bands Chris@5: double** b; ///< [0:L-1][0:M-1] single-frame source, in dB Chris@5: double** h; ///< [0:L-1][0:K+1] single-frame filter, in dB Chris@5: double* avgb; ///< [0:M-1] average source Chris@5: double* avgh; ///< [0:K+1] average filter xue@1: xue@1: //other properties xue@1: Chris@5: double rate; ///< vibrato rate Chris@5: double regularity;///< vibrato regularity Chris@5: double F0max; ///< maximal fundamental frequency Chris@5: double F0min; ///< minimal fundamental frequency Chris@5: double F0Cmax; ///< maximal fundamental carrier frequency Chris@5: double F0Cmin; ///< minimal fundamental carrier frequency Chris@5: double F0Overall; ///< overall average fundamental frequency Chris@5: double F0Dmax; ///< maximal fundamental modulator frequency Chris@5: double F0Dmin; ///< minimal fundamental modulator frequency Chris@5: double* F0; ///< [0:L-1] fundamental frequency Chris@5: double* logA0; ///< [0:L-1] log amplitude xue@1: xue@1: TSF(); xue@1: ~TSF(); xue@1: xue@1: //copy function xue@1: void Duplicate(TSF& SF); xue@1: xue@1: //output routines xue@1: double LogAF(double f); xue@1: double LogAF(double f, int fr); xue@1: double LogAS(int m, int fr); xue@1: xue@1: //memory handling routines xue@1: void AllocateL(int AnL); xue@1: void ReAllocateL(int newL); xue@1: void AllocateP(); xue@1: void AllocateSF(); xue@1: xue@1: //I/O routines xue@1: void SaveSFToFileHandle(FILE* f); xue@1: void SaveToFileHandle(FILE* f); xue@1: void LoadSFFromFileHandle(FILE* f); xue@1: void LoadFromFileHandle(FILE* f); xue@1: void SaveToFile(char* filename); xue@1: xue@1: //other member functions xue@1: void ShiftFilterByDB(double dB); xue@1: }; xue@1: xue@1: //--tool procedures---------------------------------------------------------- xue@1: int Sign(double); xue@1: xue@1: //--general source-filter model routines------------------------------------- xue@1: void S_F_b(TSF& SF, atom** Partials); xue@1: xue@1: //--slow-variation SF estimation routines------------------------------------ xue@1: double P2_DelFtr(double** d, int L, int K, double** x, double F); xue@1: double P3_DelSrc(double** d, int L, int M, int K, double** x, double** f, double F); xue@1: 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: 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: 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: 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: xue@1: //--filter-bank SF estimation routines--------------------------------------- xue@1: int SF_FB(double* hl, int M, int K, double** al, double** fl, double F, int LMode); xue@1: 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: xue@1: //--source-filter analysis and synthesis routines---------------------------- xue@1: void AnalyzeSF_1(THS& HS, TSF& SF, double sps, double offst); xue@1: 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: 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: void SynthesizeSF(THS* HS, TSF* SF, double sps); xue@1: xue@1: xue@1: #endif