28 #include "libavutil/mem.h"
29 #include "libavcodec/avfft.h"
36 static const float PI = 3.141592654;
41 T
sqr(T x) {
return x*x; }
48 explicit Impl(
unsigned blocksize=8192):
m_n(blocksize),
m_halfN(blocksize/2) {
50 m_dftL = (FFTComplex*)av_malloc(
sizeof(FFTComplex) *
m_n * 2);
51 m_dftR = (FFTComplex*)av_malloc(
sizeof(FFTComplex) *
m_n * 2);
52 m_src = (FFTComplex*)av_malloc(
sizeof(FFTComplex) *
m_n * 2);
68 for (
unsigned c=0;c<6;c++) {
75 for (
unsigned k=0;k<
m_n;k++)
118 void decode(
float center_width,
float dimension,
float adaption_rate) {
125 add_output(in_first,in_second,center_width,dimension,adaption_rate,
true);
131 for (
unsigned k=0;k<
m_n;k++) {
142 unsigned int cutoff = (30*
m_n)/srate;
143 for (
unsigned f=0;f<=
m_halfN;f++) {
164 m_a = (v-o)*n;
m_b = (o-u)*n;
m_c = (-o-v)*n;
m_d = (o+u)*n;
165 m_e = (o+v)*n;
m_f = (o+u)*n;
m_g = (o-v)*n;
m_h = (o-u)*n;
170 const std::array<std::array<float,2>,4> modes {{ {0,0}, {0,
PI}, {
PI,0}, {-
PI/2,
PI/2} }};
186 static inline cfloat polar(
float a,
float p) {
return {
static_cast<float>(a*std::cos(
p)),
static_cast<float>(a*std::sin(
p))}; }
187 static inline float amplitude(FFTComplex z) {
return std::hypot(z.re, z.im); }
188 static inline float phase(FFTComplex z) {
return std::atan2(z.im, z.re); }
191 static inline float clamp_unit_mag(
float x) {
return std::clamp(x, -1.0F, 1.0F); }
197 block_decode(input1,input2,out,center_width,dimension,adaption_rate);
210 for (
unsigned k = 0; k <
m_halfN; k++)
212 m_dftL[k] = (FFTComplex){ .re = input1[0][k] *
m_wnd[k], .im = (FFTSample)0 };
213 m_dftR[k] = (FFTComplex){ .re = input1[1][k] *
m_wnd[k], .im = (FFTSample)0 };
228 for (
unsigned f=0;f<
m_halfN;f++) {
239 float phaseDiff = phaseL - phaseR;
240 if (phaseDiff < -
PI) phaseDiff += 2*
PI;
241 if (phaseDiff >
PI) phaseDiff -= 2*
PI;
242 phaseDiff = abs(phaseDiff);
258 float left = (1-
m_xFs[f])/2;
259 float right = (1+
m_xFs[f])/2;
260 float front = (1+
m_yFs[f])/2;
262 std::array<float, 5> volume
264 front * (left * center_width + std::max(0.0F, -
m_xFs[f]) * (1.0F - center_width) ),
266 front * (right * center_width + std::max(0.0F,
m_xFs[f]) * (1.0F - center_width) ),
272 for (
unsigned c=0;c<5;c++)
273 m_filter[c][f] = (1-adaption_rate)*
m_filter[c][f] + adaption_rate*volume[c];
280 float phaseDiff = phaseL - phaseR;
281 if (phaseDiff < -
PI) phaseDiff += 2*
PI;
282 if (phaseDiff >
PI) phaseDiff -= 2*
PI;
283 phaseDiff = abs(phaseDiff);
289 m_yFs[f] = 1 - (phaseDiff/
PI)*2;
295 m_yFs[f] = (1-frontness) *
m_yFs[f] + frontness * 1;
306 float left = (1-
m_xFs[f])/2;
307 float right = (1+
m_xFs[f])/2;
308 float front = (1+
m_yFs[f])/2;
310 std::array<float, 5> volume
312 front * (left * center_width + std::max(0.0F, -
m_xFs[f]) * (1.0F-center_width)),
314 front * (right * center_width + std::max(0.0F,
m_xFs[f]) * (1.0F-center_width)),
320 for (
unsigned c=0;c<5;c++)
321 m_filter[c][f] = (1-adaption_rate)*
m_filter[c][f] + adaption_rate*volume[c];
344 static inline double get_yfs(
double ampDiff,
double phaseDiff) {
345 double x = 1-(((1-
sqr(ampDiff))*phaseDiff)/
M_PI*2);
347 double tanX = tan(x);
348 return 0.16468622925824683 + 0.5009268347818189*x - 0.06462757726992101*x*x
349 + 0.09170680403453149*x*x*x + 0.2617754892323973*tanX - 0.04180413533856156*
sqr(tanX);
351 return 0.16468622925824683 + 0.5009268347818189*x - 0.06462757726992101*x*x
352 + 0.09170680403453149*x*x*x + 0.2617754892323973*tan(x) - 0.04180413533856156*
sqr(tan(x));
357 static inline double get_xfs(
double ampDiff,
double yfs) {
361 double tanX = tan(x);
362 double tanY = tan(y);
363 double asinX = asin(x);
364 double sinX = sin(x);
365 double sinY = sin(y);
369 return 2.464833559224702*x - 423.52131153259404*x*y +
370 67.8557858606918*
x3*y + 788.2429425544392*x*y2 -
371 79.97650354902909*
x3*y2 - 513.8966153850349*x*y3 +
372 35.68117670186306*
x3*y3 + 13867.406173420834*y*asinX -
373 2075.8237075786396*y2*asinX - 908.2722068360281*y3*asinX -
374 12934.654772878019*asinX*sinY - 13216.736529661162*y*tanX +
375 1288.6463247741938*y2*tanX + 1384.372969378453*y3*tanX +
376 12699.231471126128*sinY*tanX + 95.37131275594336*sinX*tanY -
377 91.21223198407546*tanX*tanY;
379 return 2.464833559224702*x - 423.52131153259404*x*y +
380 67.8557858606918*x*x*x*y + 788.2429425544392*x*y*y -
381 79.97650354902909*x*x*x*y*y - 513.8966153850349*x*y*y*y +
382 35.68117670186306*x*x*x*y*y*y + 13867.406173420834*y*asin(x) -
383 2075.8237075786396*y*y*asin(x) - 908.2722068360281*y*y*y*asin(x) -
384 12934.654772878019*asin(x)*sin(y) - 13216.736529661162*y*tan(x) +
385 1288.6463247741938*y*y*tan(x) + 1384.372969378453*y*y*y*tan(x) +
386 12699.231471126128*sin(y)*tan(x) + 95.37131275594336*sin(x)*tan(y) -
387 91.21223198407546*tan(x)*tan(y);
402 for (
unsigned f = 0; f <=
m_halfN; f++)
404 m_src[f].re = signal[f].real() * flt[f];
405 m_src[f].im = signal[f].imag() * flt[f];
408 for (
unsigned f = 1; f <
m_halfN; f++)
417 for (
unsigned int k = 0; k <
m_halfN; k++)