Chris@0: function [f_CENS,sideinfo] = pitch_to_CENS(f_pitch,parameter,sideinfo) Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Name: pitch_to_CENS Chris@0: % Date of Revision: 2011-03 Chris@0: % Programmer: Meinard Mueller, Sebastian Ewert Chris@0: % Chris@0: % Description: Chris@0: % Normalized statistical chroma-based energy distribution feature (CENS). Chris@0: % The following is computed: Chris@0: % * energy for each chroma band Chris@0: % * normalisation of the chroma vectors Chris@0: % * local statistics: Chris@0: % - component-wise quantisation of the normalized chroma vectors Chris@0: % - upfirdn filters and downsamples each column of f_stat_help Chris@0: % - normalize each vector with its l^2 norm Chris@0: % Chris@0: % Remark: Chris@0: % * parameter.inputFeatureRate specifies the feature rate of f_pitch. The value Chris@0: % is used to derive the output feature rate given via sideinfo. Chris@0: % Chris@0: % Input: Chris@0: % f_pitch Chris@0: % parameter.quantSteps = [40 20 10 5] / 100; Chris@0: % parameter.quantWeights = [ 1 1 1 1]/4; Chris@0: % parameter.normThresh = 0.001; Chris@0: % parameter.winLenSmooth = 41; Chris@0: % parameter.downsampSmooth = 10; Chris@0: % parameter.midiMin = 21; Chris@0: % parameter.midiMax = 108; Chris@0: % parameter.inputFeatureRate = 0; Chris@0: % parameter.save = 0; Chris@0: % parameter.saveDir = ''; Chris@0: % parameter.saveFilename = ''; Chris@0: % parameter.visualize = 0; Chris@0: % sideinfo Chris@0: % Chris@0: % Output: Chris@0: % f_CENS Chris@0: % sideinfo Chris@0: % Chris@0: % License: Chris@0: % This file is part of 'Chroma Toolbox'. Chris@0: % Chris@0: % 'Chroma Toolbox' is free software: you can redistribute it and/or modify Chris@0: % it under the terms of the GNU General Public License as published by Chris@0: % the Free Software Foundation, either version 2 of the License, or Chris@0: % (at your option) any later version. Chris@0: % Chris@0: % 'Chroma Toolbox' is distributed in the hope that it will be useful, Chris@0: % but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: % GNU General Public License for more details. Chris@0: % Chris@0: % You should have received a copy of the GNU General Public License Chris@0: % along with 'Chroma Toolbox'. If not, see . Chris@0: % Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Check parameters Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: if nargin<3 Chris@0: sideinfo=[]; Chris@0: end Chris@0: if nargin<2 Chris@0: parameter=[]; Chris@0: end Chris@0: if nargin<1 Chris@0: error('Please specify input data f_pitch'); Chris@0: end Chris@0: Chris@0: if isfield(parameter,'quantSteps')==0 Chris@0: parameter.quantSteps = [40 20 10 5] / 100; Chris@0: end Chris@0: if isfield(parameter,'quantWeights')==0 Chris@0: parameter.quantWeights = [ 1 1 1 1]/4; Chris@0: end Chris@0: if isfield(parameter,'normThresh')==0 Chris@0: parameter.normThresh = 0.001; Chris@0: end Chris@0: if isfield(parameter,'winLenSmooth')==0 Chris@0: parameter.winLenSmooth = 41; Chris@0: end Chris@0: if isfield(parameter,'downsampSmooth')==0 Chris@0: parameter.downsampSmooth = 10; Chris@0: end Chris@0: if isfield(parameter,'midiMin')==0 Chris@0: parameter.midiMin = 21; Chris@0: end Chris@0: if isfield(parameter,'midiMax')==0 Chris@0: parameter.midiMax = 108; Chris@0: end Chris@0: if isfield(parameter,'inputFeatureRate')==0 Chris@0: parameter.inputFeatureRate = 0; Chris@0: end Chris@0: if isfield(parameter,'save')==0 Chris@0: parameter.save = 0; Chris@0: end Chris@0: if isfield(parameter,'saveDir')==0 Chris@0: parameter.saveDir = ''; Chris@0: end Chris@0: if isfield(parameter,'saveFilename')==0 Chris@0: parameter.saveFilename = ''; Chris@0: end Chris@0: if isfield(parameter,'visualize')==0 Chris@0: parameter.visualize = 0; Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Main program Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: seg_num = size(f_pitch,2); Chris@0: Chris@0: % calculate energy for each chroma band Chris@0: f_chroma_energy = zeros(12,seg_num); Chris@0: for p=parameter.midiMin:parameter.midiMax Chris@0: chroma = mod(p,12)+1; Chris@0: f_chroma_energy(chroma,:) = f_chroma_energy(chroma,:)+f_pitch(p,:); Chris@0: end Chris@0: Chris@0: % normalize the chroma vectors Chris@0: f_chroma_energy_distr = zeros(12,seg_num); Chris@0: for k=1:seg_num Chris@0: if sum(f_chroma_energy(:,k)>parameter.normThresh)>0 Chris@0: seg_energy_square = sum(f_chroma_energy(:,k)); Chris@0: f_chroma_energy_distr(:,k) = ((f_chroma_energy(:,k))/seg_energy_square); Chris@0: end Chris@0: end Chris@0: Chris@0: % calculate a CENS feature Chris@0: Chris@0: % component-wise quantisation of the normalized chroma vectors Chris@0: f_stat_help = zeros(12,seg_num); Chris@0: for n=1:length(parameter.quantSteps) Chris@0: f_stat_help = f_stat_help + (f_chroma_energy_distr>parameter.quantSteps(n))*parameter.quantWeights(n); Chris@0: end Chris@0: Chris@0: % Temporal smoothing and downsampling Chris@0: [f_chroma_energy_stat,CENSfeatureRate] = smoothDownsampleFeature(f_stat_help,parameter); Chris@0: Chris@0: % last step: normalize each vector with its l^2 norm Chris@0: f_CENS = normalizeFeature(f_chroma_energy_stat,2, parameter.normThresh); Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Update sideinfo Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: sideinfo.CENS.version = 1; Chris@0: sideinfo.CENS.midiMin = parameter.midiMin; Chris@0: sideinfo.CENS.midiMax = parameter.midiMax; Chris@0: sideinfo.CENS.featureRate = CENSfeatureRate; Chris@0: sideinfo.CENS.quantSteps = parameter.quantSteps; Chris@0: sideinfo.CENS.quantWeights = parameter.quantWeights; Chris@0: sideinfo.CENS.normThresh = parameter.normThresh; Chris@0: sideinfo.CENS.winLenSmooth = parameter.winLenSmooth; Chris@0: sideinfo.CENS.downsampSmooth = parameter.downsampSmooth; Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Saving to file Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.save Chris@0: filename = strcat(parameter.saveFilename,'_CENS_',num2str(parameter.winLenSmooth),'_',num2str(parameter.downsampSmooth)); Chris@0: save(strcat(parameter.saveDir,filename),'f_CENS','sideinfo'); Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Visualization Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.visualize Chris@0: parameterVis.featureRate = CENSfeatureRate; Chris@0: parameterVis.title = 'CENS chromagram'; Chris@0: visualizeChroma(f_CENS,parameterVis) Chris@0: end Chris@0: Chris@0: end