[Vorbis-dev] 5.1 surround channel coupling

Sebastian Gesemann sgeseman at uni-paderborn.de
Wed Jan 31 13:22:17 PST 2007


Apart from the information that's already available (Vorbis 
specification, the stereo.html thingy that explains among other things 
what square polar mappint is about, discussions) some of the following 
ideas/views/suggestions might be helpful for implementing "multichannel 
coupling":


[ 2 channel coupling revisited ]
- square polar mapping (with IMHO limited benefit)
- residue vectors can be interleaved
- interleaved residue vectors + VQ allows exploitating
   inter-channel redundancies


[ How does Dolby Digital work w.r.t. multichannel coding? ]
- A channel (L,R,C,SR,...) can either be a "full bandwidth" (FB)
   channel which means it's coded independently from the others
   OR a channel that takes part in the "coupling" process.
- The number of non-FB channels is either 0 or >=2.
- If non-FB channels exist, their lower spectrum part is coded
   normally (independently). All non-FB channels borrow their
   higher spectrum part from "the coupling channel" whose gain is
   determined by the channel's "coupling coordinate".
   => "intensity multichannel coding"


[ Possible multichannel extensions for Vorbis ]

(1) Do "pairwise coupling" like it's done with normal stereo material. 
Either in a fixed way or adaptivly (requires more modes to be declared 
in the codec setup packet and switching between them)
EXAMPLE for >=4 channels:
   mode1: coupling (L+R) and (SL+SR) "independently"
   mode2: coupling (L+SL) and (R+SR) "independently"
An encoder may adaptivly switch between both modes or use just a fixed 
one like mode1 for the whole stream.
PROS: should be fairly simple to implement.
CONS: only pairwise coupling.

(2) Do "n-way-coupling" (n>2) where more than two channels are used via 
cascaded square polar mapping. Let's see how well this works:

   // pseudo code example for 5-channel "cascaded" SQPM:
   void sqpm(resVec* ch1, resVec* ch2) {
     // square polar mapping
     // ch1 becomes "magnitude"
     // ch2 becomes "angle"
   }
   :
   resVec* ch1 = L;
   resVec* ch2 = R;
   resVec* ch3 = C;
   resVec* ch4 = SL;
   resVec* ch5 = SR;
   sqpm(ch1,ch2);
   sqpm(ch4,ch5);
   sqpm(ch1,ch4);
   sqpm(ch1,ch3);

This way Dolby-like "intensity multichannel coding" can be done via 
setting residue vector ch1 *appropriately* and the others to ZERO. So 
far so good.
Problem is: You only want to do this intensity coding for the higher 
spectrum part. Since square polar mapping can only be applied on the 
whole audio band you have to use SQPM and code the lower spectrum parts 
of ch2...ch5 for a kind of "lossless coupling".
Next problem is: The lower spectrum parts are still correlated since
square polar mapping isn't good at decorrelating things. That's why in 
2-channel streams they are usually interleaved and VQed to not waste any 
bits. This is where it's getting nasty because IN THIS CASE you have to 
interleave many channels. You *don't* want to design high dimensional 
and large VQ codebooks for those interleaved residue vectors!


Conclusions:
Stick with pairwise channel coupling for multichannel signals. I believe 
this is what MPEG2/4 AAC does anyways (me guessing!)

Comments?


Cheers!
Sebastian


More information about the Vorbis-dev mailing list