Chris@0: function [f_CRP,sideinfo] = pitch_to_CRP(f_pitch,parameter,sideinfo) Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Name: pitch_to_CRP Chris@0: % Date of Revision: 2011-03 Chris@0: % Programmer: Meinard Mueller, Sebastian Ewert Chris@0: % Chris@0: % Description: Chris@0: % - Calculates CRP (Chroma DCT-reduced Log Pitch) Features Chris@0: % (see "Towards Timbre-Invariant Audio Features for Harmony-Based Music" by Chris@0: % Meinard Mueller and Sebastian Ewert) Chris@0: % Chris@0: % Remark: Chris@0: % - parameter.inputFeatureRate specifies the input feature rate. This value is Chris@0: % used to derive the output feature rate. Chris@0: % Chris@0: % Input: Chris@0: % f_pitch Chris@0: % parameter.coeffsToKeep = [55:120]; Chris@0: % parameter.applyLogCompr = 1; Chris@0: % parameter.factorLogCompr = 1000; Chris@0: % parameter.addTermLogCompr = 1; Chris@0: % parameter.normP = 2; Chris@0: % parameter.winLenSmooth = 1; Chris@0: % parameter.downsampSmooth = 1; Chris@0: % parameter.normThresh = 10^-6; 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_CRP 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,'coeffsToKeep')==0 Chris@0: parameter.coeffsToKeep = [55:120]; Chris@0: end Chris@0: if isfield(parameter,'applyLogCompr')==0 Chris@0: parameter.applyLogCompr = 1; Chris@0: end Chris@0: if isfield(parameter,'factorLogCompr')==0 Chris@0: parameter.factorLogCompr = 1000; Chris@0: end Chris@0: if isfield(parameter,'addTermLogCompr')==0 Chris@0: parameter.addTermLogCompr = 1; Chris@0: end Chris@0: if isfield(parameter,'normP')==0 Chris@0: parameter.normP = 2; Chris@0: end Chris@0: if isfield(parameter,'winLenSmooth')==0 Chris@0: parameter.winLenSmooth = 1; Chris@0: end Chris@0: if isfield(parameter,'downsampSmooth')==0 Chris@0: parameter.downsampSmooth = 1; Chris@0: end Chris@0: if isfield(parameter,'normThresh')==0 Chris@0: parameter.normThresh = 10^-6; 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: % log compression Chris@0: if parameter.applyLogCompr Chris@0: f_pitch_log = log10(parameter.addTermLogCompr+f_pitch*parameter.factorLogCompr); Chris@0: else Chris@0: f_pitch_log = f_pitch; Chris@0: end Chris@0: Chris@0: % DCT based reduction Chris@0: DCT = internal_DCT(size(f_pitch_log,1)); Chris@0: DCTcut = DCT; Chris@0: DCTcut(setdiff([1:120],parameter.coeffsToKeep),:) = 0; Chris@0: DCT_filter = DCT'*DCTcut; Chris@0: f_pitch_log_DCT = DCT_filter*f_pitch_log; Chris@0: Chris@0: % calculate energy for each chroma band Chris@0: f_CRP = zeros(12,seg_num); Chris@0: for p=1:120 Chris@0: chroma = mod(p,12)+1; Chris@0: f_CRP(chroma,:) = f_CRP(chroma,:)+f_pitch_log_DCT(p,:); Chris@0: end Chris@0: Chris@0: % normalize the vectors according to the norm l^p Chris@0: f_CRP = normalizeFeature(f_CRP,parameter.normP, parameter.normThresh); Chris@0: Chris@0: if (parameter.winLenSmooth ~= 1) || (parameter.downsampSmooth ~= 1) Chris@0: % Temporal smoothing and downsampling Chris@0: [f_CRP,CrpFeatureRate] = smoothDownsampleFeature(f_CRP,parameter); Chris@0: Chris@0: % re-normalize the vectors according to the norm l^p Chris@0: f_CRP = normalizeFeature(f_CRP,parameter.normP, parameter.normThresh); Chris@0: else Chris@0: CrpFeatureRate = parameter.inputFeatureRate; Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Update sideinfo Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: sideinfo.CRP.coeffsToKeep = parameter.coeffsToKeep; Chris@0: sideinfo.CRP.applyLogCompr = parameter.applyLogCompr; Chris@0: sideinfo.CRP.factorLogCompr = parameter.factorLogCompr; Chris@0: sideinfo.CRP.addTermLogCompr = parameter.addTermLogCompr; Chris@0: sideinfo.CRP.normP = parameter.normP; Chris@0: sideinfo.CRP.winLenSmooth = parameter.winLenSmooth; Chris@0: sideinfo.CRP.downsampSmooth = parameter.downsampSmooth; Chris@0: sideinfo.CRP.normThresh = parameter.normThresh; Chris@0: sideinfo.CRP.featureRate = CrpFeatureRate; Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Saving to file Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.save Chris@0: filename = strcat(parameter.saveFilename,'_CRP_',num2str(parameter.winLenSmooth),'_',num2str(parameter.downsampSmooth)); Chris@0: save(strcat(parameter.saveDir,filename),'f_CRP','sideinfo'); Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Visualization Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.visualize Chris@0: parameterVis.title = 'CRP chromagram'; Chris@0: parameterVis.featureRate = CrpFeatureRate; Chris@0: visualizeCRP(f_CRP,parameterVis); Chris@0: end Chris@0: Chris@0: end Chris@0: Chris@0: function matrix = internal_DCT(l) Chris@0: Chris@0: matrix = zeros(l,l); Chris@0: Chris@0: for m = 0:l-1 Chris@0: for n = 0:l-1 Chris@0: matrix(m+1,n+1) = sqrt(2/l)*cos((m*(n+0.5)*pi)/l); Chris@0: end Chris@0: end Chris@0: Chris@0: matrix(1,:) = matrix(1,:)/sqrt(2); Chris@0: Chris@0: end