samer@0: % audio_norm - Arrow to do audio loudness normalisation using arbitrary estimator samer@0: function o= audio_norm(src,fs,N,M,W,Lag,dynorm,varargin) samer@37: opts=options('spectra',1,'lim',[-6,-1],'play',0,varargin{:}); samer@0: samer@0: if opts.spectra, samer@0: spectra=@(f,clim)obs_with(aspectrum(N)*arr(@log10)*imager('clim',clim,'fig',f)); samer@0: else samer@0: spectra=@(f,clim)aid; samer@0: end samer@0: samer@0: if opts.play samer@0: player = arr(@(x)flatten(x(1:M,:))) * audioout(linesink(1,fs)); samer@0: else samer@0: player = aid; samer@0: end samer@0: samer@0: o = audioin(src,N,M,W) ... samer@0: * spectra(13,[-11,1]) ... samer@0: * dup * ( ... samer@0: arr(@flatten)*dup*( ... samer@0: arr(@(t)log(mean(abs(t))))*delay(Lag-1,nan) ... % instantaneous log scale samer@0: + dynorm(Lag) ... % estimated log scale samer@0: ) ... samer@0: * arr(@(a,b)[a;b]) ... % combine samer@0: * obs_with(scope(128,'fig',11,'ylim',opts.lim)) ... % plot both on top of each other samer@0: * arr(@(t)t(2)) ... % pick out dynorm_lap value samer@0: + delay(Lag-1,0) ... % delay audio same amount as scale signal samer@0: ) ... samer@0: * arr(@(ls,x)0.03*x*exp(-ls)) ... % divide audio buffer by scale samer@0: * spectra(15,[-6,6]) ... samer@0: * player;