Release notes for V1.6.9D... 15 Nov 2020 This release was unexpected, and after critical listening, I ran into some ideas for improvement. * First, the secondary Hilbert transforms in the level detector used Hann windows, which is kind of a 'default' window, but the mainline Hilbert transforms used a specially detailed window to minimize the level detection errors. A simple realization -- why not use the same, specially detailed window for the secondary Hilbert transforms also? The result after the change is a more smooth, less IMD prone detected level. In all cases, the original version of the detector was better than the old HW, this change to the secondary filters should have a secondary effect, but the results were more beneficial than I had thought that they would be. (The secondary/primary Hilbert detection scheme, and also a tertiary detection also -- maintains compatibility with the old HW, but everything together gains a compatible improvement in modulation and modulation distortion effects.) * Next, when doing some tests on some hideous material -- I had noticed a bit of IMD creation that didn't come from the input detector. I chased the problem down into the nonlinear attack/release filtering (nonlinearity should be a big hint, right? :-)), but also further measurements made me aware that the attack shape wasn't 100% on-spot. I revisited the attack shaping (part of the feedback/feedforward conversion), and noticed that I might have made the emulation a little too fast -- converting a *nonlinear* feedback to feedforward control system is either ad-hoc tricky, or mathematically so intense as to be practically impossible to model. Anyway, I screwed up in the conversion, and left one of the internal time constants to be off by 50%. This does NOT create a 50% general error, but, since the error was in the direction of being too fast, made some kinds of impulse sounds shaped a little wrong. Also, after a lot of testing, I determined that the log-nonlinear shaping was too strong, perhaps intending to compensate for the error in the feedback-feedforward conversion. * Next, the HF0/HF1 split timing wasn't accurate enough Understanding the way that the HF0/HF1 decoding split works, the separation between the HF0 & HF1 bands has a delay in the HF1 component. Originally, this delay was basically immediate wrt the current decoding (level detection) state. Apparently, an additional attack/release delay was needed. I added an additional open-ended attack/release delay, but maybe a better solution is to create another secondary detector, and have the split delayed by another full detector attack/release calculation. I determined that to be too expensive, so I simply added an additional *estimated* attack/release delay, and the improvement was so profound, without creating any new noticeable artifacts yet, I left the attack/release delay change as a reasonable solution. I don't expect this change to be a temporary work around, but to be the actual solution. * Additionally (the 'C') release. The attack speed limit on the primary detector (which is the 2nd in line due to architectural issues) had too strong of a nonlinear/log limit. I loosened the limit. The major manifestion of a problem was that percussive effects from pianos sounded a little suppressed. Unfortunately, a lot of these adjustements are subjective -- an accurate model of DolbyA behavior cannot even be derived from precision Spice modeling, because of component selection. Makes me wonder if these tweaks will happen forever as we find minor defects? * Finally (the 'C') release. (mostly for FA mode only) --fz=opt and --fz=opt weren't optimal, and didn't even match the desired pattern for decoding modes. The planned 'optimal' mode is for the first sequence to be --fz=max or --fx=max. Then, the last item in each subsequent sequence is --fz=max or --fx=max. All other layers, not specified are either --fz or --fx. So, anti-MD is fully enabled for every step, but the band-splits (which further mitigate MD inside of each band) are only enabled for the 'max' layers. There is an important audible improvement when using the corrected 'opt' modes. Even though the 'opt' modes are faster than the 'max' modes, the quality should be similar, and the 'opt' modes are still pretty slow. * Minor change: multiple --outgain and multiple --ingain switches add together rather than replace each other. ================ After correcting the speed calculation, that allowed the log-nonlinear shaping to be less aggressive, has resulted in sound is more clean, even fewer, more weak intermod effects. This improvement is most noticeable on full sounding vocal chorus. ================ When comparing with a real DolbyA, generally, the DHNRDS improvements are so profound that some of these 2nd order matters wouldn't even appear on the old HW. When decoding, the real HW glosses over details in the audio that are recovered and fully presented by the SW decoder. Some of these matters that have been improved over the years come from a difficulty in determining what to emulate? What should the results really sound like, especially in some cases we don't have original, non-encoded source material? ================ Unless I find solutions to any more newly found 2nd order problems, or if the user base doesn't find new bugs -- the decoder should stabilize again. No matter what, I am ALWAYS looking for minor and major problems in the decoder, and producing valid solutions ASAP!!! John