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
|