KSTR
Major Contributor
Updated, the Nonlin params were not visible
Following up, this seems to work out great, in a first simple test, original vs. recording (actual recording, this time):Further musings:
When an externally measured "delta IR" is available as a correction kernel, an additional option to load an apply it might be an option. To avoid IR inversion/division problems, one might better supply one IR for each of reference and compare and when selected criss-cross this would cancel the LTI's total effect. It would effectively create the same combined (A*B) LTI's for both files but that is only a minor drawback.
[snip]
Maybe I'm just brain-farting here, and basically I do admit just being lazy here and trying to off-load the convolution into DW rather than doing it myself directly on the input files....
Stereo mode for both ref and comp apparantly obtains matching parameters only for Left channels, then "blindly" applied to the Right channels. Any minor channel imbalance therefore does not yield optimal correction for R channel. Separate complete passes for L and R would be needed (with all consequences for display etc). So, atm, one should do those separate passes manually... and remove the stereo setting alltogether.
Also, the channel selection list should only display and use the channels actually present (which could be more than two, for example for surround data). So maybe a list like channel 1... channel N, plus an average (mono sum).
OK, guys and girls,
I think I have acheived a real breakthrough for extracting (most of) the real error (stripped of simple linear errors) of a DA-->AD process (analog loopback recording within the same device, or with seperate devices if they can be clock-synchonized). Cable distortion included, if any ;-) (I've used a short 1/4" patch cable).
I've extended the experiment from the previous post to a higher (actually quite insane) precision level by introducing block-averaging as mentioned.
The process:
It turned out that it is best to obtain a gain correction factor first using only the quiet sections of the file giving the best RMS null but then apply it to the whole file. The reason for this is that the DA-->AD conversion showed a small gain compression effect, louder sections having an ever so slightly less gain than quieter sections, a compressive distortion (not to be confused with a standard signal compressor effect). We'll see that later in the linearity plot.
- Measure the impulse response with REW to the highest precision it is capable of, using 8 averages of a 4M log sweep from "DC" to fs/2 (22050Hz in this case). That took 12 minutes. Export with proper window, the longest possible one as the AC coupling time constant for the ADC is very long (the DAC is DC-coupled). Level was -6dBFS where distortion would be assumed low and signal-to-noise ratio is high. The noise is at -140dB thereabouts, so already at the 24bit (or 32bit float) limit. The frequency response error is minimal due to the long sweep and the 8 averages. After exporting the IR the 6dB gain is aplied to get back a unity gain IR (close to, as the DA-->AD gain is sligthly less than unity in the RME ADI-2 Pro).
- Convolve that IR, using Adobe Audition, with the original source file later to be used as the reference for DW. This imprints the linear transfer function on the reference so that it cancels out with the transfer function embedded in the recording.
- Play and Record the original file, some 84 takes (the file is 1:14 long, so that took 103 minutes (enough for having dinner meanwhile ;-)
- Block-Average that sequence of 84 takes to "condense" it back to one single take, yielding a signal with any non signal-correlated error terms (including the static gain drifts) reduced by almost 20dB. Any strictly signal-correlated error (like nonlinear distortion but also including signal-correlated jitter etc, for example) of the conversions will not be reduced at all (which is the goal here). I have written a small C program which affords that. This is the comparison file for DW.
- Run DW to perform matching, with the nonlinear calibration turned off, so only gain factor and (sub-)sample offset is calculated and applied.
Lets look at the DW plots.
Original Sprectrum overlayed with Spectrum of Delta:
View attachment 110191
Those are really a tight match, showing no signs of processing artifacts (idle tones, mostly) that we would normally get from using DW alone with Non-linear Calibration on.
Delta of Spectra (magnitude error):
View attachment 110192
That could certainly be rated as "zero error". Micro-dBs!
Delta Phase (phase error):
View attachment 110193
Same as above, micro-degrees.
Linearity:
View attachment 110194
Here we can see that the louder sections, using the higher 10 bits show a level drop, an extremely small compressive distortion (note the dB scale, again). And it is clean as it gets, down to bit 24.
Of course the most interesting data is the Delta Waveform (residual):
View attachment 110195
The matching (and residual noise) in the quiet section is breath-taking, whereas the louder sections are sticking out (because of the compression). We need to compare this with the original waveform to better see the effect of the less deep Null at the louder section from the compressive distortion:
View attachment 110196
While this gives some optical hints what's going on, the real deal is listening to that residual (download ZIP-file, also containing the input files).
- The first thing we note is a sort-of ricochet sound right at the begining. This the recovery from a small marker pulse I've put into the file at the first sample for alignment and trimming the raw data. Root cause for this I can only speculate about at the moment.
- In the medium loud section up to 0:23 one can hear a combination of distortion (notably in the bass), overlayed with some linear residue (undistorted music) at the more dynamic spots.
- In the loud section from 0:25 to 0:36 the linear residue dominates the delta though the underlying distortion can still be readily identified. Right at 0:36 a wind chimes is played and that has some real nastyness to it.
- In the quiet part from 0:35 onward things get interesting. This is the section the static gain correction was obtained from, so we have the deepest null. By this, it uncovers the (microscopic, mind you) distortion in such a clear way, probably like never before. I think I can hear some time-domain effects (recovery?) also, not just a pure static distortion....
Of course this was just the first experiment I've made and I will have to check if the results hold and maybe others will verify this but so far this looks tremendously promising. For example, because of the heavy averaging there can be errors that get lost or underestimated which certainly needs some investigation.
The approach can be extended for comparisons of like recordings rather than a match of original vs recording. When using the same DA-->AD and approximately equal levels (and loading of DAC's output), the error of a DUT (device under test) is fully exposed as all the DA-->AD errors will mostly cancel. DUTs could be cables (well, not that promising to find anything there ;-), and amplifers, basically anything that has an analog input and an analog output even when the internals are digital (containing AD-->DA internally).
I'll probably open a thread with a detailed step-by-step guide for all the processing steps, for replication by others as well as because at this level of precision every tiny detail that is neglected can make a huge difference for the results.
^ Nice tip. It really helps a lot to clear up the display even when zooming in to a +-0.005deg range in my current test case.
-100 to -110dB looks like being a sweet-spot from what I've tried. Below that I'm getting staircases ;-)
Seems now that in .59 when I access the Process menu to Load Only, it goes ahead and does a full match instead. Is .59 working that way for you guys?
Same for me.[...], that seems to work as expected.
Same for me.
One other thing I noted, when you want to apply a set of parameters from the Manual Corrections page, you have to click inside the data fields (blue area) to copy them to the manual entry fields (and click Apply!). I sometimes clicked on the Arrow symbol which does nothing and I got confused... d'oh!
View attachment 111689
I'm having other problems. Now it gets caught in a loop and never completes. I wondering if I got a corrupt download. I'm going to re-download and try again.Process->Load Only is the same as the Show button -- files are loaded, no matching is done, but statistics and charts are updated. Just quickly looking, that seems to work as expected.
I'm having other problems. Now it gets caught in a loop and never completes. I wondering if I got a corrupt download. I'm going to re-download and try again.
Seems to work now, of course I downloaded .61 as that is current. What changes between .61 and .59?