Skip to content

Commit

Permalink
add: FoaMu, FoaNF
Browse files Browse the repository at this point in the history
Two new FOA soundfield indicators:

- FoaMu - indicates how much like a travelling wave: mu.real.cos

- FoaNF - estimates FOA radius
  • Loading branch information
joslloand committed Jul 22, 2021
1 parent 94b3360 commit 63119f4
Show file tree
Hide file tree
Showing 12 changed files with 273 additions and 7 deletions.
136 changes: 136 additions & 0 deletions Classes/ATKAnalyze.sc
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,11 @@
// Class: FoaAlpha
// Class: FoaBeta
// Class: FoaGamma
// Class: FoaMu
//
// Class: FoaThetaPhiA
// Class: FoaThetaPhiR
// Class: FoaNF
//
// Class: FoaIa
// Class: FoaIr
Expand Down Expand Up @@ -941,6 +943,47 @@ FoaGamma : FoaEval {
}


// FOA Active Admittance Balance Angle: Mu
FoaMu : FoaEval {
*ar { |in, size = 2048, method = \instant|
var p, u;
var pReIm, wp, ia, magIa;
var wpSquared, magIaSquared;
var normFac;

in = this.checkChans(in);
p = 2.sqrt * in[0]; // w * 2.sqrt = pressure
u = in[1..3]; // [x, y, z] = velocity (vector)

case(
{ method == \instant }, {
pReIm = HilbertW.ar(p, size);
wp = pReIm.squared.sum;
wpSquared = wp.squared;

ia = HilbertW.ar(u, size).collect({ |item|
(pReIm * item).sum
});
magIaSquared = ia.squared.sum;
magIa = magIaSquared.sqrt;

^atan2(wpSquared - magIaSquared, (2 * wp * magIa) + DC.ar(FoaEval.reg))
},
{ method == \average }, {
normFac = 2 * size.reciprocal;

wp = normFac * RunningSum.ar(p.squared, size);
wpSquared = wp.squared;
ia = normFac * RunningSum.ar(p * u, size);
magIaSquared = ia.squared.sum;
magIa = magIaSquared.sqrt;

^atan2(wpSquared - magIaSquared, (2 * wp * magIa) + DC.ar(FoaEval.reg))
}
)
}
}

//--
// "Third party" indicators go here....

Expand Down Expand Up @@ -1071,6 +1114,73 @@ FoaThetaPhiR : FoaEval {
}


//------------------------------------------------------------------------
// FOA SOUNDFIELD RADIUS

// FOA Nearfield (Spherical) Radius
FoaNF : FoaEval {
*ar { |in, size = 2048, method = \instant|
var p, u;
var pInteg, uInteg;
var pReIm, wp, ia, aa;
var pReImInteg, wpInteg, iaInteg, aaInteg;
var normFac;
var radius;

var freq = AtkFoa.speedOfSound / 2pi; // 2nd order HP, precondition
var a0 = 0.5; // integrator
var a1 = 0.5;
var b1 = 1.0;


in = this.checkChans(in);
p = 2.sqrt * in[0]; // w * 2.sqrt = pressure
u = in[1..3]; // [x, y, z] = velocity (vector)

pInteg = FOS.ar(HPF.ar(p, freq), a0, a1, b1); // precondition, integrate p
uInteg = HPF.ar(u, freq); // precondition u

case(
{ method == \instant }, {
pReIm = HilbertW.ar(p, size);
wp = pReIm.squared.sum;
ia = HilbertW.ar(u, size).collect({ |item|
(pReIm * item).sum
});
aa = ia / (wp + DC.ar(FoaEval.reg));

pReImInteg = HilbertW.ar(pInteg, size);
wpInteg = pReImInteg.squared.sum;
iaInteg = HilbertW.ar(uInteg, size).collect({ |item|
(pReImInteg * item).sum
});
aaInteg = iaInteg / (wpInteg + DC.ar(FoaEval.reg));

radius = (AtkFoa.speedOfSound * SampleDur.ir) * (aa.squared.sum / ((aa * aaInteg).sum + DC.ar(FoaEval.reg)));

^radius
},
{ method == \average }, {
normFac = 2 * size.reciprocal;

wp = normFac * RunningSum.ar(p.squared, size);
ia = normFac * RunningSum.ar(p * u, size);
aa = ia / (wp + DC.ar(FoaEval.reg));

wpInteg = normFac * RunningSum.ar(pInteg.squared, size);
iaInteg = normFac * RunningSum.ar(pInteg * uInteg, size);
aaInteg = iaInteg / (wpInteg + DC.ar(FoaEval.reg));

radius = (AtkFoa.speedOfSound * SampleDur.ir) * (aa.squared.sum / ((aa * aaInteg).sum + DC.ar(FoaEval.reg)));

^radius
}
)
}
}



//------------------------------------------------------------------------
// FOA INTENSITY - vectors

Expand Down Expand Up @@ -1720,6 +1830,19 @@ FoaAnalyze : FoaEval {
)
},

\mu, {

ugen = FoaMu;
argDefaults = [2048, \instant];

argDict = this.argDict(ugen, args, argDefaults);

^ugen.ar(
in,
argDict.at(\size), argDict.at(\method)
)
},

\thetaPhia, {

ugen = FoaThetaPhiA;
Expand All @@ -1746,6 +1869,19 @@ FoaAnalyze : FoaEval {
)
},

\NF, {

ugen = FoaNF;
argDefaults = [2048, \instant];

argDict = this.argDict(ugen, args, argDefaults);

^ugen.ar(
in,
argDict.at(\size), argDict.at(\method)
)
},

\Ia, {

ugen = FoaIa;
Expand Down
28 changes: 27 additions & 1 deletion Classes/AtkFoa.sc
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
AtkFoa {
classvar <refRadius;
classvar <speedOfSound, <refRadius;
classvar <defaultOrder;
classvar format;

*initClass {
speedOfSound = 333.0; // (m/s)
/*
NOTE: this value is implied by the current setting of the cutoff
frequency (53 Hz) found in the sc3-plugins code for FoaProximity & FoaNFC
freq = speedOfSound / 2pi // wavenumber = 1
speedOfSound = 53 * 2pi // 333.0
this value is the speed of sound @ 3C
https://www.weather.gov/epz/wxcalc_speedofsound
TODO: consider updating sc3-plugins to align with
AtkHoa.speedOfSound = 343.0
*/
refRadius = inf; // reference encoding / decoding radius, i.e., basic radius

defaultOrder = 1;
Expand All @@ -22,4 +36,16 @@ AtkFoa {
*normalisation {
^format[1]
}

*setSpeedOfSound { |mps|
var mpsAsFloat;

mpsAsFloat = mps.asFloat;
/*
NOTE: this is a convenience value, only effecting FoaNF (radial analysis);
does NOT currently update FoaProximity & FoaNFC
*/
speedOfSound = mpsAsFloat;
^mpsAsFloat
}
}
20 changes: 20 additions & 0 deletions HelpSource/Classes/AtkFoa.schelp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,26 @@ AtkFoa.refRadius
::


METHOD:: speedOfSound
Ambisonic Toolkit (FOA) speed of sound, in meters per second.

code::
AtkFoa.speedOfSound
::


METHOD:: setSpeedOfSound
Setter for link::#*speedOfSound::.

note::
Setting this value only effects the speed of sound for soundfield analysis via link::Classes/FoaNF::, and does NOT currently update the value used by link::Classes/FoaProximity:: & link::Classes/FoaNFC::.
::


ARGUMENT:: mps
Speed of sound, in meters per second.



EXAMPLES::

Expand Down
2 changes: 1 addition & 1 deletion HelpSource/Classes/AtkHoa.schelp
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Radius, in meters.


METHOD:: speedOfSound
Ambisonic Toolkit speed of sound, in meters per second.
Ambisonic Toolkit (HOA) speed of sound, in meters per second.

code::
AtkHoa.speedOfSound
Expand Down
2 changes: 1 addition & 1 deletion HelpSource/Classes/FoaAlpha.schelp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CLASS:: FoaAlpha
summary:: First Order Ambisonic (FOA) Soundfield Active-Reactive Intensity Balance
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaBeta, Classes/FoaGamma, Classes/FoaMagIa, Classes/FoaMagIr
related:: Classes/FoaBeta, Classes/FoaGamma, Classes/FoaMu, Classes/FoaMagIa, Classes/FoaMagIr

DESCRIPTION::
Return the emphasis::Active-Reactive Intensity Balance:: of a first order ambisonic (B-format) signal, in radians.
Expand Down
4 changes: 4 additions & 0 deletions HelpSource/Classes/FoaAnalyze.schelp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ definitionList::
## code:: 'alpha' :: || link::Classes/FoaAlpha::
## code:: 'beta' :: || link::Classes/FoaBeta::
## code:: 'gamma' :: || link::Classes/FoaGamma::
## code:: 'mu' :: || link::Classes/FoaMu::

## Soundfield Energies
## code:: 'Wp' :: || link::Classes/FoaWp::
Expand All @@ -60,6 +61,9 @@ definitionList::
## code:: 'thetaPhiA' :: || link::Classes/FoaThetaPhiA::
## code:: 'thetaPhiR' :: || link::Classes/FoaThetaPhiR::

## Soundfield Radius
## code:: 'NF' :: || link::Classes/FoaNF::

## Soundfield Intensities - vectors
## code:: 'Ia' :: || link::Classes/FoaIa::
## code:: 'Ir' :: || link::Classes/FoaIr::
Expand Down
2 changes: 1 addition & 1 deletion HelpSource/Classes/FoaBeta.schelp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CLASS:: FoaBeta
summary:: First Order Ambisonic (FOA) Soundfield Potential-Kinetic Energy Balance
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaBeta, Classes/FoaGamma, Classes/FoaWd, Classes/FoaMagI
related:: Classes/FoaAlpha, Classes/FoaGamma, Classes/FoaMu, Classes/FoaWd, Classes/FoaMagI

DESCRIPTION::
Return the emphasis::Potential-Kinetic Energy Balance:: of a first order ambisonic (B-format) signal, in radians.
Expand Down
2 changes: 1 addition & 1 deletion HelpSource/Classes/FoaGamma.schelp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CLASS:: FoaGamma
summary:: First Order Ambisonic (FOA) Soundfield Active-Reactive Intensity Alignment
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaAlpha, Classes/FoaGamma, Classes/FoaIa, Classes/FoaIr
related:: Classes/FoaAlpha, Classes/FoaBeta, Classes/FoaMu, Classes/FoaIa, Classes/FoaIr

DESCRIPTION::
Return the emphasis::Active-Reactive Intensity Alignment:: of a first order ambisonic (B-format) signal, in radians.
Expand Down
40 changes: 40 additions & 0 deletions HelpSource/Classes/FoaMu.schelp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
CLASS:: FoaMu
summary:: First Order Ambisonic (FOA) Soundfield Active Admittance Balance
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaAlpha, Classes/FoaBeta, Classes/FoaGamma, Classes/FoaMagIa, Classes/FoaWp

DESCRIPTION::
Return the emphasis::Active Admittance Balance:: of a first order ambisonic (B-format) signal, in radians.


NOTE::
link::Classes/FoaMu:: is usually called via the convenience wrapper link::Classes/FoaAnalyze::.
::


CLASSMETHODS::

METHOD:: ar

argument:: in
The B-format signal, an array: [w, x, y, z]

argument:: size
Analysis filter kernel size.

NOTE::For strong::method::: code::'instant'::, must be a power of 2.::

argument:: method
The Soundfield analysis method:

list::
## code::'instant'::
## code::'average'::
::

Please see discussion of strong::method:: link::Classes/FoaAnalyze#Analysis%20method#here::.


EXAMPLES::

Please see various examples link::Classes/FoaAnalyze#examples#here::.
40 changes: 40 additions & 0 deletions HelpSource/Classes/FoaNF.schelp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
CLASS:: FoaNF
summary:: First Order Ambisonic (FOA) near-field distance estimate
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaThetaPhiA, Classes/FoaThetaPhiR, Classes/FoaIa, Classes/FoaMagIa

DESCRIPTION::
Return the emphasis::near-field distance estimate:: of a first order ambisonic (B-format) signal, in meters.


NOTE::
link::Classes/FoaNF:: is usually called via the convenience wrapper link::Classes/FoaAnalyze::.
::


CLASSMETHODS::

METHOD:: ar

argument:: in
The B-format signal, an array: [w, x, y, z]

argument:: size
Analysis filter kernel size.

NOTE::For strong::method::: code::'instant'::, must be a power of 2.::

argument:: method
The Soundfield analysis method:

list::
## code::'instant'::
## code::'average'::
::

Please see discussion of strong::method:: link::Classes/FoaAnalyze#Analysis%20method#here::.


EXAMPLES::

Please see various examples link::Classes/FoaAnalyze#examples#here::.
2 changes: 1 addition & 1 deletion HelpSource/Classes/FoaThetaPhiA.schelp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CLASS:: FoaThetaPhiA
summary:: First Order Ambisonic (FOA) Azimuth & Elevation of Soundfield Active Intensity Vector
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaIa, Classes/FoaMagIa, Classes/FoaThetaPhiR
related:: Classes/FoaIa, Classes/FoaMagIa, Classes/FoaThetaPhiR, Classes/FoaNF

DESCRIPTION::
Return the emphasis::Azimuth & Elevation of Active Intensity Vector:: of a first order ambisonic (B-format) signal.
Expand Down
2 changes: 1 addition & 1 deletion HelpSource/Classes/FoaThetaPhiR.schelp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
CLASS:: FoaThetaPhiR
summary:: First Order Ambisonic (FOA) Azimuth & Elevation of Soundfield Reactive Intensity Vector
categories:: Libraries>Ambisonic Toolkit>UGens>FOA>Analyzer, UGens>Multichannel>Ambisonics, UGens>Analysis>Ambisonics
related:: Classes/FoaIr, Classes/FoaMagIr, Classes/FoaThetaPhiA
related:: Classes/FoaIr, Classes/FoaMagIr, Classes/FoaThetaPhiA, Classes/FoaNF

DESCRIPTION::
Return the emphasis::Azimuth & Elevation of Reactive Intensity Vector:: of a first order ambisonic (B-format) signal.
Expand Down

0 comments on commit 63119f4

Please sign in to comment.