Mercurial > hg > emotion-detection-top-level
comparison Code/General/readFormantValueFromFile.m @ 4:92ca03a8fa99 tip
Update to ICASSP 2013 benchmark
author | Dawn Black |
---|---|
date | Wed, 13 Feb 2013 11:02:39 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
3:e1cfa7765647 | 4:92ca03a8fa99 |
---|---|
1 function [] = readFormantValueFromFile( statsFileID, metricFileName, metricName, vuv ) | |
2 | |
3 DEBUG=0; | |
4 | |
5 FileID = fopen( metricFileName ); | |
6 | |
7 if( FileID <= 0 ) %does the file exist? | |
8 % if not | |
9 | |
10 message = ['WARNING: MISSING ' metricName ' FILE']; | |
11 disp( message ); | |
12 fprintf( statsFileID, '\t \s missing', metricName ); | |
13 | |
14 else | |
15 % file format is not straight forward | |
16 noOfValues = 0; | |
17 formants = []; | |
18 while( ~(feof(FileID)) ) | |
19 | |
20 % search for numberOfFormants | |
21 thestr = fgetl(FileID); | |
22 | |
23 if( strfind( thestr , 'numberOfFormants' ) > 0 ) | |
24 noOfValues = noOfValues + 1; | |
25 %numberOfFormants found | |
26 pos = find( thestr == '=' ); | |
27 numberOfFormants = str2num(thestr(pos+2:end)); | |
28 formants( noOfValues, 1 ) = numberOfFormants; | |
29 % discard the 'formant []' line | |
30 thestr = fgetl(FileID); | |
31 % now read the formant positions | |
32 for (i=0:numberOfFormants-1) | |
33 thestr = fgetl(FileID); | |
34 pos = find( thestr == '=' ); | |
35 formants( noOfValues, i+2 ) = str2num(thestr( pos+2 : end )); | |
36 end | |
37 | |
38 % discard the 'bandwidth []' line | |
39 thestr = fgetl(FileID); | |
40 % now read the formant bandwidths | |
41 for (i=0:numberOfFormants-1) | |
42 thestr = fgetl(FileID); | |
43 pos = find( thestr == '=' ); | |
44 formants( noOfValues, i+2+numberOfFormants ) = str2num(thestr( pos+2 : end )); | |
45 end | |
46 | |
47 end | |
48 end | |
49 fclose(FileID); | |
50 | |
51 | |
52 if(DEBUG) | |
53 timeShift = length(formants) / length(vuv); | |
54 subplot(211); hold off; | |
55 subplot(212); hold off; | |
56 for( idx = 1: length( formants )/10 ) | |
57 frameIdx = floor( idx / timeShift ) + 1; | |
58 if( frameIdx <= length(vuv) ) | |
59 if( vuv( frameIdx ) == 0 ) | |
60 % frame is silent | |
61 subplot(211); plot( idx, formants( idx,2 ), 'w.' ); hold on; | |
62 subplot(211); plot( idx, formants( idx,3 ), 'w.' ); | |
63 subplot(211); plot( idx, formants( idx,4 ), 'w.' ); | |
64 % plot bandwidths | |
65 subplot(212); plot( idx, formants( idx,5 ), 'w.' ); hold on; | |
66 subplot(212); plot( idx, formants( idx,6 ), 'w.' ); | |
67 subplot(212); plot( idx, formants( idx,7 ), 'w.' ); | |
68 elseif( vuv( frameIdx ) == 1 ) | |
69 % frame is voiced | |
70 subplot(211); plot( idx, formants( idx,2 ), 'y.' ); hold on; | |
71 subplot(211); plot( idx, formants( idx,3 ), 'c.' ); | |
72 subplot(211); plot( idx, formants( idx,4 ), 'g.' ); | |
73 % plot bandwidths | |
74 subplot(212); plot( idx, formants( idx,5 ), 'y.' ); hold on; | |
75 subplot(212); plot( idx, formants( idx,6 ), 'c.' ); | |
76 subplot(212); plot( idx, formants( idx,7 ), 'g.' ); | |
77 else | |
78 %frame is unvoiced | |
79 subplot(211); plot( idx, formants( idx,2 ), 'r.' ); hold on; | |
80 subplot(211); plot( idx, formants( idx,3 ), 'r.' ); | |
81 subplot(211); plot( idx, formants( idx,4 ), 'r.' ); | |
82 % plot bandwidths | |
83 subplot(212); plot( idx, formants( idx,5 ), 'r.' ); hold on; | |
84 subplot(212); plot( idx, formants( idx,6 ), 'r.' ); | |
85 subplot(212); plot( idx, formants( idx,7 ), 'r.' ); | |
86 end | |
87 else | |
88 frameIdx | |
89 end | |
90 end | |
91 end | |
92 | |
93 [ noOfSamples formantDataSize ] = size( formants ); | |
94 maxNoOfFormants = (formantDataSize - 1)/2; % the array contains the number of formants, then the position of each formant, then the bandwidth of each formant. | |
95 voicedFormant = []; | |
96 voicedBandwidth = []; | |
97 % find the basic metric set for the voiced frames only | |
98 validSamples = min( noOfSamples, length(vuv) ); | |
99 for( idx = 1: validSamples ) | |
100 if( vuv( idx ) == 1 ) | |
101 % frame is voiced | |
102 formantsThisFrame = formants(idx,1); | |
103 theFormants = formants( idx, 2 : formantsThisFrame+1 ); | |
104 theBandwidths = formants( idx, formantsThisFrame+2 : (formantsThisFrame*2)+1 ); | |
105 % we want to ignore any results that contain less than the | |
106 % max number of formants as then one of the formants is set to | |
107 % zero and the detection is not reliable | |
108 % DON'T THINK THIS IS STILL VALID | |
109 % DO WE WANT TO DISCARD FORMANT SETS THAT CONTAIN '0' FORMANT | |
110 % POSITIONS FOR VOICED SEGMENTS? | |
111 if( formantsThisFrame == maxNoOfFormants ) | |
112 voicedFormant = [ voicedFormant ; theFormants ]; | |
113 voicedBandwidth = [ voicedBandwidth; theBandwidths ]; | |
114 else | |
115 % pad with zeros | |
116 diff = maxNoOfFormants - formantsThisFrame; | |
117 theFormants = [ theFormants zeros( 1, diff )]; | |
118 voicedFormant = [ voicedFormant ; theFormants ]; | |
119 theBandwidths = [ theBandwidths zeros( 1, diff )]; | |
120 voicedBandwidth = [ voicedBandwidth; theBandwidths ]; | |
121 end | |
122 | |
123 end | |
124 end | |
125 | |
126 % get the basic formant metrics | |
127 formantFrequencyMeans = []; | |
128 formantGradientMean = []; | |
129 formantBandwidthMean = []; | |
130 | |
131 fprintf( statsFileID, '\t %s %d ', 'maxNoOfFormants', maxNoOfFormants ); | |
132 | |
133 for( formantIdx = 1:maxNoOfFormants ) | |
134 % formant position | |
135 [ metrics ] = basicMetricSet( voicedFormant(:,formantIdx), statsFileID ); | |
136 formantFrequencyMeans = [ formantFrequencyMeans metrics(1) ]; | |
137 % formant gradient | |
138 formantGradient = gradient( voicedFormant(:,formantIdx) ); | |
139 [ metrics ] = basicMetricSet( formantGradient, statsFileID ); | |
140 formantGradientMean = [formantGradientMean metrics(1)]; | |
141 % formant second derivative | |
142 formantGradient = gradient( formantGradient ); | |
143 [ metrics ] = basicMetricSet( formantGradient, statsFileID ); | |
144 % formant bandwidth | |
145 [ metrics ] = basicMetricSet( voicedBandwidth(:,formantIdx), statsFileID ); | |
146 formantBandwidthMean = [formantBandwidthMean metrics(1)]; | |
147 % formant bandwidth gradient | |
148 formantGradient = gradient( voicedBandwidth(:,formantIdx)); | |
149 [ metrics ] = basicMetricSet( formantGradient, statsFileID ); | |
150 % formant bandwidth second derivative | |
151 formantGradient = gradient( formantGradient ); | |
152 [ metrics ] = basicMetricSet( formantGradient, statsFileID ); | |
153 end | |
154 | |
155 % calculate the basic metrics set for the ... | |
156 % ... mean of all formant frequencies | |
157 meanMetrics = basicMetricSet( formantFrequencyMeans, statsFileID ); | |
158 % ... mean of all formant frequency gradients | |
159 meanMetrics = basicMetricSet( formantGradientMean, statsFileID ); | |
160 % ... mean of all formant bandwidths | |
161 meanMetrics = basicMetricSet( formantBandwidthMean, statsFileID ); | |
162 end | |
163 | |
164 | |
165 |