matthiasm@8
|
1 function [spec] = chromaframe(x,spark);
|
matthiasm@8
|
2 % function [spec,mfcc,cq,hpcp,chroma] = chromaframe(x,spark);
|
matthiasm@8
|
3
|
matthiasm@8
|
4 % function to return spectrogram, constq, hpcp and chromagram
|
matthiasm@8
|
5 % for one single frame of arbitrary length
|
matthiasm@8
|
6 % with the possible inclusion of an adaptive thresholding stage.
|
matthiasm@8
|
7
|
matthiasm@8
|
8 fmin = 110;
|
matthiasm@8
|
9 fmax = 880;
|
matthiasm@8
|
10
|
matthiasm@8
|
11 if nargin<2
|
matthiasm@8
|
12 spark = sparsekernel(fmin, fmax, 36, 44100/16, 0.054);
|
matthiasm@8
|
13 spark(1025:end,:) = [];
|
matthiasm@8
|
14 end
|
matthiasm@8
|
15
|
matthiasm@8
|
16
|
matthiasm@8
|
17 % make x a row vector
|
matthiasm@8
|
18 x = x(:)';
|
matthiasm@8
|
19 x2 = x;
|
matthiasm@8
|
20 fs = 44100;
|
matthiasm@8
|
21 % downsample by a factor of 16.
|
matthiasm@8
|
22 %x = x(1:16:end);
|
matthiasm@8
|
23 % x = resample(x,11025,44100);
|
matthiasm@8
|
24 x = resample(x,2756,11024);
|
matthiasm@8
|
25 % x = resample(x,11024,44096);
|
matthiasm@8
|
26
|
matthiasm@8
|
27 len = length(x);
|
matthiasm@8
|
28
|
matthiasm@8
|
29
|
matthiasm@8
|
30 % make windowing function
|
matthiasm@8
|
31 w = hanningz(len);
|
matthiasm@8
|
32 w = w(:)';
|
matthiasm@8
|
33 % w = ones(1,length(x)); % or no windowing... shouldn't be better..
|
matthiasm@8
|
34 % take fft
|
matthiasm@8
|
35 spec = abs(fft(w.*x,2048));
|
matthiasm@8
|
36 spec = adapt_thresh(spec(1:1024),16,15);
|
matthiasm@8
|
37
|
matthiasm@8
|
38 % %spec = spec(1:1024);
|
matthiasm@8
|
39 %
|
matthiasm@8
|
40 % %cq = adapt_thresh(abs(spec*spark));
|
matthiasm@8
|
41 % cq = abs(spec*spark);
|
matthiasm@8
|
42 % hpcp = zeros(1,36);
|
matthiasm@8
|
43 %
|
matthiasm@8
|
44 % for k=1:36
|
matthiasm@8
|
45 % hpcp(k) = sum(abs(cq(k:36:end)));
|
matthiasm@8
|
46 % end
|
matthiasm@8
|
47 %
|
matthiasm@8
|
48 % %hpcp = adapt_thresh(hpcp,2,3);
|
matthiasm@8
|
49 %
|
matthiasm@8
|
50 % % for k=1:round(abs(log2(fmax/fmin))),
|
matthiasm@8
|
51 % % l(k) = sum(hpcp(k:3:end));
|
matthiasm@8
|
52 % % end
|
matthiasm@8
|
53 % %
|
matthiasm@8
|
54 % % [val,ind] = max(l);
|
matthiasm@8
|
55 % %
|
matthiasm@8
|
56 % % chroma = hpcp(ind:3:end);
|
matthiasm@8
|
57 % %
|
matthiasm@8
|
58 % for i=1:12 % sum bins..
|
matthiasm@8
|
59 % chroma(i) = sum(hpcp((i-1)*3+1:3*i));
|
matthiasm@8
|
60 % end
|
matthiasm@8
|
61
|
matthiasm@8
|
62
|
matthiasm@8
|
63 %chroma = adapt_thresh(chroma,3,2);
|
matthiasm@8
|
64
|
matthiasm@8
|
65 % % modulated complex lapped transform
|
matthiasm@8
|
66 % % spec = abs(fmclt(x',1024)');
|
matthiasm@8
|
67 % % spec = adapt_thresh(spec);
|
matthiasm@8
|
68 %
|
matthiasm@8
|
69 % % % try to treat everything as gaussians
|
matthiasm@8
|
70 % % n = 1:length(cq);
|
matthiasm@8
|
71 % % mu = sum(n.*cq)/sum(cq);
|
matthiasm@8
|
72 % % sigma = sqrt(sum((n-mu).^2)/sum(cq));
|
matthiasm@8
|
73 % % cq = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
|
matthiasm@8
|
74 % %
|
matthiasm@8
|
75 % % n = 1:length(hpcp);
|
matthiasm@8
|
76 % % mu = sum(n.*hpcp)/sum(hpcp);
|
matthiasm@8
|
77 % % sigma = sqrt(sum((n-mu).^2)/sum(hpcp));
|
matthiasm@8
|
78 % % hpcp = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
|
matthiasm@8
|
79 % %
|
matthiasm@8
|
80 % % n = 1:length(chroma);
|
matthiasm@8
|
81 % % mu = sum(n.*chroma)/sum(chroma);
|
matthiasm@8
|
82 % % sigma = sqrt(sum((n-mu).^2)/sum(chroma));
|
matthiasm@8
|
83 % % chroma = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
|
matthiasm@8
|
84 % %
|
matthiasm@8
|
85 % % n = 1:length(spec);
|
matthiasm@8
|
86 % % mu = sum(n.*spec)/sum(spec);
|
matthiasm@8
|
87 % % sigma = sqrt(sum((n-mu).^2)/sum(spec));
|
matthiasm@8
|
88 % % spec = exp(-0.5 * ((n - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
|
matthiasm@8
|
89 %
|
matthiasm@8
|
90 % %x2 = resample(x2,8000,44100);
|
matthiasm@8
|
91 % %spec = mfcc(x',8000,100);
|
matthiasm@8
|
92 % %spec = abs(sum(spec'))';
|
matthiasm@8
|
93 %
|
matthiasm@8
|
94 % x2 = x2(1:4:end);
|
matthiasm@8
|
95 % spec2 = abs(fft(hanning(length(x2))'.*x2,2048));
|
matthiasm@8
|
96 % spec2 = spec2(1:1024);
|
matthiasm@8
|
97 % mlmx = fft2melmx(1024,round(44100/16),40);
|
matthiasm@8
|
98 % [size(mlmx) size(spec2)];
|
matthiasm@8
|
99 % mfcc = 20*log10(1+spec*mlmx');
|
matthiasm@8
|
100 % spec = 20*log10(1+spec*mlmx');
|
matthiasm@8
|
101
|
matthiasm@8
|
102 % spec = adapt_thresh(mfcc,2,3);
|
matthiasm@8
|
103 % x2 = resample(x2,1378,44096);
|
matthiasm@8
|
104 % len = length(x2);
|
matthiasm@8
|
105 % w = hanningz(len);
|
matthiasm@8
|
106 % w = w(:)';
|
matthiasm@8
|
107 % % take fft
|
matthiasm@8
|
108 % spec = abs(fft(w.*x2,1024));
|
matthiasm@8
|
109 % spec = adapt_thresh(spec(1:512),16,15);
|
matthiasm@8
|
110 spec = spec(1:512);
|
matthiasm@8
|
111 % mlmx = fft2melmx(512,round(44100),40);
|
matthiasm@8
|
112 % spec = spec*mlmx'; |