annotate matlab/MATLAB-Chroma-Toolbox_2.0/pitch_to_chroma.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_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