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