20 likes | 114 Views
function createAnimatedGifFromWav(wavFileName, windowLength, Width, framesPerSec) % % function createAnimatedGifFromWav(wavFileName, windowLength, Width, framesPerSec) % % This function read a .wav audio file and creates an animated gif: in each
E N D
function createAnimatedGifFromWav(wavFileName, windowLength, Width, framesPerSec) % % function createAnimatedGifFromWav(wavFileName, windowLength, Width, framesPerSec) % % This function read a .wav audio file and creates an animated gif: in each % frame of the gif file, a seperate audio window is presented, along with % the corresponding spectrogram. % % ARGUMENTS: % wavFileName: the name of the .wav file to read % windowLength: the length (in seconds) of each window to be plotted in the gif % Width: the width of the generated .gif file % framesPerSec: frames per second for the gif animated file. % % NOTE: the generated .gif file's name is [wavFileName_animatedGIF.gif] % % EXAMPLE: % The following line will read b.wav, will spitt the file into windows of 2 % seconds (non-overlapping) and will create a gif file (of 450 pixels % width) and 10 frames per seconds: % % >> createAnimatedGifFromWav('b.wav',2,450,10); % % % ---------------------------------- % | Theodoros Giannakopoulos | % | http://www.di.uoa.gr/~tyiannak | % ---------------------------------- % % frame time interval: framesT = 1/framesPerSec; % initial index of audio data: I = 1; % read audio data: [x,fs] = wavread(wavFileName); % convert window value from time to samples: win = windowLength * fs; % initialize figure: h = figure; Loop = {'LoopCount',Inf}; count = 0; % total number of audio windows (and corresponding frames in gif file): total = floor((length(x)-win) / (win)); % gif file name: fn = [wavFileName '_animatedGIF.gif']; % main loop: while (I+win<length(x)) % while reading audio data: count = count + 1; fprintf('Saving Image %d of %d\n',count, total); % get current audio data: tempX = x(I:I+win); % plot audio data: subplot(2,1,1); time = (0:1/fs:(length(tempX)-1)/fs) + I/fs; plot(time, tempX); axis([time(1) time(end) -1 1]); % plot respective spectrogram: subplot(2,1,2); SPECTROGRAM(tempX, 0.050*fs, 0, 0.050*fs, fs); ylabel(''); xlabel(''); % update window position: I = I + win; % save current figure in temporary jpeg file... saveas(h,'imageTemp', 'jpg'); % ... and get image data: RGB = imread('imageTemp.jpg'); % resize image (according to Width argument): R = RGB(:,:,1); G = RGB(:,:,2); B = RGB(:,:,3); R = imresize(R, [Width NaN]); G = imresize(G, [Width NaN]); B = imresize(B, [Width NaN]); clear RGB; RGB(:,:,1) = R; RGB(:,:,2) = G; RGB(:,:,3) = B; % convert to indexed image (256 colors used): [ind,map]=rgb2ind(RGB,256); % write gif file if count==1 % if this is the first frame-->overwrite file imwrite(ind,map,fn,'gif' ... , 'DelayTime', framesT ... , 'WriteMode','overwrite' ... , Loop{:} ... ); else % ... else append image to existing file imwrite(ind,map,fn,'gif' ... , 'DelayTime', framesT ... , 'WriteMode','append' ... ); end end