annotate matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_CRP.m @ 60:1ea2aed23d4a tip

Fix version
author Chris Cannam
date Thu, 13 Feb 2020 13:37:36 +0000
parents b54ee0a0be67
children
rev   line source
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