59 { -59.5674172539630f, -69.7763953095265f},
60 { -107.629493132161f, 10.0801907586439f},
61 { 59.5651193014662f, 69.7750019669784f},
62 { -72.3715136529922f, -10.0909592824967f},
63 { 120.418832045969f, -69.7630732527928f},
64 { 72.3705387467529f, 10.0908849630425f},
65 { 10.5699823270029f, 17.3489915451677f},
66 { -169.426851150349f, 17.3476277272366f},
67 { -30.7728814706980f, 68.2546206344998f},
68 { 101.529181734204f, 18.5653877408229f},
69 { 149.250234431564f, 68.2619792676765f},
70 { 18.9183978612362f, -10.9197242075287f},
71 { 78.4729799557400f, -18.5558892226653f},
72 { -18.9161109968480f, 10.9195275229078f},
73 { -78.4723066816396f, 18.5565169424192f},
74 { -161.085243560336f, -10.9220975953767f},
75 { -101.530063994217f, -18.5648176173994f},
76 { 161.085855454581f, 10.9237834974412f},
77 { 30.7790837424989f, -68.2562996173874f},
78 { -149.255648697558f, -68.2594892022576f},
79 { 56.4638592172755f, 41.2645742763346f},
80 { 46.4626904606488f, 24.5386896277818f},
81 { -123.528839291756f, 41.2565889648213f},
82 { 32.1932295461248f, 38.8027347956192f},
83 { 133.534545076742f, -24.5310453346374f},
84 { -32.1935458377634f, -38.8041545028931f},
85 { -133.533477606995f, 24.5319420428588f},
86 { -147.797881221742f, 38.7980990097138f},
87 { -46.4626630742447f, -24.5400749997299f},
88 { 147.799544204027f, -38.7965984357137f},
89 { -56.4649576930965f, -41.2658215291547f},
90 { 123.530547454259f, -41.2555316199835f},
91 { 84.7385596473317f, 27.3132538556364f},
92 { 27.4072860474693f, 4.67593317316088f},
93 { -95.2612516264878f, 27.3036967398252f},
94 { 10.0607591758466f, 62.2287426217158f},
95 { 152.592710471291f, -4.67007594116539f},
96 { -10.0604693351594f, -62.2317767049329f},
97 { -152.592615409799f, 4.67188744845125f},
98 { -169.918387889403f, 62.2272712110016f},
99 { -27.4047652820400f, -4.67684895484045f},
100 { 169.918493477140f, -62.2246416140826f},
101 { -84.7390238025025f, -27.3120311727342f},
102 { 95.2622793653641f, -27.3027426350066f},
103 { 136.272846725200f, -0.726139068263599f},
104 { -1.05456977390436f, -46.2698051615206f},
105 { -43.7263256019408f, -0.737666959763443f},
106 { -91.0084089447853f, 43.7170295842697f},
107 { -178.936314291048f, 46.2682278552731f},
108 { 91.0100541861312f, -43.7163112498585f},
109 { 178.938490558618f, -46.2666218304286f},
110 { 88.9860902890987f, 43.7285680951606f},
111 { 1.05095788619312f, 46.2682407577363f},
112 { -88.9851906686018f, -43.7278600822776f},
113 { -136.273314433943f, 0.726484363994244f},
114 { 43.7273191822901f, 0.733967099281741f},
115 { 55.2321077221357f, 10.8187456245361f},
116 { 13.0867814081219f, 34.0654299770448f},
117 { -124.767898552651f, 10.8099467408727f},
118 { 71.4751302534919f, 53.7984109774923f},
119 { 166.905549455530f, -34.0625862919868f},
120 { -71.4765158530160f, -53.8002805142714f},
121 { -166.904587570338f, 34.0633858486074f},
122 { -108.515564585463f, 53.7864186881779f},
123 { -13.0869589355977f, -34.0644403811701f},
124 { 108.517274377512f, -53.7853093207457f},
125 { -55.2337689585088f, -10.8200079671294f},
126 { 124.767519417537f, -10.8096092876561f},
127 { -105.493359369733f, -68.1345228940484f},
128 { -111.151973933085f, -5.71277564515985f},
129 { 74.5244447329726f, -68.1205741555505f},
130 { -173.885132403874f, -21.0401043953034f},
131 { -68.8521018079939f, 5.70313885775370f},
132 { 173.885050918764f, 21.0419786777516f},
133 { 68.8513569996117f, -5.70297394874866f},
134 { 6.12041448982713f, -21.0387333986971f},
135 { 111.151515131908f, 5.71357243375474f},
136 { -6.11913621739966f, 21.0397756114589f},
137 { 105.487055344890f, 68.1331981897040f},
138 { -74.5188619841755f, 68.1214716326340f},
139 { 35.2822222163987f, -15.1801841162885f},
140 { -25.1732516880600f, 51.9826514887145f},
141 { -144.722913967824f, -15.1859965048827f},
142 { 108.386507250934f, 33.8824333892584f},
143 { -154.839566662519f, -51.9856067440744f},
144 { -108.385758587361f, -33.8826426573830f},
145 { 154.840828582605f, 51.9884126722963f},
146 { -71.6110721306039f, 33.8714084774643f},
147 { 25.1699762263473f, -51.9843011897216f},
148 { 71.6126173250777f, -33.8705490198003f},
149 { -35.2810594358470f, 15.1763090469469f},
150 { 144.722474074749f, 15.1863112389402f},
151 { -125.277803641269f, -28.5561977838671f},
152 { -146.317489805034f, -30.4888082061806f},
153 { 54.7220842889970f, -28.5463137051834f},
154 { -133.292600372594f, -45.8199818171681f},
155 { -33.6854220654234f, 30.4794807422719f},
156 { 133.295169860873f, 45.8200619710773f},
157 { 33.6830420572493f, -30.4828689919959f},
158 { 46.7098267598019f, -45.8106991831118f},
159 { 146.318736830907f, 30.4889588527258f},
160 { -46.7107531920589f, 45.8077510168776f},
161 { 125.278543193551f, 28.5567151663926f},
162 { -54.7226679373581f, 28.5424675755949f},
163 { -144.402199049652f, 54.7141577397485f},
164 { 112.382216591782f, -28.0100385212576f},
165 { 35.5834085793474f, 54.7193853715013f},
166 { -29.9155874729000f, -19.6471282266303f},
167 { 67.6163420587218f, 28.0211878299760f},
168 { 29.9151078604395f, 19.6461577548916f},
169 { -67.6164804090156f, -28.0221553885221f},
170 { 150.081679085309f, -19.6396879622134f},
171 { -112.381365317985f, 28.0105570315277f},
172 { -150.081127534239f, 19.6412999777121f},
173 { 144.402936805264f, -54.7127597303097f},
174 { -35.5837994140428f, -54.7203576209200f},
175 { 68.5348504928164f, -52.8527273534571f},
176 { -54.8218918027732f, 12.7570858971645f},
177 { -111.464947340552f, -52.8652964226689f},
178 { 164.510735700738f, 34.1892226850382f},
179 { -125.181243085238f, -12.7710900404128f},
180 { -164.510172672569f, -34.1865270720665f},
181 { 125.180742749445f, 12.7714932994183f},
182 { -15.4967238792034f, 34.1855682977571f}};
234 int i, j, band, n, order, nSH;
235 double alpha, beta, g_lim, regPar;
238 float* Y_mic, *pinv_Y_mic;
239 float_complex* pinv_Y_mic_cmplx, *diag_bN_inv_R;
240 const float_complex calpha = cmplxf(1.0f, 0.0f);
const float_complex cbeta = cmplxf(0.0f, 0.0f);
244 nSH = (order+1)*(order+1);
245 arraySpecs->
R =
SAF_MIN(arraySpecs->
R, arraySpecs->
r);
250 for(i=0; i<arraySpecs->
Q; i++){
256 Y_mic =
malloc1d(nSH*(arraySpecs->
Q)*
sizeof(
float));
257 getRSH(order, (
float*)sensorCoords_deg_local, arraySpecs->
Q, Y_mic);
258 pinv_Y_mic =
malloc1d( arraySpecs->
Q * nSH *
sizeof(
float));
260 pinv_Y_mic_cmplx =
malloc1d((arraySpecs->
Q) * nSH *
sizeof(float_complex));
261 for(i=0; i<(arraySpecs->
Q)*nSH; i++)
262 pinv_Y_mic_cmplx[i] = cmplxf(pinv_Y_mic[i], 0.0f);
295 if(arraySpecs->
R == arraySpecs->
r )
314 for(n=0; n < order+1; n++)
315 pData->
bN[band*(order+1)+n] = ccdiv(pData->
bN[band*(order+1)+n], cmplx(4.0*
SAF_PId, 0.0));
320 for(n=0; n < order+1; n++)
321 pData->
bN_modal[band][n] = ccdiv(cmplx(1.0,0.0), (pData->
bN[band*(order+1)+n]));
328 g_lim = sqrt(arraySpecs->
Q)*pow(10.0,(regPar/20.0));
330 for(n=0; n < order+1; n++)
331 pData->
bN_inv[band][n] = crmul(pData->
bN_modal[band][n], (2.0*g_lim*cabs(pData->
bN[band*(order+1)+n]) /
SAF_PId)
332 * atan(
SAF_PId / (2.0*g_lim*cabs(pData->
bN[band*(order+1)+n]))) );
337 alpha = sqrt(arraySpecs->
Q)*pow(10.0,(regPar/20.0));
339 for(n=0; n < order+1; n++){
340 beta = sqrt((1.0-sqrt(1.0-1.0/ pow(alpha,2.0)))/(1.0+sqrt(1.0-1.0/pow(alpha,2.0))));
341 pData->
bN_inv[band][n] = ccdiv(conj(pData->
bN[band*(order+1)+n]), cmplx((pow(cabs(pData->
bN[band*(order+1)+n]), 2.0) + pow(beta, 2.0)),0.0));
349 diag_bN_inv_R =
calloc1d(nSH*nSH,
sizeof(float_complex));
352 diag_bN_inv_R[i*nSH+i] = cmplxf((
float)creal(pData->
bN_inv_R[band][i]), (
float)cimag(pData->
bN_inv_R[band][i]));
353 cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans, nSH, (arraySpecs->
Q), nSH, &calpha,
355 pinv_Y_mic_cmplx, nSH, &cbeta,
387 for (n=0; n<order+1; n++){
389 H[band][n] = 1.0/(1.0+ pow((
double)(pData->
freqVector[band]/f_lim[n]),2.0));
391 H[band][n] = pow((
double)(pData->
freqVector[band]/f_lim[n-1]), (
double)order+1.0 ) /
392 (1.0 + pow((
double)(pData->
freqVector[band]/f_lim[n-1]), (
double)order+1.0));
394 H[band][n] = pow((
double)(pData->
freqVector[band]/f_lim[n-1]), (
double)n+1.0 ) /
395 (1.0 + pow((
double)(pData->
freqVector[band]/f_lim[n-1]), (
double)n+1.0)) *
396 (1.0 / (1.0 + pow((
double)(pData->
freqVector[band]/f_lim[n]), (
double)n+2.0)));
400 for (n=0; n<order+1; n++)
401 H[band][n] = H[band][n]/normH;
431 if(arraySpecs->
R == arraySpecs->
r )
451 for(n=0; n < order+1; n++)
452 pData->
bN_modal[band][n] = ccdiv(cmplx(4.0*
SAF_PId, 0.0), pData->
bN[band*(order+1)+n]);
456 for (n=0; n<order+1; n++)
457 Hs[band][n] = ccmul(cexp(cmplx(0.0, kr[band])), ccdiv(cmplx(4.0*
SAF_PId, 0.0), pData->
bN[band*(order+1)+n]));
465 for (n=0; n<order+1; n++){
467 wn =
calloc1d(nSH_n*nSH_n,
sizeof(
float));
469 for (i=0; i<n+1; i++)
470 wn[(i*i)*nSH_n+(i*i)] = 1.0f;
474 for (i=0; i<n+1; i++)
475 scale += (
double)(2*i+1)*pow((
double)wn[(i*i)*nSH_n + (i*i)], 2.0);
476 for (i=0; i<n+1; i++)
477 W[i][n] = (
double)wn[(i*i)*nSH_n + (i*i)]/ sqrt(scale);
481 for (n=0; n<order+1; n++)
482 for (i=0; i<order+1; i++)
489 for (n=0; n<order+1; n++){
491 for (i=n, j=0; i<order+1; i++, j++)
492 H_np[band][j] = H[band][i];
493 for (i=n, j=0; i<order+1; i++, j++)
495 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,
HYBRID_BANDS, 1, order+1-n, 1.0,
500 pData->
bN_inv[band][n] = crmul(Hs[band][n], HW[band]);
505 diag_bN_inv_R =
calloc1d(nSH*nSH,
sizeof(float_complex));
508 diag_bN_inv_R[i*nSH+i] = cmplxf((
float)creal(pData->
bN_inv_R[band][i]), (
float)cimag(pData->
bN_inv_R[band][i]));
509 cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans, nSH, (arraySpecs->
Q), nSH, &calpha,
511 pinv_Y_mic_cmplx, nSH, &cbeta,
517 pData->
order = order;
524 free(pinv_Y_mic_cmplx);