Murphy's law ... clipping in higher orders for N3D

12 views
Skip to first unread message

e deleflie

unread,
Jun 18, 2009, 3:14:29 AM6/18/09
to ambis...@googlegroups.com
All,

I'm playing around with 3rd order ambisonics (N3D) ... trying to get
the Doppler effect right by modelling a sonic boom.

The 13th channel ... X32 ... has clipped on the boom ... see here:

http://www.flickr.com/photos/as_david_wedding/3638159214/in/photostream/

Not being sure if my modelling was wrong or if something else was at
play ... I thought I'd try the same experiment in SN3D ... which is
supposed to not clip in the higher orders before the 1st order clips.

see here:

http://www.flickr.com/photos/as_david_wedding/3637346247/in/photostream/

There are, indeed, no clipped channels when using SN3D! Funny how
Murphy's law will bite you at the most unexpected times ... :)

The movement is purely left to right ... then right to left (where the
boom is). And yes ... its a single point source of sound. If anyone
wants the 16 channel files, you're more than welcome.

Etienne

Richard Lee

unread,
Jun 19, 2009, 3:51:36 AM6/19/09
to Ambisonics
> .... modelling a sonic boom.

>The 13th channel ... X32 ... has clipped on the boom ... see here:

http://www.flickr.com/photos/as_david_wedding/3638159214/in/photostream/

If I was recording a sonic boom to be played back on domestic (or professional)
gear I would want ALL channels to be clipped. This is in line with the
musical(?) and dramatic sense of any situations where a sonic boom is
appropriate.

A good illustration of this principle is Mike Skeet's famous "Garage Door"
recording. The Mk4 Soundfield and PCM-F1 are clipped. If you are using
1000W/channel into efficient speakers to play at the correct level, the amp
will be clipped.

A more common example is that it is impossible to record a live big orchestral
event at a sensible / correct level for CD (ie 16b) without clipping the
applause.

In all these cases, the clipping does not degrade the musical(?) / dramatic
effect and often enhances it.

How are you doing the SN3D & N3D encoding?

e deleflie

unread,
Jun 18, 2009, 7:19:30 PM6/18/09
to ambis...@googlegroups.com
> ....  modelling a sonic boom.

>The 13th channel ... X32 ... has clipped on the boom ... see here:

http://www.flickr.com/photos/as_david_wedding/3638159214/in/photostream/
 
In all these cases, the clipping does not degrade the musical(?) / dramatic
effect and often enhances it.

yes, I agree... the clipping communicates an impression of un-handle-able volume saturation. i.e. something big.

I'm not sure the sonic boom is being modeled correctly. I'm using a variable delay line with cubic interpolation ... to model Doppler effect. It creates an accurate pitch-shift ... but I'm not convinced this technique produces an accurate sonic boom.

But have a look at these levels here .... I have adjusted the N3D levels to avoid clipping in channel 13 ...

http://www.flickr.com/photos/as_david_wedding/3638505312/in/photostream/

Now practically every channel is as low as the higher order channels in SN3D. So would it not be correct to say that if you get clipping in the higher orders of N3D... the only way to cope is to degrade all the other channels? In SN3D, the first order channels are not degraded.
 
How are you doing the SN3D & N3D encoding?

On SuperCollider ... which I have discovered is far superior to PD.

Here's my N3D formulas (cut and pasted out of my SuperCollider Synth)

        // Zeroth Order
        var w0 = 1;
       
        // 1st Order
        var x1 = cos(aziD) * sqrt(3) * eleD.cos ; // cos theta root3 cos lambda
        var y1 = sin(aziD) * sqrt(3) * eleD.cos ; // sin theta root3 cos lambda
        var z1 =              sqrt(3) * eleD.sin ; //root3 sin lambda
       
        // 2nd Order
        var x20 = cos(2 * aziD)     * sqrt(15/4) * eleD.cos.cos ; // cos 2theta root15/4 cos2 lambda
        var y20 = sin(2 * aziD)     * sqrt(15/4) * eleD.cos.cos ; // sin 2theta root15/4 cos2 lambda
        var x21 = cos(aziD)            * sqrt(15) * eleD.cos * eleD.sin ; // cos theta root15 cos lambda sin lambda
        var y21 = sin(aziD)         * sqrt(15) * eleD.cos * eleD.sin ; // sin theta root15 cos lambda sin lambda
        var z22 = sqrt(5/4) * ( (3 * eleD.sin.sin) - 1 )   ; // root5/4 (3sin2 lambda  - 1);
       
        // 3rd Order
        var x30 = cos(3 * aziD) * sqrt(35/8)  * eleD.cos.cos.cos; // cos 3theta root(35/8) cos3 lambda
        var y30 = sin(3 * aziD) * sqrt(35/8)  * eleD.cos.cos.cos; // sin 3theta root(35/8) cos3 lambda
        var x31 = cos(2 * aziD) * sqrt(105/4) * eleD.cos.cos * eleD.sin; // cos 2theta root(105/4) cos2 lambda sin lambda
        var y31 = sin(2 * aziD) * sqrt(105/4) * eleD.cos.cos * eleD.sin; // sin 2theta root(105/4) cos2 lambda sin lambda
        var x32 = cos(aziD) * sqrt(21/8) * eleD.cos * ((5 * eleD.sin.sin) - 1); // cos theta root(21/8) cos lambda (5sin2 lambda - 1)
        var y32 = sin(aziD) * sqrt(21/8) * eleD.cos * ((5 * eleD.sin.sin) - 1); // sin theta root(21/8) cos lambda (5sin2 lambda - 1)
        var z33 = sqrt(7/4) * ((5 * eleD.sin.sin.sin) - (3 * eleD.sin)); // root(7/4) (5sin3 lambda - 3sin lambda)

Etienne
 



e deleflie

unread,
Jun 18, 2009, 7:44:55 PM6/18/09
to ambis...@googlegroups.com
Here it is again, without the confusing comments (N3D):


        // Zeroth Order
        var w0 = 1;
       
        // 1st Order
        var x1 = cos(aziD) * sqrt(3) * eleD.cos ;
        var y1 = sin(aziD) * sqrt(3) * eleD.cos ;
        var z1 =              sqrt(3) * eleD.sin ;
       
        // 2nd Order
        var x20 = cos(2 * aziD)     * sqrt(15/4) * eleD.cos.cos ;
        var y20 = sin(2 * aziD)     * sqrt(15/4) * eleD.cos.cos ;
        var x21 = cos(aziD)            * sqrt(15) * eleD.cos * eleD.sin ;
        var y21 = sin(aziD)         * sqrt(15) * eleD.cos * eleD.sin ;
        var z22 = sqrt(5/4) * ( (3 * eleD.sin.sin) - 1 ) ;
       
        // 3rd Order
        var x30 = cos(3 * aziD) * sqrt(35/8)  * eleD.cos.cos.cos;
        var y30 = sin(3 * aziD) * sqrt(35/8)  * eleD.cos.cos.cos;
        var x31 = cos(2 * aziD) * sqrt(105/4) * eleD.cos.cos * eleD.sin;
        var y31 = sin(2 * aziD) * sqrt(105/4) * eleD.cos.cos * eleD.sin;
        var x32 = cos(aziD) * sqrt(21/8) * eleD.cos * ((5 * eleD.sin.sin) - 1);
        var y32 = sin(aziD) * sqrt(21/8) * eleD.cos * ((5 * eleD.sin.sin) - 1);
        var z33 = sqrt(7/4) * ((5 * eleD.sin.sin.sin) - (3 * eleD.sin));

Etienne
Reply all
Reply to author
Forward
0 new messages