Chris@0: function [f_pitch,sideinfo] = audio_to_pitch_via_FB(f_audio,parameter,sideinfo) Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Name: audio_to_pitch_via_FB Chris@0: % Date of Revision: 2011-03 Chris@0: % Programmer: Meinard Mueller, Sebastian Ewert Chris@0: % Chris@0: % Description: Chris@0: % Computing and saving of pitch features via a pre-designed filterbank. Chris@0: % features. For each window length specified via parameter.winLenSTMSP Chris@0: % the following is computed: Chris@0: % - STMSP (short-time mean-square power) for each MIDI pitch between Chris@0: % parameter.midiMin and parameter.midiMax Chris@0: % - STMSP subbands are stored in f_pitch, where f_pitch(p,:) contains Chris@0: % STMSP of subband of pitch p Chris@0: % - sideinfo contains information of original pcm, which is saved along Chris@0: % with f_pitch into a single mat-file Chris@0: % - Information f_pitch and sideinfo is stored in mat-file: Chris@0: % save(strcat(parameter.saveDir,parameter.saveFilename),'f_pitch','sideinfo'); Chris@0: % Chris@0: % Input: Chris@0: % f_audio Chris@0: % parameter.winLenSTMSP = 4410; Chris@0: % parameter.shiftFB = 0; Chris@0: % parameter.midiMin = 21; Chris@0: % parameter.midiMax = 108; Chris@0: % parameter.save = 0; Chris@0: % parameter.saveDir = ''; Chris@0: % parameter.saveFilename = ''; Chris@0: % parameter.saveAsTuned = 0; Chris@0: % parameter.fs = 22050; Chris@0: % parameter.visualize = 0; Chris@0: % Chris@0: % Required files: Chris@0: % 'MIDI_FB_ellip_pitch_60_96_22050_Q25.mat' Chris@0: % 'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusHalf.mat' Chris@0: % 'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusQuarter.mat' Chris@0: % 'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThird.mat' Chris@0: % 'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThreeQuarters.mat' Chris@0: % 'MIDI_FB_ellip_pitch_60_96_22050_Q25_minusTwoThird.mat' Chris@0: % Chris@0: % Output: Chris@0: % f_pitch Chris@0: % sideinfo Chris@0: % 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: Chris@0: if nargin<2 Chris@0: parameter=[]; Chris@0: end Chris@0: if isfield(parameter,'visualize')==0 Chris@0: parameter.visualize = 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,'saveAsTuned')==0 Chris@0: parameter.saveAsTuned = 0; Chris@0: end Chris@0: if isfield(parameter,'fs')==0 Chris@0: parameter.fs = 22050; Chris@0: else Chris@0: if parameter.fs ~= 22050 Chris@0: error('audio_to_pitch_via_FB not implemented yet for sample rates other than 22050.'); Chris@0: end 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,'winLenSTMSP')==0 Chris@0: parameter.winLenSTMSP = 4410; Chris@0: %parameter.winLenSTMSP = [882 4410]; Chris@0: end Chris@0: if isfield(parameter,'shiftFB')==0 Chris@0: parameter.shiftFB = 0; Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Main program Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: if parameter.shiftFB == 0 Chris@0: load MIDI_FB_ellip_pitch_60_96_22050_Q25.mat Chris@0: elseif parameter.shiftFB == 1 Chris@0: load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusQuarter.mat Chris@0: elseif parameter.shiftFB == 2 Chris@0: load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThird.mat Chris@0: elseif parameter.shiftFB == 3 Chris@0: load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusHalf.mat Chris@0: elseif parameter.shiftFB == 4 Chris@0: load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusTwoThird.mat Chris@0: elseif parameter.shiftFB == 5 Chris@0: load MIDI_FB_ellip_pitch_60_96_22050_Q25_minusThreeQuarters.mat Chris@0: else Chris@0: error('Wrong shift parameter!') Chris@0: end Chris@0: Chris@0: fs_pitch = zeros(1,128); Chris@0: fs_index = zeros(1,128); Chris@0: Chris@0: fs_pitch(21:59) = 882; Chris@0: fs_pitch(60:95) = 4410; Chris@0: fs_pitch(96:120) = 22050; Chris@0: Chris@0: fs_index(21:59) = 3; Chris@0: fs_index(60:95) = 2; Chris@0: fs_index(96:120) = 1; Chris@0: Chris@0: pcm_ds = cell(3,1); Chris@0: pcm_ds{1} = f_audio; Chris@0: pcm_ds{2} = resample(pcm_ds{1},1,5,100); Chris@0: pcm_ds{3} = resample(pcm_ds{2},1,5,100); Chris@0: Chris@0: fprintf('Computing subbands and STMSP for all pitches: (%i-%i): %4i',parameter.midiMin,parameter.midiMax,0); Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Compute features for all pitches Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: Chris@0: winLenSTMSP = parameter.winLenSTMSP; Chris@0: winOvSTMSP = round(winLenSTMSP/2); Chris@0: featureRate = parameter.fs./(winLenSTMSP-winOvSTMSP); %formerly win_res Chris@0: wav_size = size(f_audio,1); Chris@0: Chris@0: num_window = length(winLenSTMSP); Chris@0: f_pitch_energy = cell(num_window,1); Chris@0: seg_pcm_num = cell(num_window,1); Chris@0: seg_pcm_start = cell(num_window,1); Chris@0: seg_pcm_stop = cell(num_window,1); Chris@0: for w=1:num_window; Chris@0: step_size = winLenSTMSP(w)-winOvSTMSP(w); Chris@0: group_delay = round(winLenSTMSP(w)/2); Chris@0: seg_pcm_start{w} = [1 1:step_size:wav_size]'; %group delay is adjusted Chris@0: seg_pcm_stop{w} = min(seg_pcm_start{w}+winLenSTMSP(w),wav_size); Chris@0: seg_pcm_stop{w}(1) = min(group_delay,wav_size); Chris@0: seg_pcm_num{w} = size(seg_pcm_start{w},1); Chris@0: f_pitch_energy{w} = zeros(120,seg_pcm_num{w}); Chris@0: end Chris@0: Chris@0: Chris@0: for p=parameter.midiMin:parameter.midiMax Chris@0: fprintf('\b\b\b\b');fprintf('%4i',p); Chris@0: index = fs_index(p); Chris@0: f_filtfilt = filtfilt(h(p).b, h(p).a, pcm_ds{index}); Chris@0: f_square = f_filtfilt.^2; Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % f_pitch_energy Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: for w=1:length(winLenSTMSP) Chris@0: factor = (parameter.fs/fs_pitch(p)); %adjustment for sampling rate Chris@0: for k=1:seg_pcm_num{w} Chris@0: start = ceil((seg_pcm_start{w}(k)/parameter.fs)*fs_pitch(p)); Chris@0: stop = floor((seg_pcm_stop{w}(k)/parameter.fs)*fs_pitch(p)); Chris@0: f_pitch_energy{w}(p,k)=sum(f_square(start:stop))*factor; Chris@0: end Chris@0: end Chris@0: end Chris@0: fprintf('\n'); Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Save f_pitch_energy for each window size separately as f_pitch Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: sideinfo.pitch.version = 1; Chris@0: sideinfo.pitch.midiMin = parameter.midiMin; Chris@0: sideinfo.pitch.midiMax = parameter.midiMax; Chris@0: if parameter.save == 1 Chris@0: for w=1:num_window; Chris@0: f_pitch = f_pitch_energy{w}; Chris@0: sideinfo.pitch.winLenSTMSP = winLenSTMSP(w); Chris@0: sideinfo.pitch.winOvSTMSP = winOvSTMSP(w); Chris@0: sideinfo.pitch.featureRate = featureRate(w); Chris@0: sideinfo.pitch.shiftFB = parameter.shiftFB; Chris@0: sideinfo.pitch.featuresAreTuned = 0; Chris@0: if parameter.saveAsTuned Chris@0: sideinfo.pitch.featuresAreTuned = 1; Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w))); Chris@0: else Chris@0: switch(parameter.shiftFB) Chris@0: case 0 Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w))); Chris@0: case 1 Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusQuarter'); Chris@0: case 2 Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusThird'); Chris@0: case 3 Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusHalf'); Chris@0: case 4 Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusTwoThird'); Chris@0: case 5 Chris@0: filename = strcat(parameter.saveFilename,'_pitch_',num2str(winLenSTMSP(w)),'_minusThreeQuarter'); Chris@0: end Chris@0: end Chris@0: save(strcat(parameter.saveDir,filename),'f_pitch','sideinfo'); Chris@0: end Chris@0: else Chris@0: f_pitch = f_pitch_energy{num_window}; Chris@0: sideinfo.pitch.winLenSTMSP = winLenSTMSP(num_window); Chris@0: sideinfo.pitch.winOvSTMSP = winOvSTMSP(num_window); Chris@0: sideinfo.pitch.featureRate = featureRate(num_window); Chris@0: sideinfo.pitch.shiftFB = parameter.shiftFB; Chris@0: end Chris@0: Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: % Visualization Chris@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chris@0: if parameter.visualize == 1 Chris@0: for w=1:num_window; Chris@0: parameterVis.featureRate = featureRate(w); Chris@0: visualizePitch(f_pitch_energy{w},parameterVis); Chris@0: end Chris@0: end Chris@0: Chris@0: end Chris@0: Chris@0: