Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve ADM Renderer, real-time audio process and improve docs #42

Open
wants to merge 35 commits into
base: master
Choose a base branch
from

Conversation

peterStitt
Copy link
Contributor

Several things in this PR:

  1. All DSP processors that could be used on a real-time audio thread have been made real-time-safe (e.g. memory allocations removed).
  2. Several Ambisonic class have been improved to be more state of the art and real-time appropriate. E.g.
    • Psychoacoustic optimisation filters now use low-latency IIRs instead of linear phase IIRs
    • Ambisonics-to-binaural filters now pre-processed with psychoacoustic optimisation filters
    • Improved CAmbisonicDecoder
    • Added AllRAD decoder (needed for ADM renderer)
  3. ADM renderer has been extended and improved to align more closely with the specification. Now supports all ITU specified output layouts as well as IAMF ones.
  4. Added extensive documentation with theory, implementation details and code examples for the main Ambisonics and ADM processors.
  5. Comments in code should be doxygen compatible.

Let me know if you see anything that needs changed :)

peterStitt and others added 30 commits September 9, 2024 16:25
Linkwitz-Riley filter splits the signal into a low- and high-passed signal that sum to have a flat magnitude response.
…spherical harmonic order set that it belongs
…misation using Linkwitz-Riley IIR filtering to be more efficient than current linear-phase FIR in AmbisonicShelfFilters

Deprecate AmbisonicShelfFilters class in favour of new AmbisonicOptimFilters
… the optimisation shelf filters rather than applying it to the input signal
…ch and roll.

Add Octave scripts for the calculation of the rotation matrix equations used in AmbisonicRotator.

Deprecate AmbisonicProcessor. AmbisonicRotator is better for real-time does not require intermediate angular representations.
…ence rather than by copy. This avoids potential unwanted allocations.
Compensate AmbiX inputs in decoding matrix rather than weighting the input signal.

Update preset decoders.

Add Octave scripts for generating header files of the presets.

Add a test that can be used to verify the output of the preset decoders against data in Octave.
…vector of vectors. More inline with standard practice.
…ters.

When selecting a 2D playback system (that does not have an associated preset) for a 3D input signal the decoder and optimisation filters are modified to ensure correct max rE decoding in the high frequency range.
- Modifies decoder to convert from SN3D to SN2D
- Modifies optimisation filters to use 2D max rE gains
…ndard as being optional in a better way.

Previously, vectors were used to check if optional parameters were set by checking size() > 0.
This was unclear, since it implied some metadata parameters could have multiple values, rather than a maximum of 1.
…fixed value in Configure().

Simplify GainInterp internally to be clearer.

AmbisonicEncoder now uses GainInterp internally to handle the smoothing.
1 - Add support for all specified ADM loudspeaker layouts, as well as IAMF layouts (7.1.2 and 3.1.2) and BEAR (9+10+5).
2 - Change HOA decoder in AdmRenderer to use AllRAD
3 - Change binaural rendering in AdmRenderer to decode to a virtual BEAR layout. The virtual speakers are then encoded to HOA and decoded to binaural.
4 - Moved LFE channel insertion to CGainCalculator instead of AdmRenderer to match the processing workflow laid out in Sec. 7.3.1 of ITU-R BS.2127-1.
- Add point source and extent panners.
- Change how ObjectMetadata handles the ObjectPosition and ExclusionZone.
- Add helper functions related to cartesian metadata.
…igure().

Custom positions are checked against specified ranges. If any loudspeaker is outside of the range then Configure() returns false.
Add missing include directory for dsp folder
This fixes -Wmissing-field-initializers
This fixes -Wunused-function
Fixes "undefined symbol: _ZN11tDesign52006pointsE"
…mples.

- README updates
- Added docs for main Ambisonic processing
- Added docs for ADM processing
…lled the gains will not fade in from zero if Reset() hasn't been called.

This is required for CAdmRenderer since the first gain vector is not known until the audio is added, so we cannot set it and call Reset() as we would where we have more control.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants