Dimitrios@0: function [intCQT] = computeCQT(y) Dimitrios@0: % Settings for computing CQT for music signals (by E. Benetos) Dimitrios@0: Dimitrios@0: % COMPUTING A CQT WITH 40ms STEP AND BASIC NOISE REDUCTION: Dimitrios@0: %[intCQT] = computeCQT(filename); Dimitrios@0: %X = intCQT(:,round(1:7.1128:size(intCQT,2)))'; Dimitrios@0: %noiseLevel1 = medfilt1(X',40); Dimitrios@0: %noiseLevel2 = medfilt1(min(X',noiseLevel1),40); Dimitrios@0: %X = max(X-noiseLevel2',0); Dimitrios@0: %Y = X(1:4:size(X,1),:); % 40ms step Dimitrios@0: Dimitrios@0: Dimitrios@0: % Load .wav file Dimitrios@0: %[x fs bits] = wavread(filename); Dimitrios@0: %if (size(x,2) == 2) y = mean(x')'; clear('x'); else y=x; clear('x'); end; Dimitrios@0: %if (fs ~= 44100) y = resample(y,44100,fs); end; Dimitrios@0: %y = 0.5*y/max(y); Dimitrios@0: fs = 44100; Dimitrios@0: Dimitrios@0: Dimitrios@0: % Compute CQT Dimitrios@0: Xcqt = cqt(y,27.5,fs/3,60,fs,'q',0.80,'atomHopFactor',0.3,'thresh',0.0005,'win','hann'); Dimitrios@0: %Xcqt = cqt(y,27.5,fs/3,120,fs,'q',0.35,'atomHopFactor',0.3,'thresh',0.0005,'win','hann'); % old resolution Dimitrios@0: absCQT = getCQT(Xcqt,'all','all'); Dimitrios@0: Dimitrios@0: % Crop CQT to useful time regions Dimitrios@0: emptyHops = Xcqt.intParams.firstcenter/Xcqt.intParams.atomHOP; Dimitrios@0: maxDrop = emptyHops*2^(Xcqt.octaveNr-1)-emptyHops; Dimitrios@0: droppedSamples = (maxDrop-1)*Xcqt.intParams.atomHOP + Xcqt.intParams.firstcenter; Dimitrios@0: outputTimeVec = (1:size(absCQT,2))*Xcqt.intParams.atomHOP-Xcqt.intParams.preZeros+droppedSamples; Dimitrios@0: Dimitrios@0: lowerLim = find(outputTimeVec>0,1); Dimitrios@0: upperLim = find(outputTimeVec>length(y),1)-1; Dimitrios@0: Dimitrios@0: %intCQT = absCQT(112:1200,lowerLim:upperLim); % old resolution Dimitrios@0: intCQT = absCQT(56:600,lowerLim:upperLim); Dimitrios@0: Dimitrios@0: Dimitrios@0: %figure; imagesc(imrotate(abs(intCQT),90)); Dimitrios@0: