matthiasm@8: matthiasm@8: % segment audio data into overlapping frames and take fft of each frame matthiasm@8: matthiasm@8: function fftframes = myframefft(audiodata, winlength, overlap, windowkind, varargin) matthiasm@8: matthiasm@8: if nargin > 4 matthiasm@8: nPad = varargin{1}; matthiasm@8: zeropadding = true; matthiasm@8: end matthiasm@8: matthiasm@8: fprintf(1,''); matthiasm@8: matthiasm@8: win = winlength; matthiasm@8: matthiasm@8: % Pad audio with zeros so that first analysis frame corresponds with first matthiasm@8: % audio sample matthiasm@8: matthiasm@8: pad = zeros((win/2),1); matthiasm@8: matthiasm@8: %audiodata = [pad; audiodata; pad]; matthiasm@8: matthiasm@8: % find size of input matthiasm@8: ilength = length(audiodata); matthiasm@8: matthiasm@8: matthiasm@8: %pad audio data matthiasm@8: audiodata = [pad; audiodata; pad]; matthiasm@8: matthiasm@8: % set hop size matthiasm@8: hop = fix(win.*overlap); matthiasm@8: matthiasm@8: % set number of windows matthiasm@8: num_win = ceil((ilength+1)/win/overlap); matthiasm@8: matthiasm@8: start=1; matthiasm@8: matthiasm@8: fftframes = zeros(win,num_win); matthiasm@8: matthiasm@8: check = ceil(num_win/10); matthiasm@8: matthiasm@8: if windowkind == 'hamming' matthiasm@8: window = hamming(win); matthiasm@8: else matthiasm@8: window = rectwin(win); matthiasm@8: end matthiasm@8: matthiasm@8: matthiasm@8: % do fft analysis for each window: matthiasm@8: for i = 1 : num_win; matthiasm@8: start = floor(win * overlap * (i-1) + 1); matthiasm@8: if ~zeropadding matthiasm@8: segment = window .* audiodata(start:(start + win - 1)); matthiasm@8: fftframes(:,i) = fft(segment, win)'; matthiasm@8: else matthiasm@8: segment = [window .* audiodata(start:(start + win - 1)) zeros(nPad*win)]; matthiasm@8: fftframes(:,i) = fft(segment, win)'; matthiasm@8: end matthiasm@8: matthiasm@8: % start = start + hop matthiasm@8: matthiasm@8: if mod(i,check) == 0 matthiasm@8: fprintf(1,'.'); matthiasm@8: end matthiasm@8: matthiasm@8: end; matthiasm@8: fprintf(1,'\n'); matthiasm@8: matthiasm@8: