[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