-
Notifications
You must be signed in to change notification settings - Fork 94
/
Copy pathbeamformer.h
196 lines (160 loc) · 6.87 KB
/
beamformer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*
* Copyright 2019 Leo McCormack
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* @example beamformer.h
* @brief Generates beamformers/virtual microphones in arbitrary directions
* with several different beam patterns to choose from
*
* ### Files
* beamformer.h (include), beamformer_internal.h, beamformer.c,
* beamformer_internal.c
* ### Include Header
*/
/**
* @file beamformer.h
* @brief Generates beamformers/virtual microphones in arbitrary directions
* with several different beam patterns to choose from
*
* @author Leo McCormack
* @date 17.05.2019
* @license ISC
*/
#ifndef __BEAMFORMER_H_INCLUDED__
#define __BEAMFORMER_H_INCLUDED__
#include "_common.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* ========================================================================== */
/* Main Functions */
/* ========================================================================== */
/**
* Creates an instance of beamformer
*
* @param[in] phBeam (&) address of beamformer handle
*/
void beamformer_create(void** const phBeam);
/**
* Destroys an instance of beamformer
*
* @param[in] phBeam (&) address of beamformer handle
*/
void beamformer_destroy(void** const phBeam);
/**
* Initialises an instance of beamformer with default settings
*
* @param[in] hBeam beamformer handle
* @param[in] samplerate Host samplerate.
*/
void beamformer_init(void* const hBeam,
int samplerate);
/**
* Generates beamformers/virtual microphones in the specified directions
*
* @param[in] hBeam beamformer handle
* @param[in] inputs Input channel buffers; 2-D array: nInputs x nSamples
* @param[in] outputs Output channel buffers; 2-D array: nOutputs x nSamples
* @param[in] nInputs Number of input channels
* @param[in] nOutputs Number of output channels
* @param[in] nSamples Number of samples in 'inputs'/'output' matrices
*/
void beamformer_process(void* const hBeam,
const float *const * inputs,
float* const* outputs,
int nInputs,
int nOutputs,
int nSamples);
/* ========================================================================== */
/* Set Functions */
/* ========================================================================== */
/**
* Sets all intialisation flags to 1; re-initialising all settings/variables
* as beamformer is currently configured, at next available opportunity.
*/
void beamformer_refreshSettings(void* const hBeam);
/**
* Sets the beamforming order (see #SH_ORDERS enum)
*
* If the beamforming order is higher than the
* input signal order, the extra required channels are filled with zeros. If the
* beamforming order is lower than the input signal order, the number input
* signals is truncated accordingly.
*/
void beamformer_setBeamOrder(void* const hBeam, int newValue);
/** Sets a beamformer azimuth direction of a given index, in DEGREES */
void beamformer_setBeamAzi_deg(void* const hBeam, int index, float newAzi_deg);
/** Sets a beamformer elevation direction for a given index, in DEGREES */
void beamformer_setBeamElev_deg(void* const hBeam, int index, float newElev_deg);
/** Sets the number of beamformers to generate */
void beamformer_setNumBeams(void* const hBeam, int new_nBeams);
/**
* Sets the Ambisonic channel ordering convention to decode with, in order to
* match the convention employed by the input signals (see #CH_ORDER enum)
*/
void beamformer_setChOrder(void* const hBeam, int newOrder);
/**
* Sets the Ambisonic normalisation convention to decode with, in order to match
* with the convention employed by the input signals (see #NORM_TYPES enum)
*/
void beamformer_setNormType(void* const hBeam, int newType);
/** Sets the beamforming approach to employ (see #STATIC_BEAM_TYPES enum) */
void beamformer_setBeamType(void* const hBeam, int newID);
/* ========================================================================== */
/* Get Functions */
/* ========================================================================== */
/**
* Returns the processing framesize (i.e., number of samples processed with
* every _process() call )
*/
int beamformer_getFrameSize(void);
/** Returns the beamforming order (see #SH_ORDERS enum) */
int beamformer_getBeamOrder(void* const hBeam);
/** Returns the beamformer azimuth direction of a given index h, in DEGREES */
float beamformer_getBeamAzi_deg(void* const hBeam, int index);
/** Returns the beamformer elevation direction of a given index, in DEGREES */
float beamformer_getBeamElev_deg(void* const hBeam, int index);
/** Returns the number of beamformers being generated */
int beamformer_getNumBeams(void* const hBeam);
/** Returns the maximum number of beamformers permitted */
int beamformer_getMaxNumBeams(void);
/**
* Returns the number of spherical harmonic signals required by the currently
* selected beamforming order: (current_order+1)^2
*/
int beamformer_getNSHrequired(void* const hBeam);
/**
* Returns the Ambisonic channel ordering convention currently being used to
* decode with, which should match the convention employed by the input signals
* (see #CH_ORDER enum)
*/
int beamformer_getChOrder(void* const hBeam);
/**
* Returns the Ambisonic normalisation convention currently being usedto decode
* with, which should match the convention employed by the input signals
* (see #NORM_TYPES enum)
*/
int beamformer_getNormType(void* const hBeam);
/** Returns the beamforming approach employed (see #STATIC_BEAM_TYPES enum) */
int beamformer_getBeamType(void* const hBeam);
/**
* Returns the processing delay in samples (may be used for delay compensation
* features)
*/
int beamformer_getProcessingDelay(void);
#ifdef __cplusplus
} /* extern "C" { */
#endif /* __cplusplus */
#endif /* __BEAMFORMER_H_INCLUDED__ */