Mercurial > hg > mauch-mirex-2010
diff _misc/featureextraction/.svn/text-base/chunkspectrogram.m.svn-base @ 8:b5b38998ef3b
added all that other stuff
author | matthiasm |
---|---|
date | Fri, 11 Apr 2014 15:54:25 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/_misc/featureextraction/.svn/text-base/chunkspectrogram.m.svn-base Fri Apr 11 15:54:25 2014 +0100 @@ -0,0 +1,70 @@ +function [s,f,t] = chunkspectrogram(filename,d_windo,d_nOverlap,d_nFFT, maxf) +%% +% d_ are the downsampled things +% o_ are the original things + + +d_fs = 11025; + +[temp, o_fs] = wavread(filename,'size'); + +if mod(o_fs/d_fs,1) ~= 0 + error('The sample frequency of the wave file has to be an integer multiple of %1.0f.',d_fs); +end + +o_nSample = temp(1); +d_nSample = floor(o_nSample*d_fs/o_fs); + +o_nOverlap = d_nOverlap * o_fs/d_fs; + + +d_nSamplePerChunk = d_windo+200*(d_windo-d_nOverlap); + +if d_nSample < d_nSamplePerChunk + d_nSamplePerChunk = d_nSample; +end + +d_endsample = d_nSamplePerChunk:d_nSamplePerChunk:d_nSample; + +o_startsample = [1, d_endsample * o_fs / d_fs + 1]; +o_endsample = d_endsample * o_fs / d_fs; +o_endsample = min(o_endsample + o_fs / d_fs * d_nOverlap, o_nSample); % extend so that chunks overlap + +% in most cases the file length is not exactly a multiple of +if o_endsample(end) < o_nSample + o_endsample = [o_endsample o_nSample]; +end + +%% + +nChunk = length(o_startsample); + +for iChunk = 1:nChunk + fprintf(1,'_'); +end +leftpad = zeros(d_windo/2,1); +fprintf(1,'\n.') +x = resample(mean(wavread(filename,[o_startsample(1) o_endsample(1)]),2),d_fs,o_fs); +s = spectrogram([leftpad; x], d_windo,d_nOverlap,d_nFFT, d_fs); +f = (0:d_nFFT/2-1)/d_nFFT*d_fs; +if maxf < max(f) + maxbin = find(f>maxf,1)-1; +else + maxbin = length(f); +end +s = s(1:maxbin,:); +f = f(1:maxbin); +for iChunk = 2:nChunk-1 + fprintf(1,'.') + temps = spectrogram(resample(mean(wavread(filename,[o_startsample(iChunk) o_endsample(iChunk)]),2),d_fs,o_fs), ... + d_windo,d_nOverlap,d_nFFT, d_fs); + s = [s(1:maxbin,:),temps(1:maxbin,:)]; +end +x = resample(mean(wavread(filename,[o_startsample(nChunk) o_nSample]),2),d_fs,o_fs); +if length(x)>d_windo + temps = spectrogram(x, ... + d_windo,d_nOverlap,d_nFFT, d_fs); + s = [s(1:maxbin,:),temps(1:maxbin,:)]; +end +fprintf(1,'.\n') +t = (0:size(s,2)-1) * (d_windo-d_nOverlap)/d_fs;