annotate Code/Descriptors/Matlab/MPEG7/AudioSpectralFlatness.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents
children
rev   line source
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