Dawn@4
|
1 function [ASF] = AudioSpectralFlatness(raw, fs, noOfFrames, frameLength)
|
Dawn@4
|
2
|
Dawn@4
|
3 check this works!
|
Dawn@4
|
4
|
Dawn@4
|
5 hopSize = frameLength;
|
Dawn@4
|
6 windowsize = frameLength;
|
Dawn@4
|
7 FFTsize = frameLength;
|
Dawn@4
|
8 windowType = hamming(frameLength);
|
Dawn@4
|
9
|
Dawn@4
|
10 % bin = fs/512;
|
Dawn@4
|
11 % bandsNumber = 24;
|
Dawn@4
|
12 % loEdge = 250;
|
Dawn@4
|
13 % hiEdege = 16000;
|
Dawn@4
|
14
|
Dawn@4
|
15
|
Dawn@4
|
16 loEdge = 250;
|
Dawn@4
|
17 hiEdge = 16000; % Setting default hiedge
|
Dawn@4
|
18
|
Dawn@4
|
19 if (hiEdge >= fs/2) % Check if value for hiedge is valid
|
Dawn@4
|
20 % sr/2-1 : Skipping extraction up to sr/2; Not possible due to 5 percent band overlap
|
Dawn@4
|
21 hiEdge = min(hiEdge,fs/2-1);
|
Dawn@4
|
22 end
|
Dawn@4
|
23 hiEdge = 2^(floor(log2(hiEdge/1000)*4)/4)*1000 ; % Setting exact value for hiEdge, rounding to next lower frequency if necessary
|
Dawn@4
|
24 if (hiEdge*1.05 >= fs/2)
|
Dawn@4
|
25 hiEdge = hiEdge/2^0.25 ;
|
Dawn@4
|
26 end; %Now it's possible to check if hiEdge is valid
|
Dawn@4
|
27
|
Dawn@4
|
28 N = frameLength;
|
Dawn@4
|
29
|
Dawn@4
|
30 numbands = floor(4*log2(hiEdge/loEdge));
|
Dawn@4
|
31 firstband = round(log2(loEdge/1000)*4);
|
Dawn@4
|
32 overlap = 0.05;
|
Dawn@4
|
33 grpsize = 1;
|
Dawn@4
|
34
|
Dawn@4
|
35 [fftout,phase] = mpeg7getspec( raw, fs, hopSize, windowsize, windowType, FFTsize );
|
Dawn@4
|
36 band=[];
|
Dawn@4
|
37 for k = 1:numbands
|
Dawn@4
|
38 f_lo = loEdge * (2^((k-1)/4)) * (1-overlap);
|
Dawn@4
|
39 f_hi = loEdge * (2^((k )/4)) * (1+overlap);
|
Dawn@4
|
40
|
Dawn@4
|
41 i_lo = round( f_lo/(fs/N) ) + 1;
|
Dawn@4
|
42 i_hi = round( f_hi/(fs/N) ) + 1;
|
Dawn@4
|
43
|
Dawn@4
|
44 fband(k,1) = f_lo;
|
Dawn@4
|
45 fband(k,2) = f_hi;
|
Dawn@4
|
46
|
Dawn@4
|
47 iband(k,1) = i_lo;
|
Dawn@4
|
48 iband(k,2) = i_hi;
|
Dawn@4
|
49
|
Dawn@4
|
50 % Rounding of upper index according due to coefficient grouping
|
Dawn@4
|
51 if (k+firstband-1 >= 0) %Start grouping at 1kHz
|
Dawn@4
|
52 grpsize = 2^ceil( (k+firstband )/4);
|
Dawn@4
|
53 i_hi = round((i_hi-i_lo+1)/grpsize)*grpsize + i_lo-1 ;
|
Dawn@4
|
54 else
|
Dawn@4
|
55 grpsize = 1;
|
Dawn@4
|
56 end
|
Dawn@4
|
57 tmp = fftout(i_lo:i_hi,:) .^ 2; % PSD coefficients
|
Dawn@4
|
58 ncoeffs = i_hi - i_lo + 1;
|
Dawn@4
|
59
|
Dawn@4
|
60 if (k+firstband-1 >= 0) % Coefficient grouping
|
Dawn@4
|
61 tmp2 = tmp(1:grpsize:ncoeffs,:);
|
Dawn@4
|
62 for g=2:grpsize
|
Dawn@4
|
63 tmp2 = tmp2 + tmp(g:grpsize:ncoeffs,:) ;
|
Dawn@4
|
64 end
|
Dawn@4
|
65 tmp = tmp2;
|
Dawn@4
|
66 end
|
Dawn@4
|
67 % Actual calculation
|
Dawn@4
|
68 ncoeffs = ncoeffs/grpsize ;
|
Dawn@4
|
69 tmp = tmp + 1e-50; % avoid underflow for zero signals
|
Dawn@4
|
70 gm(k,:) = exp( sum(log(tmp))/ncoeffs ); % log processing avoids overflow
|
Dawn@4
|
71 am(k,:) = sum(tmp) / ncoeffs;
|
Dawn@4
|
72 end
|
Dawn@4
|
73 ASF = (gm./am)';
|
Dawn@4
|
74
|
Dawn@4
|
75 % myColor = 'rx';
|
Dawn@4
|
76 % for i=1:(length(raw)/frameLength)
|
Dawn@4
|
77 % subplot(411); plot( raw( (i-1)*frameLength+1 : (i*frameLength) ));
|
Dawn@4
|
78 % subplot(412); plot( fftout(:,i) );
|
Dawn@4
|
79 % subplot(425); plot( i, ASF(i,1), myColor ); hold on;
|
Dawn@4
|
80 % subplot(426); plot( i, ASF(i,2), myColor ); hold on;
|
Dawn@4
|
81 % subplot(427); plot( i, ASF(i,3), myColor ); hold on;
|
Dawn@4
|
82 % subplot(428); plot( i, ASF(i,4), myColor ); hold on;
|
Dawn@4
|
83 % end
|
Dawn@4
|
84 % lo_edge = loEdge;
|
Dawn@4
|
85 % hi_edge = hiEdge;
|
Dawn@4
|
86
|
Dawn@4
|
87 % for n = 1:noOfFrames
|
Dawn@4
|
88 % j = (n-1) * 512 + 1;
|
Dawn@4
|
89 % k = n * 512;
|
Dawn@4
|
90 % if(k<=length(raw))
|
Dawn@4
|
91 % temp = raw(j:k);
|
Dawn@4
|
92 % end
|
Dawn@4
|
93 % if(k>length(raw))
|
Dawn@4
|
94 %
|
Dawn@4
|
95 % temp = [raw(j:end)' zeros(512-length(raw(j:end)),1)'];
|
Dawn@4
|
96 % end
|
Dawn@4
|
97 %
|
Dawn@4
|
98 % FFTX=fft(temp,hopSize);
|
Dawn@4
|
99 % subplot(311); plot(abs(FFTX(1:length(FFTX)/2)));
|
Dawn@4
|
100 % BW=1.5*fs*1024;
|
Dawn@4
|
101 % PSD=FFTX/BW;
|
Dawn@4
|
102 %
|
Dawn@4
|
103 % for b = 1:24
|
Dawn@4
|
104 % floKb = 0.95*loEdge * 2^(0.25*b-0.25);
|
Dawn@4
|
105 % fhiKb = 1.05*loEdge * 2^(0.25*b);
|
Dawn@4
|
106 % lowKbp = round( floKb/(fs/512) ) + 1;
|
Dawn@4
|
107 % hiKbp = round( fhiKb/(fs/512) ) + 1;
|
Dawn@4
|
108 %
|
Dawn@4
|
109 % if (b-9 >= 0)
|
Dawn@4
|
110 % groupSize = 2^ceil( (b-8)/4);
|
Dawn@4
|
111 % hiKbp = round((hiKbp-lowKbp+1)/groupSize)*groupSize + lowKbp -1 ;
|
Dawn@4
|
112 % else
|
Dawn@4
|
113 % groupSize = 1;
|
Dawn@4
|
114 % end
|
Dawn@4
|
115 %
|
Dawn@4
|
116 % newtemp = PSD(lowKbp:hiKbp).*conj(PSD(lowKbp:hiKbp));
|
Dawn@4
|
117 %
|
Dawn@4
|
118 % if (b-9 >= 0)
|
Dawn@4
|
119 % temp1 = newtemp(1:groupSize:(hiKbp-lowKbp+1)) ;
|
Dawn@4
|
120 % for i=2:groupSize
|
Dawn@4
|
121 % temp1 = temp1 + newtemp(i:groupSize:(hiKbp-lowKbp+1)) ;
|
Dawn@4
|
122 % end
|
Dawn@4
|
123 % newtemp = temp1;
|
Dawn@4
|
124 % end
|
Dawn@4
|
125 % GM(b,n) = exp( sum(log(newtemp))/ (hiKbp-lowKbp+1));
|
Dawn@4
|
126 % AM(b,n) = sum(newtemp) / (hiKbp-lowKbp+1);
|
Dawn@4
|
127 % end
|
Dawn@4
|
128 % ASF = (GM./AM)';
|
Dawn@4
|
129 % subplot(312); plot(temp);subplot(313); plot(ASF(n,1:6));
|
Dawn@4
|
130 % end
|
Dawn@4
|
131
|
Dawn@4
|
132
|
Dawn@4
|
133
|