Chris@0
|
1 function [f_chroma_norm,sideinfo] = pitch_to_chroma(f_pitch,parameter,sideinfo)
|
Chris@0
|
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
3 % Name: pitch_to_chroma
|
Chris@0
|
4 % Date of Revision: 2011-03
|
Chris@0
|
5 % Programmer: Meinard Mueller, Sebastian Ewert
|
Chris@0
|
6 %
|
Chris@0
|
7 % Description:
|
Chris@0
|
8 % Computes normalized chroma vectors from pitch features
|
Chris@0
|
9 %
|
Chris@0
|
10 % Input:
|
Chris@0
|
11 % f_pitch
|
Chris@0
|
12 % parameter.applyLogCompr = 0;
|
Chris@0
|
13 % parameter.factorLogCompr = 100;
|
Chris@0
|
14 % parameter.addTermLogCompr = 1;
|
Chris@0
|
15 % parameter.winLenSmooth = 1;
|
Chris@0
|
16 % parameter.downsampSmooth = 1;
|
Chris@0
|
17 % parameter.applyNormalization = 1;
|
Chris@0
|
18 % parameter.normP = 2;
|
Chris@0
|
19 % parameter.normThresh = 0.001;
|
Chris@0
|
20 % parameter.midiMin = 1;
|
Chris@0
|
21 % parameter.midiMax = 120;
|
Chris@0
|
22 % parameter.inputFeatureRate = 0;
|
Chris@0
|
23 % parameter.save = 0;
|
Chris@0
|
24 % parameter.save_dir = '';
|
Chris@0
|
25 % parameter.save_filename = '';
|
Chris@0
|
26 % parameter.visualize = 0;
|
Chris@0
|
27 % sideinfo
|
Chris@0
|
28 %
|
Chris@0
|
29 % Output:
|
Chris@0
|
30 % f_chroma_norm
|
Chris@0
|
31 % sideinfo
|
Chris@0
|
32 %
|
Chris@0
|
33 % License:
|
Chris@0
|
34 % This file is part of 'Chroma Toolbox'.
|
Chris@0
|
35 %
|
Chris@0
|
36 % 'Chroma Toolbox' is free software: you can redistribute it and/or modify
|
Chris@0
|
37 % it under the terms of the GNU General Public License as published by
|
Chris@0
|
38 % the Free Software Foundation, either version 2 of the License, or
|
Chris@0
|
39 % (at your option) any later version.
|
Chris@0
|
40 %
|
Chris@0
|
41 % 'Chroma Toolbox' is distributed in the hope that it will be useful,
|
Chris@0
|
42 % but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
43 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
44 % GNU General Public License for more details.
|
Chris@0
|
45 %
|
Chris@0
|
46 % You should have received a copy of the GNU General Public License
|
Chris@0
|
47 % along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
|
Chris@0
|
48 %
|
Chris@0
|
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
50
|
Chris@0
|
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
52 % Check parameters
|
Chris@0
|
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
54
|
Chris@0
|
55 if nargin<3
|
Chris@0
|
56 sideinfo=[];
|
Chris@0
|
57 end
|
Chris@0
|
58 if nargin<2
|
Chris@0
|
59 parameter=[];
|
Chris@0
|
60 end
|
Chris@0
|
61 if nargin<1
|
Chris@0
|
62 error('Please specify input data f_pitch');
|
Chris@0
|
63 end
|
Chris@0
|
64
|
Chris@0
|
65 if isfield(parameter,'applyLogCompr')==0
|
Chris@0
|
66 parameter.applyLogCompr = 0;
|
Chris@0
|
67 end
|
Chris@0
|
68 if isfield(parameter,'factorLogCompr')==0
|
Chris@0
|
69 parameter.factorLogCompr = 100;
|
Chris@0
|
70 end
|
Chris@0
|
71 if isfield(parameter,'addTermLogCompr')==0
|
Chris@0
|
72 parameter.addTermLogCompr = 1;
|
Chris@0
|
73 end
|
Chris@0
|
74 if isfield(parameter,'winLenSmooth')==0
|
Chris@0
|
75 parameter.winLenSmooth = 1;
|
Chris@0
|
76 end
|
Chris@0
|
77 if isfield(parameter,'downsampSmooth')==0
|
Chris@0
|
78 parameter.downsampSmooth = 1;
|
Chris@0
|
79 end
|
Chris@0
|
80 if isfield(parameter,'applyNormalization')==0
|
Chris@0
|
81 parameter.applyNormalization = 1;
|
Chris@0
|
82 end
|
Chris@0
|
83 if isfield(parameter,'normP')==0
|
Chris@0
|
84 parameter.normP = 2;
|
Chris@0
|
85 end
|
Chris@0
|
86 if isfield(parameter,'normThresh')==0
|
Chris@0
|
87 parameter.normThresh = 0.001;
|
Chris@0
|
88 end
|
Chris@0
|
89 if isfield(parameter,'midiMin')==0
|
Chris@0
|
90 parameter.midiMin = 1;
|
Chris@0
|
91 end
|
Chris@0
|
92 if isfield(parameter,'midiMax')==0
|
Chris@0
|
93 parameter.midiMax = 120;
|
Chris@0
|
94 end
|
Chris@0
|
95 if isfield(parameter,'inputFeatureRate')==0
|
Chris@0
|
96 parameter.inputFeatureRate = 0;
|
Chris@0
|
97 end
|
Chris@0
|
98 if isfield(parameter,'save')==0
|
Chris@0
|
99 parameter.save = 0;
|
Chris@0
|
100 end
|
Chris@0
|
101 if isfield(parameter,'save_dir')==0
|
Chris@0
|
102 parameter.save_dir = '';
|
Chris@0
|
103 end
|
Chris@0
|
104 if isfield(parameter,'save_filename')==0
|
Chris@0
|
105 parameter.save_filename = '';
|
Chris@0
|
106 end
|
Chris@0
|
107 if isfield(parameter,'visualize')==0
|
Chris@0
|
108 parameter.visualize = 0;
|
Chris@0
|
109 end
|
Chris@0
|
110
|
Chris@0
|
111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
112 % Main program
|
Chris@0
|
113 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
114
|
Chris@0
|
115 seg_num = size(f_pitch,2);
|
Chris@0
|
116
|
Chris@0
|
117 if parameter.applyLogCompr
|
Chris@0
|
118 f_pitch = log10(parameter.addTermLogCompr+f_pitch*parameter.factorLogCompr);
|
Chris@0
|
119 end
|
Chris@0
|
120
|
Chris@0
|
121 % calculate energy for each chroma band
|
Chris@0
|
122 f_chroma = zeros(12,seg_num);
|
Chris@0
|
123 for p=parameter.midiMin:parameter.midiMax
|
Chris@0
|
124 chroma = mod(p,12)+1;
|
Chris@0
|
125 f_chroma(chroma,:) = f_chroma(chroma,:)+f_pitch(p,:);
|
Chris@0
|
126 end
|
Chris@0
|
127
|
Chris@0
|
128 % Temporal smoothing and downsampling
|
Chris@0
|
129 [f_chroma,chromaFeatureRate] = smoothDownsampleFeature(f_chroma,parameter);
|
Chris@0
|
130
|
Chris@0
|
131 if parameter.applyNormalization
|
Chris@0
|
132 % normalise the chroma vectors according the norm l^p
|
Chris@0
|
133 f_chroma_norm = normalizeFeature(f_chroma,parameter.normP, parameter.normThresh);
|
Chris@0
|
134 end
|
Chris@0
|
135
|
Chris@0
|
136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
137 % Update sideinfo
|
Chris@0
|
138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
139 sideinfo.chroma.applyLogCompr = parameter.applyLogCompr;
|
Chris@0
|
140 sideinfo.chroma.factorLogCompr = parameter.factorLogCompr;
|
Chris@0
|
141 sideinfo.chroma.addTermLogCompr = parameter.addTermLogCompr;
|
Chris@0
|
142 sideinfo.chroma.winLenSmooth = parameter.winLenSmooth;
|
Chris@0
|
143 sideinfo.chroma.downsampSmooth = parameter.downsampSmooth;
|
Chris@0
|
144 sideinfo.chroma.applyNormalization = parameter.applyNormalization;
|
Chris@0
|
145 sideinfo.chroma.normP = parameter.normP;
|
Chris@0
|
146 sideinfo.chroma.normThresh = parameter.normThresh;
|
Chris@0
|
147 sideinfo.chroma.midiMin = parameter.midiMin;
|
Chris@0
|
148 sideinfo.chroma.midiMax = parameter.midiMax;
|
Chris@0
|
149 sideinfo.chroma.chromaFeatureRate = chromaFeatureRate;
|
Chris@0
|
150
|
Chris@0
|
151 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
152 % Saving to file
|
Chris@0
|
153 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
154 if parameter.save == 1
|
Chris@0
|
155 filename = strcat(parameter.save_filename,'_chroma');
|
Chris@0
|
156 save(strcat(parameter.save_dir,filename),'f_chroma_norm','f_chroma','sideinfo');
|
Chris@0
|
157 end
|
Chris@0
|
158
|
Chris@0
|
159
|
Chris@0
|
160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
161 % Visualization
|
Chris@0
|
162 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
163 if parameter.visualize
|
Chris@0
|
164 titleString = 'Chromagram';
|
Chris@0
|
165 imagerange = [0 1];
|
Chris@0
|
166 if parameter.applyLogCompr
|
Chris@0
|
167 titleString = ['Log ', titleString];
|
Chris@0
|
168 end
|
Chris@0
|
169 if parameter.applyNormalization
|
Chris@0
|
170 imagerange = 0;
|
Chris@0
|
171 titleString = ['Normalized ', titleString];
|
Chris@0
|
172 end
|
Chris@0
|
173 parameterVis.imagerange = imagerange;
|
Chris@0
|
174 parameterVis.featureRate = chromaFeatureRate;
|
Chris@0
|
175 parameterVis.title = titleString;
|
Chris@0
|
176 visualizeChroma(f_chroma_norm,parameterVis)
|
Chris@0
|
177 end
|
Chris@0
|
178
|
Chris@0
|
179 end |