I’ve come up with something similar to Trebor’s plug-in.
It uses linear prediction coding instead of de-whitening in the fourier domain ( ;O, what’s this guy talking about?).
In other words, all streets lead to Rome.
The original is actually a bit more clipped. I’ve exported it to wave with a gain of 22 dB (!).
The filter has been applied after re-importing.
The code is:
(defun pre-emphase (s) (snd-biquad s 1 -0.96 0 0 0 0 0))
(defun de-emphase (s) (snd-biquad s 1 0 0 0.96 0 0 0))
;; voice model extraction
(setf lpanal-class (send class :new '(sound framesize skipsize npoles)))
(send lpanal-class :answer :isnew '(snd frame-sz skip-sz np) '(
(setf sound (snd-copy snd))
(setf framesize frame-sz)
(setf skipsize skip-sz)
(setf npoles np)))
(send lpanal-class :answer :next '() '(
(let ((samps (snd-fetch-array sound framesize skipsize)))
(cond ((null samps) nil)
(t
(snd-lpanal samps npoles))))))
(defun make-lpanal-iterator (sound framedur skiptime npoles)
(send lpanal-class :new sound
framedur skiptime npoles))
(psetq blocksize 200; in samples
advance-by 50; in samples
order 10); modify at will
;; analyze:
(setf obj (make-lpanal-iterator (pre-emphase s)
blocksize advance-by order))
;; apply filter to original:
(de-emphase (scale-db -35
(snd-lpreson s obj (/ advance-by *sound-srate*))))
The values after “psetq” can all be changed.
(note that the code is only for mono files)