Emphasis: fix numerical stability issue in Production mode
commit46d7f004eafeb11b19b77e998b4bdb93561be497
authorKrzysztof Foltman <wdev@foltman.com>
Sun, 26 Apr 2015 20:02:58 +0000 (26 21:02 +0100)
committerKrzysztof Foltman <wdev@foltman.com>
Sun, 26 Apr 2015 21:38:33 +0000 (26 22:38 +0100)
tree5d2533e076ea65b837853bb730390104454d82f0
parente5b0793fc299e999a7478e1cc38fe36787b042e3
Emphasis: fix numerical stability issue in Production mode

In the original implementation, the pole-at-sr/2 highpass filter was followed
by a lowpass filter that removed the infinite gain at Nyquist. Which,
in perfect world would work OK, but fails badly when used with
floating point numbers. The highpass filter keeps accumulating a
DC offset in its coefficients (w1/w2 in Direct II form), which causes
progressive loss of resolution due to limited size of the mantissa
and resulting distortion of the signal. I think the fact that we're
using a Direct II form here makes it even worse.

My proposed solution is to move the lowpass filter *before* the
highpass filter, so that the frequency content near Nyquist is
removed before it can cause a resolution-killing offset in the
highpass that follows it. A cursory check of the filter
state seems to indicate that the problem should be gone or at
least severely diminished.
src/calf/loudness.h