1 #ifndef _FormantModeler_h_
2 #define _FormantModeler_h_
3 /* FormantModeler.h
4  *
5  * Copyright (C) 2014-2021 David Weenink
6  *
7  * This code is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or (at
10  * your option) any later version.
11  *
12  * This code is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this work. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include "Collection.h"
22 #include "Covariance.h"
23 #include "DataModeler.h"
24 #include "Formant.h"
25 #include "OptimalCeilingTier.h"
26 #include "Pitch.h"
27 #include "Sound_to_Formant.h"
28 #include "Table.h"
29 
30 #include "FormantModeler_enums.h"
31 
32 #include "FormantModeler_def.h"
33 
34 autoFormantModeler FormantModeler_create (double tmin, double tmax, integer numberOfDataPoints, integer numberOfTracks, integer numberOfParameters);
35 
36 autoFormantModeler FormantModeler_create (double tmin, double tmax, integer numberOfDataPoints, constINTVEC const& numberOfParameters);
37 
38 double FormantModeler_indexToTime (FormantModeler me, integer index);
39 
40 void FormantModeler_fit (FormantModeler me);
41 
42 void FormantModeler_drawBasisFunction (FormantModeler me, Graphics g, double tmin, double tmax, double fmin, double fmax,
43 	integer itrack, integer iterm, bool scaled, integer numberOfPoints, bool garnish);
44 
45 void FormantModeler_setDataWeighing (FormantModeler me, integer fromTrack, integer toTrack, kFormantModelerWeights weighFormants);
46 
47 void FormantModeler_setParameterValueFixed (FormantModeler me, integer itrack, integer index, double value);
48 
49 void FormantModeler_setParametersFree (FormantModeler me, integer fromTrack, integer toTrack, integer fromIndex, integer toIndex);
50 
51 void FormantModeler_setParameterValuesToZero (FormantModeler me, integer fromTrack, integer toTrack, double numberOfSigmas);
52 
53 void FormantModeler_setTolerance (FormantModeler me, double tolerance);
54 
55 void FormantModeler_drawModel_inside (FormantModeler me, Graphics g, double tmin, double tmax, double fmax,
56 	integer fromTrack, integer toTrack, MelderColour oddTracks, MelderColour evenTracks, integer numberOfPoints);
57 
58 void FormantModeler_speckle (FormantModeler me, Graphics g, double tmin, double tmax, double fmax,
59 	integer fromTrack, integer toTrack, bool useEstimatedTrack, integer numberOfParameters, bool errorBars,
60 	MelderColour oddTracks, MelderColour evenTracks, bool garnish);
61 
62 void FormantModeler_speckle_inside (FormantModeler me, Graphics g, double xmin, double xmax, double fmax,
63 	integer fromTrack, integer toTrack, bool useEstimatedTrack, integer numberOfParameters, bool errorBars, MelderColour oddTracks, MelderColour evenTracks);
64 
65 void FormantModeler_drawTracks (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, integer fromTrack, integer toTrack, bool useEstimatedTrack, integer numberOfParameters, MelderColour oddTracks, MelderColour evenTracks, bool garnish);
66 
67 void FormantModeler_drawTracks_inside (FormantModeler me, Graphics g, double xmin, double xmax, double fmax, integer fromTrack, integer toTrack, bool useEstimatedTrack, integer numberOfParameters, MelderColour oddTracks, MelderColour evenTracks, bool garnish);
68 
69 void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, integer fromTrack, integer toTrack, double numberOfSigmas, conststring32 mark, double marksFontSize, MelderColour oddTracks, MelderColour evenTracks, bool garnish);
70 
71 void FormantModeler_drawCumulativeChiScores (FormantModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, bool garnish);
72 
73 void FormantModeler_drawVariancesOfShiftedTracks (FormantModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax,
74 	kFormantModelerTrackShift shiftDirection, integer fromTrack, integer toTrack, bool garnish);
75 
76 void FormantModeler_normalProbabilityPlot (FormantModeler me, Graphics g, integer itrack, integer numberOfQuantiles, double numberOfSigmas, double labelSize, conststring32 label, bool garnish);
77 
78 autoTable FormantModeler_to_Table_zscores (FormantModeler me);
79 
80 autoCovariance FormantModeler_to_Covariance_parameters (FormantModeler me, integer itrack);
81 
82 
83 /*
84 	Precondition: fromFormant >= 1
85 	toFormant == 0 signals 'all' data
86 */
87 double FormantModeler_getChiSquaredQ (FormantModeler me, integer fromTrack, integer toTrack, double *probability, double *ndf);
88 
89 double FormantModeler_getCoefficientOfDetermination (FormantModeler me, integer fromTrack, integer toTrack);
90 
91 double FormantModeler_getStandardDeviation (FormantModeler me, integer itrack);
92 
93 double FormantModeler_getResidualSumOfSquares (FormantModeler me, integer itrack, integer *numberOfDataPoints);
94 
95 double FormantModeler_getEstimatedValueAtTime (FormantModeler me, integer itrack, double time);
96 
97 integer FormantModeler_getNumberOfParameters (FormantModeler me, integer itrack);
98 
99 integer FormantModeler_getNumberOfFixedParameters (FormantModeler me, integer itrack);
100 
101 double FormantModeler_getParameterStandardDeviation ( FormantModeler me, integer itrack, integer index);
102 
103 /*
104 	Precondition: fromIndex >= 1 && fromFormant >= 1
105 	toFormant == 0 && toIndex == 0 signal 'all' data
106 */
107 double FormantModeler_getVarianceOfParameters (FormantModeler me, integer fromTrack, integer toTrack, integer fromIndex, integer toIndex, integer *numberOfFreeParameters);
108 
109 kDataModelerParameterStatus FormantModeler_getParameterStatus (FormantModeler me, integer itrack, integer index);
110 
111 integer FormantModeler_getNumberOfDataPoints (FormantModeler me);
112 
113 integer FormantModeler_getNumberOfInvalidDataPoints (FormantModeler me, integer itrack);
114 
115 void FormantModeler_setDataPointStatus (FormantModeler me, integer itrack, integer index, kDataModelerData status);
116 
117 kDataModelerData FormantModeler_getDataPointStatus (FormantModeler me, integer itrack, integer index);
118 
119 double FormantModeler_getDataPointValue (FormantModeler me, integer itrack, integer index);
120 
121 void FormantModeler_setDataPointValue (FormantModeler me, integer itrack, integer index, double value);
122 
123 double FormantModeler_getDataPointSigma (FormantModeler me, integer itrack, integer index);
124 
125 void FormantModeler_setDataPointSigma (FormantModeler me, integer itrack, integer index, double sigma);
126 
127 double FormantModeler_getDegreesOfFreedom (FormantModeler me, integer itrack);
128 
129 integer FormantModeler_getNumberOfTracks (FormantModeler me);
130 
131 double FormantModeler_getModelValueAtTime (FormantModeler me, integer itrack, double time);
132 
133 double FormantModeler_getModelValueAtIndex (FormantModeler me, integer itrack, integer index);
134 
135 double FormantModeler_getWeightedMean (FormantModeler me, integer itrack);
136 
137 double FormantModeler_getParameterValue (FormantModeler me, integer itrack, integer iparameter);
138 
139 autoFormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax, integer numberOfTracks,
140 	integer numberOfParametersPerTrack);
141 
142 autoFormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax, constINTVEC const& numberOfParametersPerTrack);
143 
144 autoFormant FormantModeler_to_Formant (FormantModeler me, bool estimate, bool estimateUndefined);
145 
146 autoFormantModeler FormantModeler_processOutliers (FormantModeler me, double numberOfSigmas);
147 
148 /*
149 	Get roughness criterion value according to Weenink's (2015) measure
150 	W = (var/k)^t * (chi^2/d), where
151 	var is the sum of all variances of all parameters of all modelled formants,
152 	k is the total number of parameters to mode all tracks, chi^2 is the combined chi-squared of all
153 	the modelled tracks, d is the combined degrees of freedom, and t is a number that if chosen
154 	larger than 1 guarantees that for tracks that only differ in bandwidth the one with the largest
155 	bandwidth obtains a higher value for W.
156 	A lower value for W means a smoother track.
157 
158 	The routine returns log10 (W).
159 */
160 double FormantModeler_getStress (FormantModeler me, integer fromTrack, integer toTrack,
161 	integer numberOfParametersPerTrack, double power);
162 
163 double FormantModeler_getAverageDistanceBetweenTracks (FormantModeler me, integer track1, integer track2, int type);
164 
165 void FormantModeler_reportChiSquared (FormantModeler me);
166 
167 integer Formants_getSmoothestInInterval (CollectionOf<structFormant>* me, double tmin, double tmax, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants, bool useConstraints, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3);
168 
169 double FormantModeler_getFormantsConstraintsFactor (FormantModeler me, double minF1, double maxF1, double minF2, double maxF2, double minF3);
170 
171 autoFormant Formants_extractSmoothestPart (CollectionOf<structFormant>* me, double tmin, double tmax, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants, double numberOfSigmas, double power);
172 
173 autoFormant Formants_extractSmoothestPart_withFormantsConstraints (CollectionOf<structFormant>* me, double tmin, double tmax, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3);
174 
175 autoDataModeler FormantModeler_extractDataModeler (FormantModeler me, integer itrack);
176 
177 autoFormant Sound_to_Formant_interval (Sound me, double startTime, double endTime,
178 	double windowLength, double timeStep, double minFreq, double maxFreq, integer numberOfFrequencySteps,
179 	double preemphasisFrequency, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants,
180 	double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3,
181 	double *out_optimalCeiling
182 );
183 
184 autoFormant Sound_to_Formant_interval_robust (Sound me, double startTime, double endTime,
185 	double windowLength, double timeStep, double minFreq, double maxFreq, integer numberOfFrequencySteps,
186 	double preemphasisFrequency, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants,
187 	double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3,
188 	double *out_optimalCeiling
189 );
190 
191 double Sound_getOptimalFormantCeiling (Sound me, double startTime, double endTime,
192 	double windowLength, double timeStep, double minFreq, double maxFreq, integer numberOfFrequencySteps,
193 	double preemphasisFrequency, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants,
194 	double numberOfSigmas, double power
195 );
196 
197 autoOptimalCeilingTier Sound_to_OptimalCeilingTier (Sound me,
198 	double windowLength, double timeStep, double minCeiling, double maxCeiling, integer numberOfFrequencySteps,
199 	double preemphasisFrequency, double smoothingWindow, integer numberOfFormantTracks, integer numberOfParametersPerTrack, kFormantModelerWeights weighFormants,
200 	double numberOfSigmas, double power
201 );
202 
203 #endif /* _FormantModeler_h_ */
204