Csound Csound-dev Csound-tekno Search About

[Csnd] Third order ambisonics rotation

Date2018-03-18 17:22
FromRuben Sverre Gjertsen
Subject[Csnd] Third order ambisonics rotation
Hello,

I have a question for the ambisonics experts on this list. I’m loooking for the algorithm for 3D rotation of third order ambisonics, roll, pitch, yaw(rotation). Blue ripple has an a solution up to second order:
The next step would be adding third order. 

For rotation/yaw (y to x): I found the solution in a text by Dave Malham (Higher order Ambisonic systems, 2003), where it is noted that the other 2 directions are complicated and have not been solved yet. I would assume lots of things have been happening since 2003, but I haven’t found sources describing roll and pitch in third order directly.
For pitch (z to x), I have guessed channel 9-11 would be a mirror of 6-8, as 4-5 is a mirror of 2-3, while 12-15 should be something even more complex. I’m stuck on those last 4 channels. It’s a guess, I could of course be wrong.
For roll  (y to z), I’m not able to see the continuation for 9-15 at all.

I include a part of my incomplete  csound instrument, applying the rotations to the audio signals.
Do you have some hints on where I could find the missing calculations?

It would of course be great to have an opcode for 3D rotation, but solving it this way would be a good start.

Best
Ruben Gjertsen


;------------------------------------------------
kroll=kazimuth   ;0-360!
kpitch=kelevation
kyaw=kdistance
;------------------------------------------------
;ROLL (y to z)

     ;0 order
awroll=a2ambW*1

    ;1st order (ACN order)
ayroll=(a2ambY*(cos(kroll)))-(a2ambZ*(sin(kroll)))
azroll=(a2ambY*(sin(kroll)))+(a2ambZ*(cos(kroll)))
axroll=a2ambZ*1

    ;2nd order (FuMa names in ACN order)
avroll=(a2ambV*(cos(kroll))) - (a2ambS *(sin(kroll)))       ;v or ACN 4
atroll=(a2ambT*(cos(2*kroll)))  -(a2ambR*((sqrt(3/4)*(sin(2*kroll)))))  - (a2ambU*((1/2)*sin(2*kroll)))   ;t or ACN 5
arroll=(a2ambT*(sqrt(3/4)*sin(2*kroll)))  +(a2ambR*((1/4)*(1+(3*(cos(2*kroll))))))  -(a2ambU*((sqrt(3/16))*(1-(cos(2*kroll)))))         ;r or ACN 6
asroll=(a2ambV*(sin(kroll)))  +(a2ambS*(cos(kroll)))         ;s or ACN 7
auroll=(a2ambT*((1/2)*sin(2*kroll)))   -(a2ambR*((sqrt(3/16))* (1 -(cos(2*kroll)))))  +(a2ambU*((1/4)*(3+(cos(2*kroll)))))  ;u or ACN 8   
 
       ;3rd order? ACN order
       ;unknown algorithm!
;aqroll= ?
;aoroll= ?
;amroll= ?
;akroll= ?
;alroll= ?
;anroll= ?
;aproll= ?    

;     0=w  1=y        2=z       3=x  4=v       5=t                 6=r                        7=s          8=u                       9=q        10=o       11=m       12=k      13=l     14=n       15=p
;0=w ;1    0
;1=y ;0    cos(roll) -sin(roll) 0
;2=z ;0    sin(roll) cos(roll)  0 
;3=x ;0    0          0         1
;4=v ;0    0          0         0    cos(roll) 0                   0                           -sin(roll)  0
;5=t ;0    0          0         0    0         cos(2roll)          -sqrt(3/4)sin(2roll)        0           -1/2 sin(2roll) 
;6=r ;0    0          0         0    0         sqrt(3/4)sin(2roll)  1/4(1+3cos(2roll))         0           -sqrt(3/16)(1- cos(2roll))
;7=s ;0    0          0         0    sin(roll) 0                   0                           cos(roll)    0
;8=u ;0    0          0         0    0         1/2 sin(2roll)      -sqrt(3/16)(1- cos(2roll))  0            1/4 (3+cos(2roll))
;9=q  ;0   0          0         0    0         0                   0                           0            0                           IQ-test!! 
;10=o ;0   0          0         0    0         0                   0                           0            0                           ? 
;11=m ;0   0          0         0    0         0                   0                           0            0                           ?  
;12=k ;0   0          0         0    0         0                   0                           0            0                           ?
;13=l ;0   0          0         0    0         0                   0                           0            0                           ?
;14=n ;0   0          0         0    0         0                   0                           0            0                           ?
;15=p ;0   0          0         0    0         0                   0                           0            0                           ?

  
;-----------------------------------------------       
;;PITCH (z to x)
     ;0 order
awpitch=awroll*1

     ;1st order
aypitch=ayroll*1
azpitch=  (azroll*(cos(kpitch)))   +(axroll*(sin(kpitch)))
axpitch=  (azroll*(cos(kpitch)))   -(axroll*(sin(kpitch)))

     ;2nd order (FuMa names in ACN order)
avpitch=  (avroll*(cos(kpitch)))   -(atroll*(sin(kpitch)))     ;v or ACN 4
atpitch= (avroll*(sin(kpitch)))   +(atroll*(cos(kpitch))) ;t or ACN 5
arpitch= (arroll*((1/4)*(1+(3*cos(2*kpitch)))))  +(asroll*((sqrt(3/4))*(sin(2*kpitch))))  +(auroll*((sqrt(3/16))*(1-(cos(2*kpitch)))))  ;r or ACN 6
aspitch= -(arroll*((sqrt(3/4))*sin(2*kpitch))) +(asroll*(cos(2*kpitch)))  +(auroll*((1/2)*sin(2*kpitch)))       ;s or ACN 7
aupitch= (arroll*((sqrt(3/16))*(1-(cos(2*kpitch)))))  -(asroll *((1/2)*sin(2*kpitch)))  +(auroll*((1/4)*(3+cos(2*kpitch))))   ;u or ACN 8 

       ;3rd order   ACN order
;aqpitch= (aqroll*((1/4)*cos(2*kpitch))) -(aoroll*((1/2)*sin(2*kpitch)))  +(amroll* ((sqrt(3/16))*(1-cos(2*kpitch))))  
;aopitch= (aqroll*((1/2)*sin(2*kpitch))) +(aoroll*(cos(2*kpitch)))    -(amroll*((sqrt(3/4))*sin(2*kpitch)))    
;ampitch= (aqroll*((sqrt(3/16))*(1-(cos(2*kpitch))))) +(aoroll*((sqrt(3/4))*sin(2*kpitch)))  +(amroll*((1/4)*(1+(3*(cos(2*kpitch))))))   
    ;4x4 of unknown more complex calculations    
;akpitch= ?
;alpitch= ?
;anpitch= ?

;appitch= ?

;     0=w  1=y        2=z         3=x        4=v          5=t         6=r                        7=s                  8=u                         9=q                         10=o                 11=m                           12=k       13=l          14=n       15=p
;0=w ;1    0          0           0     
;1=y ;0    1          0           0 
;2=z ;0    0          cos(pitch)  sin(pitch)
;3=x ;0    0          -sin(pitch) cos(pitch) 
;4=v ;0    0          0           0          cos(pitch)  -sin(pitch)  0                          0                    0
;5=t ;0    0          0           0          sin(pitch)  cos(pitch)   0                          0                    0
;6=r ;0    0          0           0          0           0            1/4(1+3cos(2pitch))        sqrt(3/4)sin(2pitch) sqrt(3/16)(1- cos(2pitch))
;7=s ;0    0          0           0          0           0            -sqrt(3/4)sin(2pitch)      cos(2pitch)          1/2 sin(2pitch) 
;8=u ;0    0          0           0          0           0            sqrt(3/16)(1- cos(2pitch)) -1/2 sin(2pitch)     1/4 (3+cos(2pitch))          
;9=q  ;0   0          0           0          0           0            0                          0                     0                            1/4 (3+cos(2pitch))        -1/2 sin(2pitch)     sqrt(3/16)(1- cos(2pitch))    0           0           0          0
;10=o ;0   0          0           0          0           0            0                          0                     0                            1/2 sin(2pitch)            cos(2pitch)          -sqrt(3/4)sin(2pitch)         0           0           0          0
;11=m ;0   0          0           0          0           0            0                          0                     0                            sqrt(3/16)(1- cos(2pitch)) sqrt(3/4)sin(2pitch)  1/4(1+3cos(2pitch))          0           0           0          0
;12=k ;0   0          0           0          0           0            0                          0                     0                            0                           0                    0                            ?cos(3pitch)   ?sin(3pitch)  ?cos(3pitch)  ?sin(3pitch)
;13=l ;0   0          0           0          0           0            0                          0                     0                            0                           0                    0                            -?sin(3pitch)   ?cos(3pitch)  ?sin(3pitch)  ?cos(3pitch)
;14=n ;0   0          0           0          0           0            0                          0                     0                            0                           0                    0                            ?cos(3pitch)   -?sin(3pitch)  ?cos(3pitch)  ?sin(3pitch)
;15=p ;0   0          0           0          0           0            0                          0                     0                            0                           0                    0                            ?sin(3pitch)   ?cos(3pitch)  -?sin(3pitch)  ?cos(3pitch) 


;----------------------------------------------- 
;SKIP ROLL(tilt) PITCH(tumble) until it can be solved completely in third order!
awpitch=a2ambW ;TEMPORARY
axpitch=a2ambX ;TEMPORARY
aypitch=a2ambY ;TEMPORARY
azpitch=a2ambZ ;TEMPORARY
arpitch=a2ambR ;TEMPORARY
aspitch=a2ambS ;TEMPORARY
atpitch=a2ambT ;TEMPORARY
aupitch=a2ambU ;TEMPORARY
avpitch=a2ambV ;TEMPORARY
akpitch=a2ambK ;TEMPORARY
alpitch=a2ambL ;TEMPORARY
ampitch=a2ambM ;TEMPORARY
anpitch=a2ambN;TEMPORARY
aopitch=a2ambO ;TEMPORARY
appitch=a2ambP ;TEMPORARY
aqpitch=a2ambQ;TEMPORARY
;-----------------------------------------------       

;YAW (y to x, horisontal)
; USE ONLY YAW (ROTATE!) until high order solutions of roll and pitch have been found!
   ;In a 2D setup, this is the most efficient direction
     ;0 order
awyaw=awpitch*1

      ;1st order 
ayyaw=  (aypitch*(cos(kyaw)))   +(axpitch*(sin(kyaw)))
azyaw=    azpitch*1
axyaw=  -(aypitch*(sin(kyaw)))  +(axpitch*(cos(kyaw)))

      ;2nd order (FuMa names in ACN order)
avyaw=   (avpitch*(cos(2*kyaw)))   +(aupitch*(sin(2*kyaw)))     ;v or ACN 4
atyaw=  (atpitch*(cos(kyaw)))    +(aspitch*(sin(kyaw)))    ;t or ACN 5
aryaw=      arpitch*1      ;r or ACN 6
asyaw=  -(atpitch*(sin(kyaw)))  + (aspitch*(cos(kyaw)))       ;s or ACN 7
auyaw=  -(avpitch*(sin(2*kyaw))) +(aupitch*(cos(2*kyaw)))     ;u or ACN 8 

      ;3rd order ACN order   
aqyaw= (aqpitch*(cos(3*kyaw)))   + (appitch*(sin(3*kyaw)))   
aoyaw= (aopitch*(cos(2*kyaw)))   + (anpitch*(sin(2*kyaw)))   
amyaw= (ampitch*(cos(kyaw)))     + (alpitch*(sin(kyaw)))  
akyaw=       akpitch*1
alyaw=  -(ampitch*(sin(kyaw)))   + (alpitch*(cos(kyaw)))     
anyaw=  -(aopitch*(sin(2*kyaw)))  +(anpitch*(cos(2*kyaw)))   
apyaw=  -(aqpitch*(sin(3*kyaw)))  + (appitch*(cos(3*kyaw)))  
      
;     0=w  1=y      2=z      3=x          4=v          5=t      6=r   7=s      8=u         9=q        10=o       11=m       12=k      13=l     14=n       15=p
;0=w ;1    0          0       0
;1=y ;0    cos(yaw)   0       sin(yaw)
;2=z ;0    0          1       0
;3=x ;0    -sin(yaw)  0       cos(yaw)
;4=v ;0    0          0        0           cos(2yaw)   0         0    0        sin(2yaw)
;5=t ;0    0          0        0           0           cos(yaw)  0    sin(yaw) 0
;6=r ;0    0          0        0           0           0         1    0        0
;7=s ;0    0          0        0           0           -sin(yaw) 0    cos(yaw) 0
;8=u ;0    0          0        0           -sin(2yaw)  0         0    0        cos(2yaw)
;9=q  ;0    0          0        0           0           0         0    0        0           cos(3yaw)  0          0          0         0        0          sin(3yaw) 
;10=o ;0    0          0        0           0           0         0    0        0           0          cos(2yaw)  0          0         0        sin(2yaw)  0  
;11=m ;0    0          0        0           0           0         0    0        0           0          0          cos(yaw)   0         sin(yaw) 0          0
;12=k ;0    0          0        0           0           0         0    0        0           0          0          0          1         0        0          0
;13=l ;0    0          0        0           0           0         0    0        0           0          0          -sin(yaw)  0         cos(yaw) 0          0
;14=n ;0    0          0        0           0           0         0    0        0           0          -sin(2yaw) 0          0         0        cos(2yaw)  0
;15=p ;0    0          0        0           0           0         0    0        0           -sin(3yaw) 0          0          0         0        0          cos(3yaw)

;roll and pitch is more difficult
;Zotter: 90 degree rotation around y-axis, read Zotter!
;     Not much clearer yet.....

;Back to FuMa Order: 
aw=awyaw ;multiplier here?
ax=axyaw
ay=ayyaw
az=azyaw
ar=aryaw
as=asyaw
at=atyaw
au=auyaw
av=avyaw
ak=akyaw
al=alyaw
am=amyaw
an=anyaw
ao=aoyaw
ap=apyaw
aq=aqyaw

;------------------------------------------------
outch 1, aw,2, ax,3, ay,4, az ,5, ar , 6 ,as, 7,at ,8,au ,9, av  ,10, ak, 11, al, 12, am, 13, an, 14, ao, 15, ap, 16, aq