• WANTED: Happy members who like to discuss audio and other topics related to our interest. Desire to learn and share knowledge of science required. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

Speaker Equivalent SINAD Discussion

edechamps

Addicted to Fun and Learning
Forum Donor
Joined
Nov 21, 2018
Messages
910
Likes
3,621
Location
London, United Kingdom
For the IN8 using the sheet that @MZKM shared with me I can, more or less, reproduce his score
@MZKM NBD_ON = 0.7159592857 vs 0.7160
@MZKM NBD_PIR = 0.3775553044 vs 0.3941
@MZKM NBD_LW = 0.4736059742 vs 0.4736
@MZKM SM_PIR = 0.880 vs 0.8752
@MZKM LFX = 1.55 vs 1.572 (probably first vs closest point lower / higher)
@MZKM Score= 5.12 vs 5.06 or 1.2% lower
I just can’t see why the NBD_PIR deviate beyond rounding error, not sure…

For what it's worth, Loudspeaker Explorer calculates NBD_ON=0.715959, NBD_PIR=0.394079, NBD_LW=0.473604, SM_PIR=0.875163, LFX=1.554958, score=5.057476 for the Kali IN-8. Do note, though, that Loudspeaker Explorer uses the original PIR from the Amir's (Klippel) zipfile, which is known to be slightly wrong. (For details, see this, this, this, and this.) My understanding is that @MZKM is in process of fixing that in his spreadsheets, which might explain the differences on PIR.

for the SM_PIR the target slope it given in chapter 077 in the Patent and should be -1.75
I does not seem to affect the score though?

Keep in mind the target slope is only used to compute SL. SL did not make it into the final Olive model. Therefore the target slope is not used in the final model at all and is for illustrative purposes only. This is a common source of confusion. (In practice the final model scores are quite consistent with the target slopes, but that's somewhat coincidental.)
 
Last edited:

edechamps

Addicted to Fun and Learning
Forum Donor
Joined
Nov 21, 2018
Messages
910
Likes
3,621
Location
London, United Kingdom
Forgot to add:

for the SM_PIR the target slope it given in chapter 077 in the Patent and should be -1.75

There are strong suspicions that the PIR target slope b is actually -1.0. Indeed it's extremely likely there is a clerical error in the paper and the SP and PIR rows were accidentally swapped in that table.
 
Last edited:

6speed

Active Member
Joined
Nov 7, 2018
Messages
128
Likes
84
Location
Virginia, USA
I was only able to find the old NHT Pro M-00 Google sheet, so I used that to see if I could adapt it to VituixCAD output and make some calculations on my DIY speakers. Here is the horizontal directivity:

Horizontal Directivity.png

You can see several artifacts that will negatively affect scoring:
  • I boosted the bass. In practice, it hands off to subs at 80Hz and the whole system goes through room correction <150Hz.
  • I have bad floor bounce <200Hz.
  • The design axis was a moving target, usually centered between mid and tweeter because that is ear height. This allows for some droop close to 20kHz that I don't always see in my measurements.
  • This speaker has the classic directivity mismatch between tweeter and large-ish mid, somewhat mitigated by 2nd order acoustic crossover.
  • I can't remember if the crossover in these measurements have the latest tweaks 800Hz-4kHz, but I am unlikely to ever haul them back outside to do more spins.
SPINORAMA.png


Score (NBD_ON): 5.56
Score (NBD_LW): 5.67
 
OP
M

MZKM

Major Contributor
Forum Donor
Joined
Dec 1, 2018
Messages
4,250
Likes
11,556
Location
Land O’ Lakes, FL
I was only able to find the old NHT Pro M-00 Google sheet, so I used that to see if I could adapt it to VituixCAD output and make some calculations on my DIY speakers. Here is the horizontal directivity:

View attachment 66791
You can see several artifacts that will negatively affect scoring:
  • I boosted the bass. In practice, it hands off to subs at 80Hz and the whole system goes through room correction <150Hz.
  • I have bad floor bounce <200Hz.
  • The design axis was a moving target, usually centered between mid and tweeter because that is ear height. This allows for some droop close to 20kHz that I don't always see in my measurements.
  • This speaker has the classic directivity mismatch between tweeter and large-ish mid, somewhat mitigated by 2nd order acoustic crossover.
  • I can't remember if the crossover in these measurements have the latest tweaks 800Hz-4kHz, but I am unlikely to ever haul them back outside to do more spins.
View attachment 66792

Score (NBD_ON): 5.56
Score (NBD_LW): 5.67
Your Spinorama looks a bit off, the PIR should be closer to the Early Reflections, not Sound Power.

If this is based on the shared NHT file I had a while back, that had some errors and the current versions have fixed those, I can share that instead if you want.
 

6speed

Active Member
Joined
Nov 7, 2018
Messages
128
Likes
84
Location
Virginia, USA
@MZKM Yes, please share your most recent version with me. I will have to compare the various response definitions with what VituixCAD is configured for...
 
OP
M

MZKM

Major Contributor
Forum Donor
Joined
Dec 1, 2018
Messages
4,250
Likes
11,556
Location
Land O’ Lakes, FL
@MZKM Yes, please share your most recent version with me. I will have to compare the various response definitions with what VituixCAD is configured for...
Realized I don't have the NHT pro M-00 data file anymore, and my old spreadsheet just used the curves Klippel calculates (which isn't 100% correct). @amirm, do you still have this? I can't find where you posted it.
 

6speed

Active Member
Joined
Nov 7, 2018
Messages
128
Likes
84
Location
Virginia, USA

Maiky76

Senior Member
Joined
May 28, 2020
Messages
446
Likes
3,754
Location
French, living in China
Hi,


Ding Ding Ding, we have a winner:
"Explorer uses the original PIR from the Amir's (Klippel) zipfile, which is known to be slightly wrong. (For details, see this, this, and this, and this.) My understanding is that @MZKM is in process of fixing that, which might explain the differences on PIR."

NBD_PIR = 0.3775553044 vs 0.3769 with the same PIR data
@MZKM Score= 5.12 vs 5.1192 with the same PIR data

BTW here is the code I used for SM_PIR

Code:
% -------------------------------------------------------------------------
% Clear variables house keeping
% -------------------------------------------------------------------------
clear
close all
clc
format long
format compact
% -------------------------------------------------------------------------
% Measurement data for Kali IN8
% -------------------------------------------------------------------------

data                = importdata('Estimated In-Room Response.txt');
f                   = data.data(:,1);
PIR                 = data.data(:,2);

flowindx            = find(f <= 100, 1, 'last');
fhigindx            = find(f <= 16000, 1, 'last');

% -------------------------------------------------------------------------
% Matlab Pearson correlation coefficient R2
% -------------------------------------------------------------------------

[P,S]               = polyfit(log(f(flowindx+1:fhigindx)),PIR(flowindx+1:fhigindx), 1);
Slope               = P(1);
Intersect           = P(2);
Regression          = Intersect + Slope*log(f(flowindx+1:fhigindx));
% R2                  = 1 - (S.normr/norm(Y - mean(Y)))^2 % Pearson correlation coefficient
SM_PIR_R2           = 1 - (S.normr/norm(PIR(flowindx+1:fhigindx) - mean(PIR(flowindx+1:fhigindx))))^2


Y                   = abs(-1.75-(Slope))*log(f(flowindx+1:fhigindx)) + Intersect; % ???
% % Target slope is -1.75 different curves have different target but not
% % consistent in slope target and calculation for the Y
SM_PIR_target_slope_175 = 1 - (S.normr/norm(Y - mean(Y)))^2 % Pearson correlation coefficient

Y                   = abs(-1.0-(Slope))*log(f(flowindx+1:fhigindx)) + Intersect; % ???
% % Target slope is -1.75 different curves have different target but not
% % consistent in slope target and calculation for the Y
SM_PIR_target_slope_1 = 1 - (S.normr/norm(Y - mean(Y)))^2 % Pearson correlation coefficient

% -------------------------------------------------------------------------
% Directly from patent
% -------------------------------------------------------------------------

n                   = length( f(flowindx+1:fhigindx) );
X                   = PIR( flowindx+1:fhigindx );
Y                   = Intersect + Slope*log( f( flowindx+1:fhigindx ) );
SM_Num              = n*sum(X .* Y) - sum(X) * sum(Y);
SM_Den              = sqrt((n*sum(X .^ 2) - (sum(X))^2)*(n*sum(Y .^ 2) - sum(Y)^2));
SM_PIR_Patent       = (SM_Num / SM_Den)^2

% -------------------------------------------------------------------------
% From @MZKM xls
% -------------------------------------------------------------------------

n                   = length( f( flowindx+1:fhigindx ) );
PIRBW               = PIR( flowindx+1:fhigindx );
X                   = sum( PIRBW );
Y                   = sum( Regression );
XY                  = sum( PIRBW .* Regression );
Num_SM              = n*XY - X*Y;
X2                  = sum( PIRBW .^ 2 );
X_2                 = X ^ 2;
Y2                  = sum( Regression .^ 2 );
Y_2                 = Y ^ 2;
Den_SM              = sqrt( (n*X2 - X_2) * (n*Y2 - Y_2) ); % sqrt[(nX2-X_2)((nY2-Y_2)]
SM_PIR_xls          = ( Num_SM / Den_SM )^2

Results:


SM_PIR_R2 =
0.875163361231805

SM_PIR_target_slope_175 =
-1.799611746353223

SM_PIR_target_slope_1 =
-0.589311164301695

SM_PIR_Patent =
0.875163361231828

SM_PIR_xls =
0.875163361231828

It seems that using the target slopes whatever it is does not work.
With Matlab it takes two lines of code to get the result, i don't know if that can be done with Excel
Code:
[P,S]               = polyfit(log(f(flowindx+1:fhigindx)),PIR(flowindx+1:fhigindx), 1);
SM_PIR_R2           = 1 - (S.normr/norm(PIR(flowindx+1:fhigindx) - mean(PIR(flowindx+1:fhigindx))))^2
Cheers
M
 
Last edited:

6speed

Active Member
Joined
Nov 7, 2018
Messages
128
Likes
84
Location
Virginia, USA
Your Spinorama looks a bit off, the PIR should be closer to the Early Reflections, not Sound Power.

You were right. I had the wrong PIR data earlier.

I also spliced in traces which do not have floor bounce, and used the in-room trace below 100Hz, which is why the DI graphs go flat. Directly on the tweeter axis, it should be -2dB at 20kHz, but generating new spins and splicing into the top octave is more trouble than its worth. I wish I had a Klippel sitting around to do full range measurements.

20200604 SPINORAMA spliced 200Hz.png


I know some of the calculations are a bit off, but the score went up to 6.8 (NBD_ON) and 6.9 (NBD_LW) after splicing the bass.
 
Last edited:

Maiky76

Senior Member
Joined
May 28, 2020
Messages
446
Likes
3,754
Location
French, living in China
Hi,

I am trying to calculate the other score from the Olive patent that was derived from bookshelf speakers if I not mistaken.
Can anyone have a look at the code I wrote?

LFQ:
Code:
[~,fhigindx]           = min( abs( f - 300 ) );
flowindx               = find( (f == f_6dB) );
Cardinal               = fhigindx - flowindx + 1; 

LFQ                    = sum( abs( LW(flowindx:fhigindx) - Response(flowindx:fhigindx) ) ) / Cardinal;

AAD:
Code:
Band_Mid = [114
            161.220
            228
            322.440
            456
            644.8813844
            912
            1289.762769
            1824
            2579.525538
            3648
            5159.051076
            7296
            10318.10215
            14592];
        
[~,flowindx]           = min(abs(f-200));
[~,fhigindx]           = min(abs(f-400));
Avg_Ref                = mean(Response(flowindx+1:fhigindx));


for k = 1:length(Band_Mid)
    Band_low_indx(k)   = find(f <= Band_Mid(k)/2^(1/4), 1, 'last')+1;
    Band_high_indx(k)  = find(f <= Band_Mid(k)*2^(1/4), 1, 'last');
    Cardinal(k,1)      = Band_high_indx(k) - Band_low_indx(k) + 1;   
    Mean_Response(k,1) = mean(Response(Band_low_indx(k) : Band_high_indx(k)));
    for l = 1:Cardinal(k,1)
        Deviation_Response(l,k) = abs(Response(Band_low_indx(k)+l-1) - Avg_Ref);
    end
end
        
% -------------------------------------------------------------------------
% For each N bands average deviation from the average SPL
% -------------------------------------------------------------------------
Mean_Deviation_Response = mean(Deviation_Response,1);

% -------------------------------------------------------------------------
% Average deviation from the N bands averages
% -------------------------------------------------------------------------
AAD_Response  = mean(Mean_Deviation_Response,2);

Help would be greatly appreciated
Cheers
M
 

amirm

Founder/Admin
Staff Member
CFO (Chief Fun Officer)
Joined
Feb 13, 2016
Messages
44,679
Likes
241,159
Location
Seattle Area
Realized I don't have the NHT pro M-00 data file anymore, and my old spreadsheet just used the curves Klippel calculates (which isn't 100% correct). @amirm, do you still have this? I can't find where you posted it.
I don't know either. I recreated it.
 

Attachments

  • NHT M00 Spinorama.zip
    55.9 KB · Views: 101

6speed

Active Member
Joined
Nov 7, 2018
Messages
128
Likes
84
Location
Virginia, USA
I am trying to calculate the other score from the Olive patent that was derived from bookshelf speakers if I not mistaken.
Can anyone have a look at the code I wrote?

It sounds like @MZKM has or is working on an updated Google spreadsheet. When he completes that, you can steal his formulas.
 

Maiky76

Senior Member
Joined
May 28, 2020
Messages
446
Likes
3,754
Location
French, living in China
Hi,

Maybe i missed it but I did not see validation of the score we all have seemed to converge to.
The idea was to duplicate the results from the study and consequently see if some calculations at least were correct.

In addition, the other score seems to be prediction for compact speakers which is mostly what is measured here.

Cheers
M
 
OP
M

MZKM

Major Contributor
Forum Donor
Joined
Dec 1, 2018
Messages
4,250
Likes
11,556
Location
Land O’ Lakes, FL
Hi,

Maybe i missed it but I did not see validation of the score we all have seemed to converge to.
The idea was to duplicate the results from the study and consequently see if some calculations at least were correct.

In addition, the other score seems to be prediction for compact speakers which is mostly what is measured here.

Cheers
M
Test 2 used a mixture of bookshelf and tower speakers, 70 total. This is what the generalized model is based on.

Using the scatter plot in Olive’s paper, my scores for the 13 speakers using the generalized model seem to line up.
 

Maiky76

Senior Member
Joined
May 28, 2020
Messages
446
Likes
3,754
Location
French, living in China
Test 2 used a mixture of bookshelf and tower speakers, 70 total. This is what the generalized model is based on.

Using the scatter plot in Olive’s paper, my scores for the 13 speakers using the generalized model seem to line up.

Hi,

Are you referring to figure 10 of this paper?
A Multiple Regression Model for Predicting Loudspeaker Preference Using Objective Measurements: Part II - Development of the Model

I have use date data generously scanned by @napilopez from here:
https://www.audiosciencereview.com/...-way-speaker-review.13562/page-16#post-412137
https://www.audiosciencereview.com/...gs-for-loudspeakers.11091/page-21#post-412375

If so, I am not quit sure if my (our?) calculations are quite correct:
First since I don’t have the PIR data I just calculated it from the following Equation:
Code:
PIR(:,k)          = 20*log10(abs(0.12 * 10 .^ (Lwin(:,k)/20) + ...
                                 0.44 * 10 .^ (Erfx(:,k)/20) + ...
                                 0.44 * 10 .^ (Spow(:,k)/20))) ;

That looks sensible to me…
Here is an example for data#12 which shows a NEGATIVE score.
Data #12.png


Here are the results for the 13 speakers, all the data was resampled (smoothed) to 1/20th octave using the frequency vector from the NFS to have a correct comparison. My calculations are consistent with the Kali IN8 data score.
Scanned data:
Data10a = [0.8486, 1.198, 1.223, 1.772, 1.6722, 2.5957, 3.6439, 3.7687, 4.0682, 4.792, 5.6406, 5.6406, 6.1398];

Predicted Score final Model fig10a.png


Good but not good enough to build confidence on the NBD and SM
If used the ER data as it is a good estimator of the PIR the results are broadly equivalent just further away (higher) from the published curve

What I am trying to do:

Get the same results for figure 13 a
the Equation are:
Pref.Rating = 2.63 −2.86*NBD_SP +5.15*SM _SP +0.417*SL_SP; EQ12
Pref.Rating = 6.70 −6.99*NBD_SP +2.83*SM _SP +1.150*SL_SP; EQ13
Scanned data:
data13 = [0.8232, 1.4264, 1.6589, 2.0359, 2.5889, 2.7208, 2.9596, 3.368, 3.8142, 4.9892, 5.0081, 5.737, 5.7873];

-> SM_x and NBD with SL_x easy (?) to calculate, I have inverted the two lines from the table :
Here are the results:
Predicted Score fig13a.png


The results are not vey good, are the calculations for NBD and SM correct?

Get the “identical” results to figure 4 the Equation is:
Pref.Rating=6.04−0.67*AAD_ON−1.28*LFX −0.66*LFQ + 4.02*SM_ON+ 3.58*SM_SP; EQ9
Scanned data:
data04 = [0.9141, 1.1514, 1.2888, 1.5144, 1.7349, 2.4452, 3.7617, 3.7781, 4.2299, 4.6261, 5.7719, 5.7995, 5.8983];

-> This gives access to SM_x and LFX
Predicted Score fig4.png


Still a significant deviation

so total:
SM_x, LFX and NBD with no PIR needed but AAD and LFQ, and SL must be calculated as well.
This way no assumption is needed on the PIR/ER and that should build confidence for the SM_x and NBD_x.

Of course I assumed the published data is correct and I did not make any mistakes…


Cheers
M
 
Last edited:
OP
M

MZKM

Major Contributor
Forum Donor
Joined
Dec 1, 2018
Messages
4,250
Likes
11,556
Location
Land O’ Lakes, FL
Data10a = [0.8486, 1.198, 1.223, 1.772, 1.6722, 2.5957, 3.6439, 3.7687, 4.0682, 4.792, 5.6406, 5.6406, 6.1398];

index.php


Good but not good enough to build confidence on the NBD and SM
Are you using the formula based on the 13 speakers and comparing it to the figure of the 13 speakers? I was referring to the generalized formula and the figure with all speakers.
 

Maiky76

Senior Member
Joined
May 28, 2020
Messages
446
Likes
3,754
Location
French, living in China
Hi,

Formula with 13 speakers as these are the only ones we have data for.
I am trying to verify whether or not the score is correct.

If you want to give it a try with your tool I have compiled all the data scanned by @napilopez from here:
https://www.audiosciencereview.com/...-way-speaker-review.13562/page-16#post-412137
https://www.audiosciencereview.com/...gs-for-loudspeakers.11091/page-21#post-412375
In a xls file.
These are with the correct format (frequency vector identical to the NFS) with my calculation for the PIR.
"Just" copy and paste should work, I never managed to get the example you sent me to work properly.
I thinks it's a compatibility issue with Excel.

Just change the extension from .zip to .xlsx

Cheers
M
 

Attachments

  • 20200608 Olive test 1 - 13 Speakers Spinorama copy.zip
    268.6 KB · Views: 149
Top Bottom