I had implemented a few statistics function a while back, kindly taken from
Wikipedia, and they seem to produce the expected values mentioned on the
webpage. I hope that these can be useful.

Ciao,
Dr Dario Sanfilippo
http://dariosanfilippo.com

import("stdfaust.lib");
avg(t, x) = fi.pole(p, (1 - p) * x) // 1-pole lowpass as average
with {
p = exp((((-2.0 * ma.PI) / t) / ma.SR));
};
var(t, x) = avg(t, (x - avg(t, x)) ^ 2); // variance
sd(t, x) = sqrt(var(t, x)); // standard deviation
cov(t, x1, x2) = avg(t, (x1 - avg(t, x1)) * (x2 - avg(t, x2))); //
covariance
corr(t, x1, x2) = cov(t, x1, x2) / (sd(t, x1) * sd(t, x2)); // correlation
ph0 = os.phasor(2.0 * ma.PI, 200);
red = sin(ph0) + .35 * sin(ph0 * 3.0) + .91 * sin(ph0 * 5.0);
blue = sin(ph0) + .5 * sin(ph0 * 3.0) - .5 * sin(ph0 * 5.0);
red1 = sin(ph0) + sin(ph0 * 3.0);
blue1 = sin(ph0) - sin(ph0 * 3.0) / 3.0;
t = 1.0; // averaging period in seconds
process = (red , blue : corr(t)) , (red1 , blue1 : corr(t));



On Wed, 4 Aug 2021 at 16:52, Klaus Scheuermann <kla...@posteo.de> wrote:

> Thanks Giuseppe,
>
> I checked it out, but somehow it still does not give me the desired
> result...
> I did some more research and found this, which indicates that it can be
> done with arctan more easily.
>
> The way this is done on phase (correlation) meters in audio equipment is
> rather simple:
>
> Phase = arctan(L/R)
>
> With phase of 45 or 225 = 1, and phase of 135 and 315 (-45) is -1.
>
> Essentially, the Y Axis is the L, and the X axis is the R. The phase is
> simply the polar angle of the vector between the two.
>
> This type of meters will show 1 if the signal is mono, and -1 if the left
> and right are perfectly phase inverted.
>
> Notice however, that phase meters of this type also account for the
> magnitude in the polar coordinates. So:
>
> Magnitude = (L^2 + R^2)^1/2
>
> Thus the actual meter display is a normalised version of:
>
> Correlation = Phase * Magnitude
>
> I'm not sure that satisfies your requirements, but this answers the
> question in the subject.
>
> So I transfered this to faust, but it still behaves weired...
> import("stdfaust.lib");
> phase(l,r) = (l/r) : aa.arctan;
> magnitude(l,r) = (l^2 + r^2)^1/2;
> correlate(l,r) = phase(l,r) * magnitude(l,r);
> correlate_meter(x,y) = x,y <: x , attach(y, (correlate : hbargraph("corr",
> -1,1))) : _,_;
> process = _,_ : correlate_meter: _,_;
>
> Any ideas?
>
> Klaus
>
> On 03.08.21 14:48, Giuseppe Silvi wrote:
>
> Hi Klaus,
> The filters are necessary to obtain a -1 +1 range, I think.
>
> import("stdfaust.lib");
>
> correlate(l,r) = l*l ,r*r , l*r : par(i,3, si.smooth(0.9)) : sqrt, sqrt, _ : 
> *,_ : /;
> correlate_meter(x,y) = x,y <: x , attach(y, (correlate : 
> hbargraph("corr”,-1,1)));
>
> process = correlate_meter;
>
> Try playing with the si.smooth coefficient.
>
> best,
> giuseppe
>
>
> On 3 Aug 2021, at 14:09, Klaus Scheuermann <kla...@posteo.de> 
> <kla...@posteo.de> wrote:
>
> Could it be something like this?
>
> (according to the 'correct' algorithm in 
> https://www.beis.de/Elektronik/Correlation/CorrelationCorrectAndWrong.html )
> import("stdfaust.lib");
>
> correlate(l,r) = l*l ,r*r , l*r : sqrt, sqrt, _ : *,_ : / :_;
> correlate_meter(x,y) = x,y <: x , attach(y, (correlate : 
> hbargraph("corr",-1,1))) : _,_;
>
> process = _,_ : correlate_meter: _,_;
>
> I am not sure about the lowpass filters though. Maybe not needed in the 
> digital domain?
>
> Also, my code only returns -1 or 1 while it should be returning a range of -1 
> and 1, right?
>
> The correlation is either expressed in % from -100% to +100% or as the 
> correlation factor, which ranges from -1 to +1. Note that due to the 
> correlation algorithm the level of both signals does not matter, i.e., it 
> does not influence the measured result.
>
> When a mono source is used for a stereo signal both stereo channels will be 
> +100% correlated. When e.g. in a stereo signal both channels contain 
> completely different signals, e.g. left (and only left) is the trumpet and 
> right (and only right) is the guitar these stereo channels will be 0% 
> correlated. With a third instrument appearing in both channels, the 
> correlation will be somewhere between 0 and +100%.
>
>
> Ideas?
> Danke :)
> Klaus
>
>
>
>
> On 03.08.21 12:48, Klaus Scheuermann wrote:
>
> Hello List,
>
> I just wondered, if anyone has implemented a stereo audio correlation
> meter/analyser in faust?
>
> If yes - great!
> If no - I have another project :)
>
> Here is what I found about the algorithm(s):
> https://www.beis.de/Elektronik/Correlation/CorrelationCorrectAndWrong.html
>
>
> I never learned analog electronic schematics, but it seems it should not
> be extremely hard to transfer to faust.
>
> Cheers, Klaus
>
>
>
> _______________________________________________
> Faudiostream-users mailing list
> Faudiostream-users@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/faudiostream-users
>
> _______________________________________________
> Faudiostream-users mailing 
> listFaudiostream-users@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/faudiostream-users
>
> _______________________________________________
> Faudiostream-users mailing list
> Faudiostream-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to