Mercurial > hg > emotion-detection-top-level
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Code/Descriptors/Matlab/MPEG7/AudioSpectralFlatness.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,133 @@ +function [ASF] = AudioSpectralFlatness(raw, fs, noOfFrames, frameLength) + +check this works! + +hopSize = frameLength; +windowsize = frameLength; +FFTsize = frameLength; +windowType = hamming(frameLength); + +% bin = fs/512; +% bandsNumber = 24; +% loEdge = 250; +% hiEdege = 16000; + + +loEdge = 250; +hiEdge = 16000; % Setting default hiedge + +if (hiEdge >= fs/2) % Check if value for hiedge is valid + % sr/2-1 : Skipping extraction up to sr/2; Not possible due to 5 percent band overlap + hiEdge = min(hiEdge,fs/2-1); +end +hiEdge = 2^(floor(log2(hiEdge/1000)*4)/4)*1000 ; % Setting exact value for hiEdge, rounding to next lower frequency if necessary +if (hiEdge*1.05 >= fs/2) + hiEdge = hiEdge/2^0.25 ; +end; %Now it's possible to check if hiEdge is valid + +N = frameLength; + +numbands = floor(4*log2(hiEdge/loEdge)); +firstband = round(log2(loEdge/1000)*4); +overlap = 0.05; +grpsize = 1; + +[fftout,phase] = mpeg7getspec( raw, fs, hopSize, windowsize, windowType, FFTsize ); +band=[]; +for k = 1:numbands + f_lo = loEdge * (2^((k-1)/4)) * (1-overlap); + f_hi = loEdge * (2^((k )/4)) * (1+overlap); + + i_lo = round( f_lo/(fs/N) ) + 1; + i_hi = round( f_hi/(fs/N) ) + 1; + + fband(k,1) = f_lo; + fband(k,2) = f_hi; + + iband(k,1) = i_lo; + iband(k,2) = i_hi; + + % Rounding of upper index according due to coefficient grouping + if (k+firstband-1 >= 0) %Start grouping at 1kHz + grpsize = 2^ceil( (k+firstband )/4); + i_hi = round((i_hi-i_lo+1)/grpsize)*grpsize + i_lo-1 ; + else + grpsize = 1; + end + tmp = fftout(i_lo:i_hi,:) .^ 2; % PSD coefficients + ncoeffs = i_hi - i_lo + 1; + + if (k+firstband-1 >= 0) % Coefficient grouping + tmp2 = tmp(1:grpsize:ncoeffs,:); + for g=2:grpsize + tmp2 = tmp2 + tmp(g:grpsize:ncoeffs,:) ; + end + tmp = tmp2; + end + % Actual calculation + ncoeffs = ncoeffs/grpsize ; + tmp = tmp + 1e-50; % avoid underflow for zero signals + gm(k,:) = exp( sum(log(tmp))/ncoeffs ); % log processing avoids overflow + am(k,:) = sum(tmp) / ncoeffs; +end +ASF = (gm./am)'; + +% myColor = 'rx'; +% for i=1:(length(raw)/frameLength) +% subplot(411); plot( raw( (i-1)*frameLength+1 : (i*frameLength) )); +% subplot(412); plot( fftout(:,i) ); +% subplot(425); plot( i, ASF(i,1), myColor ); hold on; +% subplot(426); plot( i, ASF(i,2), myColor ); hold on; +% subplot(427); plot( i, ASF(i,3), myColor ); hold on; +% subplot(428); plot( i, ASF(i,4), myColor ); hold on; +% end +% lo_edge = loEdge; +% hi_edge = hiEdge; + +% for n = 1:noOfFrames +% j = (n-1) * 512 + 1; +% k = n * 512; +% if(k<=length(raw)) +% temp = raw(j:k); +% end +% if(k>length(raw)) +% +% temp = [raw(j:end)' zeros(512-length(raw(j:end)),1)']; +% end +% +% FFTX=fft(temp,hopSize); +% subplot(311); plot(abs(FFTX(1:length(FFTX)/2))); +% BW=1.5*fs*1024; +% PSD=FFTX/BW; +% +% for b = 1:24 +% floKb = 0.95*loEdge * 2^(0.25*b-0.25); +% fhiKb = 1.05*loEdge * 2^(0.25*b); +% lowKbp = round( floKb/(fs/512) ) + 1; +% hiKbp = round( fhiKb/(fs/512) ) + 1; +% +% if (b-9 >= 0) +% groupSize = 2^ceil( (b-8)/4); +% hiKbp = round((hiKbp-lowKbp+1)/groupSize)*groupSize + lowKbp -1 ; +% else +% groupSize = 1; +% end +% +% newtemp = PSD(lowKbp:hiKbp).*conj(PSD(lowKbp:hiKbp)); +% +% if (b-9 >= 0) +% temp1 = newtemp(1:groupSize:(hiKbp-lowKbp+1)) ; +% for i=2:groupSize +% temp1 = temp1 + newtemp(i:groupSize:(hiKbp-lowKbp+1)) ; +% end +% newtemp = temp1; +% end +% GM(b,n) = exp( sum(log(newtemp))/ (hiKbp-lowKbp+1)); +% AM(b,n) = sum(newtemp) / (hiKbp-lowKbp+1); +% end +% ASF = (GM./AM)'; +% subplot(312); plot(temp);subplot(313); plot(ASF(n,1:6)); +% end + + +