Chris@0
|
1 function [f_CRP,sideinfo] = pitch_to_CRP(f_pitch,parameter,sideinfo)
|
Chris@0
|
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
3 % Name: pitch_to_CRP
|
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 % - Calculates CRP (Chroma DCT-reduced Log Pitch) Features
|
Chris@0
|
9 % (see "Towards Timbre-Invariant Audio Features for Harmony-Based Music" by
|
Chris@0
|
10 % Meinard Mueller and Sebastian Ewert)
|
Chris@0
|
11 %
|
Chris@0
|
12 % Remark:
|
Chris@0
|
13 % - parameter.inputFeatureRate specifies the input feature rate. This value is
|
Chris@0
|
14 % used to derive the output feature rate.
|
Chris@0
|
15 %
|
Chris@0
|
16 % Input:
|
Chris@0
|
17 % f_pitch
|
Chris@0
|
18 % parameter.coeffsToKeep = [55:120];
|
Chris@0
|
19 % parameter.applyLogCompr = 1;
|
Chris@0
|
20 % parameter.factorLogCompr = 1000;
|
Chris@0
|
21 % parameter.addTermLogCompr = 1;
|
Chris@0
|
22 % parameter.normP = 2;
|
Chris@0
|
23 % parameter.winLenSmooth = 1;
|
Chris@0
|
24 % parameter.downsampSmooth = 1;
|
Chris@0
|
25 % parameter.normThresh = 10^-6;
|
Chris@0
|
26 % parameter.inputFeatureRate = 0;
|
Chris@0
|
27 % parameter.save = 0;
|
Chris@0
|
28 % parameter.saveDir = '';
|
Chris@0
|
29 % parameter.saveFilename = '';
|
Chris@0
|
30 % parameter.visualize = 0;
|
Chris@0
|
31 % sideinfo
|
Chris@0
|
32 %
|
Chris@0
|
33 % Output:
|
Chris@0
|
34 % f_CRP
|
Chris@0
|
35 % sideinfo
|
Chris@0
|
36 %
|
Chris@0
|
37 % License:
|
Chris@0
|
38 % This file is part of 'Chroma Toolbox'.
|
Chris@0
|
39 %
|
Chris@0
|
40 % 'Chroma Toolbox' is free software: you can redistribute it and/or modify
|
Chris@0
|
41 % it under the terms of the GNU General Public License as published by
|
Chris@0
|
42 % the Free Software Foundation, either version 2 of the License, or
|
Chris@0
|
43 % (at your option) any later version.
|
Chris@0
|
44 %
|
Chris@0
|
45 % 'Chroma Toolbox' is distributed in the hope that it will be useful,
|
Chris@0
|
46 % but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
47 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
48 % GNU General Public License for more details.
|
Chris@0
|
49 %
|
Chris@0
|
50 % You should have received a copy of the GNU General Public License
|
Chris@0
|
51 % along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
|
Chris@0
|
52 %
|
Chris@0
|
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
54
|
Chris@0
|
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
56 % Check parameters
|
Chris@0
|
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
58
|
Chris@0
|
59 if nargin<3
|
Chris@0
|
60 sideinfo=[];
|
Chris@0
|
61 end
|
Chris@0
|
62 if nargin<2
|
Chris@0
|
63 parameter=[];
|
Chris@0
|
64 end
|
Chris@0
|
65 if nargin<1
|
Chris@0
|
66 error('Please specify input data f_pitch');
|
Chris@0
|
67 end
|
Chris@0
|
68
|
Chris@0
|
69 if isfield(parameter,'coeffsToKeep')==0
|
Chris@0
|
70 parameter.coeffsToKeep = [55:120];
|
Chris@0
|
71 end
|
Chris@0
|
72 if isfield(parameter,'applyLogCompr')==0
|
Chris@0
|
73 parameter.applyLogCompr = 1;
|
Chris@0
|
74 end
|
Chris@0
|
75 if isfield(parameter,'factorLogCompr')==0
|
Chris@0
|
76 parameter.factorLogCompr = 1000;
|
Chris@0
|
77 end
|
Chris@0
|
78 if isfield(parameter,'addTermLogCompr')==0
|
Chris@0
|
79 parameter.addTermLogCompr = 1;
|
Chris@0
|
80 end
|
Chris@0
|
81 if isfield(parameter,'normP')==0
|
Chris@0
|
82 parameter.normP = 2;
|
Chris@0
|
83 end
|
Chris@0
|
84 if isfield(parameter,'winLenSmooth')==0
|
Chris@0
|
85 parameter.winLenSmooth = 1;
|
Chris@0
|
86 end
|
Chris@0
|
87 if isfield(parameter,'downsampSmooth')==0
|
Chris@0
|
88 parameter.downsampSmooth = 1;
|
Chris@0
|
89 end
|
Chris@0
|
90 if isfield(parameter,'normThresh')==0
|
Chris@0
|
91 parameter.normThresh = 10^-6;
|
Chris@0
|
92 end
|
Chris@0
|
93 if isfield(parameter,'inputFeatureRate')==0
|
Chris@0
|
94 parameter.inputFeatureRate = 0;
|
Chris@0
|
95 end
|
Chris@0
|
96 if isfield(parameter,'save')==0
|
Chris@0
|
97 parameter.save = 0;
|
Chris@0
|
98 end
|
Chris@0
|
99 if isfield(parameter,'saveDir')==0
|
Chris@0
|
100 parameter.saveDir = '';
|
Chris@0
|
101 end
|
Chris@0
|
102 if isfield(parameter,'saveFilename')==0
|
Chris@0
|
103 parameter.saveFilename = '';
|
Chris@0
|
104 end
|
Chris@0
|
105 if isfield(parameter,'visualize')==0
|
Chris@0
|
106 parameter.visualize = 0;
|
Chris@0
|
107 end
|
Chris@0
|
108
|
Chris@0
|
109 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
110 % Main program
|
Chris@0
|
111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
112
|
Chris@0
|
113 seg_num = size(f_pitch,2);
|
Chris@0
|
114
|
Chris@0
|
115 % log compression
|
Chris@0
|
116 if parameter.applyLogCompr
|
Chris@0
|
117 f_pitch_log = log10(parameter.addTermLogCompr+f_pitch*parameter.factorLogCompr);
|
Chris@0
|
118 else
|
Chris@0
|
119 f_pitch_log = f_pitch;
|
Chris@0
|
120 end
|
Chris@0
|
121
|
Chris@0
|
122 % DCT based reduction
|
Chris@0
|
123 DCT = internal_DCT(size(f_pitch_log,1));
|
Chris@0
|
124 DCTcut = DCT;
|
Chris@0
|
125 DCTcut(setdiff([1:120],parameter.coeffsToKeep),:) = 0;
|
Chris@0
|
126 DCT_filter = DCT'*DCTcut;
|
Chris@0
|
127 f_pitch_log_DCT = DCT_filter*f_pitch_log;
|
Chris@0
|
128
|
Chris@0
|
129 % calculate energy for each chroma band
|
Chris@0
|
130 f_CRP = zeros(12,seg_num);
|
Chris@0
|
131 for p=1:120
|
Chris@0
|
132 chroma = mod(p,12)+1;
|
Chris@0
|
133 f_CRP(chroma,:) = f_CRP(chroma,:)+f_pitch_log_DCT(p,:);
|
Chris@0
|
134 end
|
Chris@0
|
135
|
Chris@0
|
136 % normalize the vectors according to the norm l^p
|
Chris@0
|
137 f_CRP = normalizeFeature(f_CRP,parameter.normP, parameter.normThresh);
|
Chris@0
|
138
|
Chris@0
|
139 if (parameter.winLenSmooth ~= 1) || (parameter.downsampSmooth ~= 1)
|
Chris@0
|
140 % Temporal smoothing and downsampling
|
Chris@0
|
141 [f_CRP,CrpFeatureRate] = smoothDownsampleFeature(f_CRP,parameter);
|
Chris@0
|
142
|
Chris@0
|
143 % re-normalize the vectors according to the norm l^p
|
Chris@0
|
144 f_CRP = normalizeFeature(f_CRP,parameter.normP, parameter.normThresh);
|
Chris@0
|
145 else
|
Chris@0
|
146 CrpFeatureRate = parameter.inputFeatureRate;
|
Chris@0
|
147 end
|
Chris@0
|
148
|
Chris@0
|
149 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
150 % Update sideinfo
|
Chris@0
|
151 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
152
|
Chris@0
|
153 sideinfo.CRP.coeffsToKeep = parameter.coeffsToKeep;
|
Chris@0
|
154 sideinfo.CRP.applyLogCompr = parameter.applyLogCompr;
|
Chris@0
|
155 sideinfo.CRP.factorLogCompr = parameter.factorLogCompr;
|
Chris@0
|
156 sideinfo.CRP.addTermLogCompr = parameter.addTermLogCompr;
|
Chris@0
|
157 sideinfo.CRP.normP = parameter.normP;
|
Chris@0
|
158 sideinfo.CRP.winLenSmooth = parameter.winLenSmooth;
|
Chris@0
|
159 sideinfo.CRP.downsampSmooth = parameter.downsampSmooth;
|
Chris@0
|
160 sideinfo.CRP.normThresh = parameter.normThresh;
|
Chris@0
|
161 sideinfo.CRP.featureRate = CrpFeatureRate;
|
Chris@0
|
162
|
Chris@0
|
163 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
164 % Saving to file
|
Chris@0
|
165 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
166 if parameter.save
|
Chris@0
|
167 filename = strcat(parameter.saveFilename,'_CRP_',num2str(parameter.winLenSmooth),'_',num2str(parameter.downsampSmooth));
|
Chris@0
|
168 save(strcat(parameter.saveDir,filename),'f_CRP','sideinfo');
|
Chris@0
|
169 end
|
Chris@0
|
170
|
Chris@0
|
171 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
172 % Visualization
|
Chris@0
|
173 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
174 if parameter.visualize
|
Chris@0
|
175 parameterVis.title = 'CRP chromagram';
|
Chris@0
|
176 parameterVis.featureRate = CrpFeatureRate;
|
Chris@0
|
177 visualizeCRP(f_CRP,parameterVis);
|
Chris@0
|
178 end
|
Chris@0
|
179
|
Chris@0
|
180 end
|
Chris@0
|
181
|
Chris@0
|
182 function matrix = internal_DCT(l)
|
Chris@0
|
183
|
Chris@0
|
184 matrix = zeros(l,l);
|
Chris@0
|
185
|
Chris@0
|
186 for m = 0:l-1
|
Chris@0
|
187 for n = 0:l-1
|
Chris@0
|
188 matrix(m+1,n+1) = sqrt(2/l)*cos((m*(n+0.5)*pi)/l);
|
Chris@0
|
189 end
|
Chris@0
|
190 end
|
Chris@0
|
191
|
Chris@0
|
192 matrix(1,:) = matrix(1,:)/sqrt(2);
|
Chris@0
|
193
|
Chris@0
|
194 end
|