1/*
2Copyright 2018 Google Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS-IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef RESONANCE_AUDIO_AMBISONICS_AMBISONIC_LOOKUP_TABLE_H_
18#define RESONANCE_AUDIO_AMBISONICS_AMBISONIC_LOOKUP_TABLE_H_
19
20#include <vector>
21
22#include "base/spherical_angle.h"
23
24namespace vraudio {
25
26// Represents a lookup table for encoding of Ambisonic periphonic sound fields.
27// Supports arbitrary Ambisonic order and uses AmbiX convention (ACN channel
28// sequencing, SN3D normalization).
29class AmbisonicLookupTable {
30 public:
31 // Creates Ambisonic (AmbiX) encoder lookup table given the
32 // |max_ambisonic_order| used by the client. AmbiX convention uses ACN channel
33 // sequencing and SN3D normalization.
34 explicit AmbisonicLookupTable(int max_ambisonic_order);
35
36 // Gets spherical harmonic encoding coefficients for a given order and
37 // writes them to |encoding_coeffs|.
38 //
39 // @param ambisonic_order Ambisonic order of the encoded sound source.
40 // @param source_direction Direction of a sound source in spherical
41 // coordinates.
42 // @param source_spread_deg Encoded sound source angular spread in degrees.
43 // @param encoding_coeffs Pointer to a vector of Ambisonic encoding
44 // coefficients.
45 void GetEncodingCoeffs(int ambisonic_order,
46 const SphericalAngle& source_direction,
47 float source_spread_deg,
48 std::vector<float>* encoding_coeffs) const;
49
50 private:
51 // Computes a lookup table of encoding coefficients for one quadrant of the
52 // sphere.
53 void ComputeEncoderTable();
54
55 // Computes a table of spherical harmonics symmetry information for all
56 // cartesian axes. Value of 1 indicates that the current spherical harmonic is
57 // symmetric with respect to the current axis. Value of -1 indicates that the
58 // current spherical harmonic is anti-symmetric with respect to the current
59 // axis.
60 void ComputeSymmetriesTable();
61
62 // Returns the unnormalized spherical harmonic coefficient:
63 // Y_degree^order(azimuth, elevation).
64 //
65 // @param alp_value Associated Legendre polynomial for the given degree and
66 // order evaluated at sin elevation angle: P_degree^order(sin(elevation)).
67 // @param order Order of the Associated Legendre polynomial.
68 // @param azimuth_rad Azimuth angle in radians.
69 // @return Unnormalized spherical harmonic coefficient.
70 float UnnormalizedSphericalHarmonic(float alp_value, int order,
71 float azimuth_rad);
72
73 // Ambisonic order.
74 const int max_ambisonic_order_;
75
76 // Maximum number of coefficients to be stored in the lookup table equal to
77 // the number of Ambisonic channels for |max_ambisonic_order_| - 1. This is
78 // because we do not need to store the coefficient for the first spherical
79 // harmonic coefficient as it is always 1.
80 const size_t max_num_coeffs_in_table_;
81
82 // Lookup table for storing Ambisonic encoding coefficients for one quadrant
83 // of the sphere.
84 std::vector<float> encoder_table_;
85
86 // Lookup table for storing information about spherical harmonic symmetries.
87 std::vector<float> symmetries_table_;
88};
89
90} // namespace vraudio
91
92#endif // RESONANCE_AUDIO_AMBISONICS_AMBISONIC_LOOKUP_TABLE_H_
93

source code of qtmultimedia/src/3rdparty/resonance-audio/resonance_audio/ambisonics/ambisonic_lookup_table.h