Ambisonic Surround-Sound
Principles and Practice

Ambisonics is a generalised way of representing the distribution of sounds from all directions around a listener, or soundfield. Invented in the 1970s, it has now found application in listener-centric custom audio rendering.

Simon N Goodwin has used Ambisonics in game development probably longer than anyone else (Stephan Schutze, New Realities in Audio, CRC Press 2018). This chapter explains how and why.

The introduction contrasts old-fashioned surround mixing techniques with modern speaker-agnostic ones for 3D games and VR. It explains A-Format, B-Format, G-Formats and Higher-Order Ambisonics, showing how higher orders interlock spatially.

Problems resolved include 7.1 channel surround ordering, spatial and distance distortion caused by cinematic fold-down, flaws of downmix formulae and pairwise mixing, handling of non-diegetic content and Ambisonic anti-phase components, AmbiX, SN3D and FuMa data reconciliation.

Solutions address interior panning, volumetric sources which change perceived width with distance, downmix avoidance, efficiency and scalability, preferred flat and 3D speaker layouts, trigonometric optimisations, irregular distance compensation and shelving filters.

C++ examples cover fast one-step first-order Ambisonic panning for 5.1 speakers, transcoding G-Format mixes back to B-Format for reorientation, efficient hybrid third-order encoding and decoding for regular 2D and 3D speaker layouts and decoding and reorientation of premixed soundfields.

An unsatisfactory tetrahedronal surround layout
This tetrahedronal layout of speakers looks like a neat variation for 5.1 speaker rigs, but it doesn't deliver convincing 3D sound. The chapter explains why, and what is needed to fix it

Further reading

Design and Selection of Digital Filters - next chapter abstract.
Panning sounds for loudspeakers and headphones - previous chapter abstract.
Return to the index of chapters.
Click here to get your own copy of Beep To Boom.

Copyright © 2019 Simon N Goodwin     [';']