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