Calibrating MiniDSP EARS Part 2

Discussion in 'Measurement Techniques Discussion' started by purr1n, Sep 27, 2018.

  1. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    I mentioned a while ago and that the replacement MiniDSP EARS came in. The first EARS I received had extremely poorly matched channels (the right looked like a low shelf filter had been applied - and the compensation files from MiniDSP didn't reflect this) so I contacted MiniDSP who sent me a replacement unit. It's likely the first unit was damaged during shipping.

    This second unit seems pretty good in terms of channel matching. The most difficult part was trying to get a compensation curve that yielded similar results to my first unit. The EARS, unlike the flat plate couplers, are much more sensitive to seal and replacement. I've spent many hours, days even, trying to precisely align various headphones on the old EARS and new EARS to get a consistent delta. Ultimately, the process just as much as an art, knowing which data sets were garbage to be thrown out and which ones were good. I plotted everything out in Excel to be able to see the outliers. After this, I did a weighted average of data that I felt was good (mostly Sennheisers and a few others).

    Finally, the last part of the process after I got the L channel dialed in was to get a delta for the R channel. For this, I simply used only HD800 and HD660S, knowing that Sennheiser has historically had much better channel matching than any other manufacturer. Even then, the deltas for each were slightly off (the HD800 is super sensitive to placement in the last octave), so I ended up smoothing the plots and averaging them to get the L-R delta.

    I'm going to present a few plots to see if they make sense. The idea behind these plots is that the target curve is different from that of the V2 flat plate coupler. The perceptual neutral target curve should be expected to be a horizontal straight line across.
     
    Last edited: Sep 27, 2018
  2. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    Proposed compensation 1.0

    Verum
    Verum Frequency Response.png

    Ether
    Ether Frequency Response.png

    LCD2C
    LCD2C Frequency Response.png

    HD800
    HD800 Frequency Response.png

    HD58X
    HD58X Frequency Response.png
     
    Last edited: Sep 27, 2018
  3. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    Couple of things I've noticed. All of the plots have a narrow drop at 8.5kHz. Coincidence or should this be compensated out to some extent. I also think the mid-treble ~10kHz reigon should display a little bit higher than it does - again, assuming straight horizontal line is perceptual neutral.
     
  4. E_Schaaf

    E_Schaaf MOT: E.T.A Headphones

    Pyrate BWC
    Joined:
    Mar 28, 2017
    Likes Received:
    9,589
    Trophy Points:
    113
    Location:
    Staten Island, NY
    Home Page:
    Looks pretty sweet, and very useful / easy to read. How does the EARS manage with other measurements like CSDs / Distortion / Burst Response? Or with IEMs?

    Could be a useful tool for measuring incremental mods. It's a bummer it's so fickle with placement and seal though.
     
  5. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    EARS can't do CSD for sure. There are inherent high Q narrow peaks in the raw measurements which even when compensated out wreak havoc on CSDs. On distortion, I'm not too sure. Will need to test it. Initial feelings on distortion, at least with IEMs, I feel there is something wrong. The D2 distortion tends to mirror the pattern of the FR, which seems extremely unlikely. I don't know if this because the internal cavities excite the second harmonic of a signal.

    It would be interesting to compare EARS measurements vs flat plate measurements once there is enough data to see which headphones take more advantage of pinna, concha, and canal gain.
     
  6. ultrabike

    ultrabike Measurbator - Admin

    Staff Member Pyrate MZR
    Joined:
    Sep 25, 2015
    Likes Received:
    8,959
    Trophy Points:
    113
    Location:
    Irvine CA
    Here are some ideas...

    It is possible to compensate an impulse response (WAV file) by passing it through a time domain FIR compensation filter equivalent to the compensation curve. One could assume minimum phase to arrive at the FIR coefficients. It may not be perfect. But possible.

    Distortion tracking the fundamental may be due to the driver exhibiting roughly a fixed ratio between fundamental and D2 in the driver passband, and both fundamental and D2 being amplified by the same amount by the ear, or not at all by the plate.

    There is also a question of the ADC + mic getting more distorted as it picks up louder frequency ranges due to ear acoustic amplification.
     
  7. Biodegraded

    Biodegraded Friend

    Pyrate Contributor
    Joined:
    May 28, 2017
    Likes Received:
    7,952
    Trophy Points:
    113
    Location:
    Vancouver BC
    Paging @james444 for comments on IEM measurements with this.
     
  8. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    I'm working on IEM comps too. I'll propose IEM comps later. So far I like what I see. For example, the deep insertion of the Pinnacle P1 is reflected (no 4kHz peak) with the EARS.
     
  9. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    Tweaked compensations 2.0. I like these better fhan the first ones.

    HD800 stock
    HD800 Frequency Response.png

    HD58X
    HD58X Frequency Response.png

    HE-5 (re-release) with pleather pads
    HE-5r2 pleather Frequency Response.png
     
  10. cskippy

    cskippy Creamy warmpoo

    Pyrate MZR
    Joined:
    Oct 14, 2015
    Likes Received:
    3,999
    Trophy Points:
    113
    Location:
    Tempe, Arizona
    Still has an interesting interaction between 6-10kHz. This varies by headphone driver distance and angle. Just another variable to deal with. Very cool results though!
     
  11. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    For fun, Grado SR225 with bowls (stock), TTVJ OG pads, and TTVJ Deluxe Pads. On the EARS.

    WHITE: Bowls
    ORANGE: TTVJ OG Pads
    LT BLUE: TTVJ Deluxe Pads
    EARS Grado SR225 Frequency Response.png
     
  12. ultrabike

    ultrabike Measurbator - Admin

    Staff Member Pyrate MZR
    Joined:
    Sep 25, 2015
    Likes Received:
    8,959
    Trophy Points:
    113
    Location:
    Irvine CA
    I hope this is useful in some way. Attached is a text file with a compensation FIR filter that should match Tyll's IF compensation.

    I used FPGraphTracer to get sample points from IF, and then used octave to derive a FIR filter from it. Here is the code:

    Code:
    % run with octave (cuz no Matlab at home)
    pkg load signal
    
    % load compensation file
    load compensation.frd;
    
    % compensation frequency response and smoothing
    frequency = compensation(:,1);
    B = fir1(10,0.5);
    amplitude_dB = filter(B,1,compensation(:,2));
    
    % derive FIR (impulse response)
    amplitude = 10.^(amplitude_dB./20.0);
    amplitude = [amplitude.' amplitude(end-1:-1:2).'];
    phase = -imag(hilbert(log(abs(amplitude))));
    H = amplitude.*exp(sqrt(-1)*phase);
    h = real(ifft(H));
    
    % original
    figure;
    semilogx(frequency,amplitude_dB);
    title('original');
    axis tight; grid on;
    
    % FIR filter frequency response
    figure;
    title('compensation filter frequency response');
    freqz(h);
    axis tight; grid on;
    
    % FIR filter time domain
    figure;
    plot(h);
    axis tight; grid on;
    title('FIR filter coefficients');
    
    % save filter coefficients
    fid = fopen('compensation_filter_coef.txt','w');
    fprintf(fid, '%f\n',h.');
    fclose(fid);
    
    I can derive this for other compensation files. Convolving the measured impulse response with this compensation will yield a compensated impulse response from which a perhaps more meaningful CSD might be derived.
     

    Attached Files:

  13. ultrabike

    ultrabike Measurbator - Admin

    Staff Member Pyrate MZR
    Joined:
    Sep 25, 2015
    Likes Received:
    8,959
    Trophy Points:
    113
    Location:
    Irvine CA
    Crap. I think that compensation FIR adds the compensation instead of subtract. Anyhow, that's an easy fix. Let me know if interested.

    EDIT: And the coefficient calculation is not taking into consideration x axis log scale. Can fix if interested.
     
    Last edited: Sep 27, 2018
  14. james444

    james444 Mad IEM modding wizard level 99

    Pyrate Flathead IEMW
    Joined:
    Jun 3, 2016
    Likes Received:
    2,100
    Trophy Points:
    93
    Location:
    Vienna, Austria
    IMHO, the MiniDSP EARS is not an ideal choice for IEM measurements. I feel it's consistent enough to help me with my mods - but not much more. The artificial ear canal is quite short and the possible range of insertion depths to get a seal is even shorter. With about half of my available tips, it's pretty much impossible to achieve a full seal at all. I think that might improve with some kind of tube extension to the canal, and I've been DIYing around a bit... but so far without a definite solution.
     
  15. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    I definitely don't have as many tips as you, but I didn't have a problem jamming in the triple flange earbuds from the Pinnacle. I really can't see myself going any deeper than that personally, but then again IEMs are secondary to me and only used when I travel. I can see a super deep insertion, such as what I would use with ER4S or DBA02/B2 a problem though.
     
  16. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    If you want to play with it and number crunch, two tabs here, one for impulse response from EARS and the other is the FR compensation:

    https://docs.google.com/spreadsheet...do-3aUAi9PgIQj56yoEQuS-S5s/edit#gid=477746744
     
  17. ultrabike

    ultrabike Measurbator - Admin

    Staff Member Pyrate MZR
    Joined:
    Sep 25, 2015
    Likes Received:
    8,959
    Trophy Points:
    113
    Location:
    Irvine CA
    Will do! Thanks!

    I made modifications to the script and provided an example while I work with your files.

    Here is the code:

    Code:
    % run with octave (cuz no Matlab at home)
    pkg load signal
    
    % compensation filter parameters
    N = 1500;
    
    % load compensation file
    load compensation.frd;
    
    % compensation frequency response
    frequency = 15:10:19000;
    B = fir1(10,0.5);
    compensation(:,2) = filter(B,1,compensation(:,2));
    amplitude_dB = interp1(compensation(:,1),compensation(:,2),frequency,"linear");
    
    % derive FIR (impulse response)
    amplitude = 10.^(-amplitude_dB./20.0);
    amplitude = [amplitude amplitude(end-1:-1:2)];
    phase = -imag(hilbert(log(abs(amplitude))));
    H = amplitude.*exp(sqrt(-1)*phase);
    h = real(ifft(H));
    
    % original
    figure;
    semilogx(frequency,amplitude_dB);
    title('original');
    axis tight; grid on;
    
    % FIR filter frequency response
    figure;
    [H, W] = freqz(h);
    semilogx(W,-20*log10(abs(H)));
    title('inverse compensation filter frequency response');
    axis tight; grid on;
    
    % FIR filter time domain
    figure;
    plot(h);
    axis tight; grid on;
    title('FIR filter coefficients');
    
    % save filter coefficients
    fid = fopen('compensation_filter_coef.txt','w');
    fprintf(fid, '%f\n',h.');
    fclose(fid);
    
    % example
    [impulse, fs, bits] = wavread("left.wav");
    [H,W] = freqz(impulse);
    impulsec = filter(h,1,impulse);
    [Hc,Wc] = freqz(impulsec);
    figure;
    semilogx(W,20*log10(abs(H)));
    hold on;
    semilogx(Wc,20*log10(abs(Hc)),'r');
    grid on;
    axis tight;
    
    It load a compensation file I extracted from an IF article. Then it arrives at the minimum phase filter that matches that compensation.

    I then load an impulse response from an HD600 measurement I took with REW, that was exported into a WAV file. Then I apply compensation. Here are the results:

    Tyll file:
    Compensation.PNG

    Filter FR:
    Compenation_Filter_FR.jpg

    Filter IR:
    Compenation_Filter_IR.jpg

    Example of compensation (HD600 impulse response compensated frequency response):
    HD600_Compensated.jpg

    The HD600 was taken with a flat plate and did not need compensation, but this shows this approach works and the advantage is that the compensated IR can be used to get compensated CSDs.
     

    Attached Files:

  18. Serious

    Serious Inquisitive Frequency Response Plot

    Pyrate BWC MZR
    Joined:
    Sep 28, 2015
    Likes Received:
    2,589
    Trophy Points:
    113
    Location:
    near Munich, Germany
    Can we see more zoomed in graphs? Somehow these look more like flat plate measurements than normal dummy head measurements to me at first glance, but that could be the limitation of the EARS. The magnitude of the differences between the different headphones seems too strong to me. The HD800 sounds brighter to me than that. The HD58X is quite a bit less forward in the 2-5kHz region than the HD650, right? In that case it would seem about right. Does the HE-5 really sound like it has a 10db difference between 500Hz and 2kHz?

    From my experience I bet it's the mics. The mics I have now don't really go lower than 0.2% at 90db (new mics are on the way). At a given SPL the mic 2nd order distortion will be very linear with FR, so it ends up tracking the FR pretty much perfectly. Not sure what causes a mic to distort that much. It could also be the electronics, but that seems even more unlikely to me.
     
  19. purr1n

    purr1n Desire for betterer is endless.

    Staff Member Pyrate BWC
    Joined:
    Sep 24, 2015
    Likes Received:
    89,623
    Trophy Points:
    113
    Location:
    Padre Island CC TX
    Yes, it does seem the HD800 should show up as measuring brighter. I am surmising that the material on the EARS is more absorbative, therefore the less direct angle of the HD800 drivers to the ear doesn't register as much as it should have. Had I compensated to make the HD800 brighter, the HD58X (and other) results might be thrown off.

    The HE-5 (reissue) seems about right, at least with the pleather pads - I do still think 3kHz and 5kHz should have shown up a few db bit higher.
     
  20. ultrabike

    ultrabike Measurbator - Admin

    Staff Member Pyrate MZR
    Joined:
    Sep 25, 2015
    Likes Received:
    8,959
    Trophy Points:
    113
    Location:
    Irvine CA
    All right, here is the modified code with Marv's compensation for the LCD (I massaged the spread sheet a little for convenience):

    Code:
    % run with octave (cuz no Matlab at home)
    pkg load signal
    
    % load compensation file
    compensation = csvread('EARS_comp_L_RC2_mic.csv');
    
    % compensation frequency response
    frequency = compensation(1:1):10:compensation(end,1);
    B = fir1(10,0.5);
    %compensation(:,2) = filter(B,1,compensation(:,2));
    amplitude_dB = interp1(compensation(:,1),compensation(:,2),frequency,"linear","extrap");
    
    % derive FIR (impulse response)
    amplitude = 10.^(-amplitude_dB./20.0);
    amplitude = [amplitude amplitude(end-1:-1:2)];
    phase = -imag(hilbert(log(abs(amplitude))));
    H = amplitude.*exp(sqrt(-1)*phase);
    h = real(ifft(H));
    
    % original
    figure;
    semilogx(frequency,amplitude_dB);
    title('original');
    axis tight; grid on;
    
    % FIR filter frequency response
    figure;
    [H, W] = freqz(h);
    semilogx(W*22.05e3/pi,-20*log10(abs(H)));
    title('inverse compensation filter frequency response');
    axis tight; grid on;
    
    % FIR filter time domain
    figure;
    plot(h);
    axis tight; grid on;
    title('FIR filter coefficients');
    
    % save filter coefficients
    fid = fopen('compensation_filter_coef.txt','w');
    fprintf(fid, '%f\n',h.');
    fclose(fid);
    
    % example
    impulse = csvread('EARS_LCD2C_L_IR.csv');
    impulse = impulse(:,2);
    [H,W] = freqz(impulse);
    impulsec = filter(h,1,impulse);
    [Hc,Wc] = freqz(impulsec);
    figure;
    semilogx(W,20*log10(abs(H)));
    hold on;
    semilogx(Wc,20*log10(abs(Hc)),'r');
    grid on;
    axis tight;
    
    EARS compensation:

    EARS_Comp.jpg

    EARS derived filter compensation FIR frequency response:

    EARS_DerivedFIR_Comp_FR.jpg

    EARS derived filter compensation FIR coefficients:

    EARS_DerivedFIR_Comp_IR.jpg

    EARS LCD2 measurement uncompensated (blue) vs. compensated (red) - note the plot x-axis is normalized to pi:

    EARS_LCD2_UnComp_vs_Comp.jpg

    Attached are the compensation FIR coefficients which yield a new IR, which can be saved as a WAV for CSDs.

    (Got to go. Bday party for one of the kiddos.)
     

    Attached Files:

    Last edited: Sep 28, 2018

Share This Page