matthiasm@8: function [spec] = chromaframe(x,spark); matthiasm@8: % function [spec,mfcc,cq,hpcp,chroma] = chromaframe(x,spark); matthiasm@8: matthiasm@8: % function to return spectrogram, constq, hpcp and chromagram matthiasm@8: % for one single frame of arbitrary length matthiasm@8: % with the possible inclusion of an adaptive thresholding stage. matthiasm@8: matthiasm@8: fmin = 110; matthiasm@8: fmax = 880; matthiasm@8: matthiasm@8: if nargin<2 matthiasm@8: spark = sparsekernel(fmin, fmax, 36, 44100/16, 0.054); matthiasm@8: spark(1025:end,:) = []; matthiasm@8: end matthiasm@8: matthiasm@8: matthiasm@8: % make x a row vector matthiasm@8: x = x(:)'; matthiasm@8: x2 = x; matthiasm@8: fs = 44100; matthiasm@8: % downsample by a factor of 16. matthiasm@8: %x = x(1:16:end); matthiasm@8: % x = resample(x,11025,44100); matthiasm@8: x = resample(x,2756,11024); matthiasm@8: % x = resample(x,11024,44096); matthiasm@8: matthiasm@8: len = length(x); matthiasm@8: matthiasm@8: matthiasm@8: % make windowing function matthiasm@8: w = hanningz(len); matthiasm@8: w = w(:)'; matthiasm@8: % w = ones(1,length(x)); % or no windowing... shouldn't be better.. matthiasm@8: % take fft matthiasm@8: spec = abs(fft(w.*x,2048)); matthiasm@8: spec = adapt_thresh(spec(1:1024),16,15); matthiasm@8: matthiasm@8: % %spec = spec(1:1024); matthiasm@8: % matthiasm@8: % %cq = adapt_thresh(abs(spec*spark)); matthiasm@8: % cq = abs(spec*spark); matthiasm@8: % hpcp = zeros(1,36); matthiasm@8: % matthiasm@8: % for k=1:36 matthiasm@8: % hpcp(k) = sum(abs(cq(k:36:end))); matthiasm@8: % end matthiasm@8: % matthiasm@8: % %hpcp = adapt_thresh(hpcp,2,3); matthiasm@8: % matthiasm@8: % % for k=1:round(abs(log2(fmax/fmin))), matthiasm@8: % % l(k) = sum(hpcp(k:3:end)); matthiasm@8: % % end matthiasm@8: % % matthiasm@8: % % [val,ind] = max(l); matthiasm@8: % % matthiasm@8: % % chroma = hpcp(ind:3:end); matthiasm@8: % % matthiasm@8: % for i=1:12 % sum bins.. matthiasm@8: % chroma(i) = sum(hpcp((i-1)*3+1:3*i)); matthiasm@8: % end matthiasm@8: matthiasm@8: matthiasm@8: %chroma = adapt_thresh(chroma,3,2); matthiasm@8: matthiasm@8: % % modulated complex lapped transform matthiasm@8: % % spec = abs(fmclt(x',1024)'); matthiasm@8: % % spec = adapt_thresh(spec); matthiasm@8: % matthiasm@8: % % % try to treat everything as gaussians matthiasm@8: % % n = 1:length(cq); matthiasm@8: % % mu = sum(n.*cq)/sum(cq); matthiasm@8: % % sigma = sqrt(sum((n-mu).^2)/sum(cq)); matthiasm@8: % % cq = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma); matthiasm@8: % % matthiasm@8: % % n = 1:length(hpcp); matthiasm@8: % % mu = sum(n.*hpcp)/sum(hpcp); matthiasm@8: % % sigma = sqrt(sum((n-mu).^2)/sum(hpcp)); matthiasm@8: % % hpcp = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma); matthiasm@8: % % matthiasm@8: % % n = 1:length(chroma); matthiasm@8: % % mu = sum(n.*chroma)/sum(chroma); matthiasm@8: % % sigma = sqrt(sum((n-mu).^2)/sum(chroma)); matthiasm@8: % % chroma = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma); matthiasm@8: % % matthiasm@8: % % n = 1:length(spec); matthiasm@8: % % mu = sum(n.*spec)/sum(spec); matthiasm@8: % % sigma = sqrt(sum((n-mu).^2)/sum(spec)); matthiasm@8: % % spec = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma); matthiasm@8: % matthiasm@8: % %x2 = resample(x2,8000,44100); matthiasm@8: % %spec = mfcc(x',8000,100); matthiasm@8: % %spec = abs(sum(spec'))'; matthiasm@8: % matthiasm@8: % x2 = x2(1:4:end); matthiasm@8: % spec2 = abs(fft(hanning(length(x2))'.*x2,2048)); matthiasm@8: % spec2 = spec2(1:1024); matthiasm@8: % mlmx = fft2melmx(1024,round(44100/16),40); matthiasm@8: % [size(mlmx) size(spec2)]; matthiasm@8: % mfcc = 20*log10(1+spec*mlmx'); matthiasm@8: % spec = 20*log10(1+spec*mlmx'); matthiasm@8: matthiasm@8: % spec = adapt_thresh(mfcc,2,3); matthiasm@8: % x2 = resample(x2,1378,44096); matthiasm@8: % len = length(x2); matthiasm@8: % w = hanningz(len); matthiasm@8: % w = w(:)'; matthiasm@8: % % take fft matthiasm@8: % spec = abs(fft(w.*x2,1024)); matthiasm@8: % spec = adapt_thresh(spec(1:512),16,15); matthiasm@8: spec = spec(1:512); matthiasm@8: % mlmx = fft2melmx(512,round(44100),40); matthiasm@8: % spec = spec*mlmx';