samer@0: % amelspec - arrow from audio to log mel spectra samer@0: % samer@0: % amelspec :: samer@0: % N:natural ~'size of FFT used to compute spectra', samer@0: % M:natural ~'number of mel bands to compute' samer@0: % nonneg ~'sampling frequency', samer@0: % options { samer@0: % windowfn :: N:natural->[[N]] / @hanning ~'window function'; samer@0: % lowf :: nonneg / 100 ~'filter bank low frequency in Hz' samer@0: % } samer@0: % -> arrow( {[[dftbins(N)]]}, {[[L]]}, empty). samer@0: % samer@0: % Uses antialiased triangular filterbank from lowf to fs/2. samer@0: samer@0: function o=amelspec(N,M,fs,varargin) samer@37: opts=options('windowfn',@hanning,'lowf',100,'floor',5e-9,varargin{:}); samer@0: melW = lin2mel(N,fs,[opts.lowf,fs/2],M); samer@0: noise_floor=opts.floor; samer@0: o = apowspec(opts.windowfn(N))*arr(@cc); samer@0: function y=cc(x), y=log(melW*x+noise_floor); end samer@0: end