// Kaiser window function void kaiser(int n, double beta, double* d) { if (n == 1) { d[0] = 1.0; return; } int m = n - 1; for (int i = 0; i < n; i++) { double k = 2.0 * beta / m * sqrt(double(i * (m - i))); d[i] = besselI0(k) / besselI0(beta); } }
Real besselK0(Real x) { if (x < 0) return std::numeric_limits<Real>::quiet_NaN(); if (0 == x) return std::numeric_limits<Real>::infinity(); if (x <= 2) { // use 10.31.1 [DLMF] // the constants are digamma[i + 1] / (i!)^2 const Real c[7] = {R(-0.5772156649 ), R(0.4227843351 ), R( 0.2306960838 ), R(0.03489215746 ), R( 0.002614787619), R(0.0001184803936), R( 3.612624103e-6)}; const Real t = R(0.25) * x * x; Real sum = c[6]; for(int i = 5; i >= 0; --i) sum = sum * t + c[i]; return -std::log(R(0.5) * x) * besselI0(x) + sum; } else { // use 10.40.2 [DLMF] const Real c[7] = {R( 1.25331414), R(-0.07832358), R( 0.02189568), R(-0.01062446), R( 0.00587872), R(-0.00251540), R( 0.00053208)}; const Real t = 2 / x; Real sum = c[6]; for (int i = 5; i >= 0; --i) sum = sum * t + c[i]; return std::exp(-x) * sum / std::sqrt(x); } }
void a52_imdct_init (uint32_t mm_accel) { #ifdef BUILDFIXED int i, k; double sum; double local_imdct_window[256]; /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */ sum = 0; for (i = 0; i < 256; i++) { sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256)); local_imdct_window[i] = sum; } sum++; for (i = 0; i < 256; i++) a52_imdct_window[i] = SAMPLE (sqrt (local_imdct_window[i] / sum)); for (i = 0; i < 3; i++) roots16[i] = SAMPLE (cos ((M_PI / 8) * (i + 1))); for (i = 0; i < 7; i++) roots32[i] = SAMPLE (cos ((M_PI / 16) * (i + 1))); for (i = 0; i < 15; i++) roots64[i] = SAMPLE (cos ((M_PI / 32) * (i + 1))); for (i = 0; i < 31; i++) roots128[i] = SAMPLE (cos ((M_PI / 64) * (i + 1))); for (i = 0; i < 64; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = SAMPLE (cos ((M_PI / 256) * (k - 0.25))); pre1[i].imag = SAMPLE (sin ((M_PI / 256) * (k - 0.25))); } for (i = 64; i < 128; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = SAMPLE (-cos ((M_PI / 256) * (k - 0.25))); pre1[i].imag = SAMPLE (-sin ((M_PI / 256) * (k - 0.25))); } for (i = 0; i < 64; i++) { post1[i].real = SAMPLE (cos ((M_PI / 256) * (i + 0.5))); post1[i].imag = SAMPLE (sin ((M_PI / 256) * (i + 0.5))); } for (i = 0; i < 64; i++) { k = fftorder[i] / 4; pre2[i].real = SAMPLE (cos ((M_PI / 128) * (k - 0.25))); pre2[i].imag = SAMPLE (sin ((M_PI / 128) * (k - 0.25))); } for (i = 0; i < 32; i++) { post2[i].real = SAMPLE (cos ((M_PI / 128) * (i + 0.5))); post2[i].imag = SAMPLE (sin ((M_PI / 128) * (i + 0.5))); } /* #ifdef LIBA52_DJBFFT if (mm_accel & MM_ACCEL_DJBFFT) { ifft128 = (void (*) (complex_t *)) fftc4_un128; ifft64 = (void (*) (complex_t *)) fftc4_un64; } else #endif { ifft128 = ifft128_c; ifft64 = ifft64_c; } */ #ifdef CREATE_CONST { FILE* f = fopen("imdct_const.h","w+"); dumpsample(f,roots16,"roots16",sizeof(roots16)/sizeof(sample_t)); dumpsample(f,roots32,"roots32",sizeof(roots32)/sizeof(sample_t)); dumpsample(f,roots64,"roots64",sizeof(roots64)/sizeof(sample_t)); dumpsample(f,roots128,"roots128",sizeof(roots128)/sizeof(sample_t)); dumpsample(f,a52_imdct_window,"a52_imdct_window",sizeof(a52_imdct_window)/sizeof(sample_t)); dumpcomplex(f,pre1,"pre1",sizeof(pre1)/sizeof(complex_t)); dumpcomplex(f,pre2,"pre2",sizeof(pre2)/sizeof(complex_t)); dumpcomplex(f,post1,"post1",sizeof(post1)/sizeof(complex_t)); dumpcomplex(f,post2,"post2",sizeof(post2)/sizeof(complex_t)); fclose(f); } #endif #endif }
void a52_imdct_init (uint32_t mm_accel) { int i, k; double sum; /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */ sum = 0; for (i = 0; i < 256; i++) { sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256)); a52_imdct_window[i] = sum; } sum++; for (i = 0; i < 256; i++) a52_imdct_window[i] = sqrt (a52_imdct_window[i] / sum); for (i = 0; i < 3; i++) roots16[i] = cos ((M_PI / 8) * (i + 1)); for (i = 0; i < 7; i++) roots32[i] = cos ((M_PI / 16) * (i + 1)); for (i = 0; i < 15; i++) roots64[i] = cos ((M_PI / 32) * (i + 1)); for (i = 0; i < 31; i++) roots128[i] = cos ((M_PI / 64) * (i + 1)); for (i = 0; i < 64; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = cos ((M_PI / 256) * (k - 0.25)); pre1[i].imag = sin ((M_PI / 256) * (k - 0.25)); } for (i = 64; i < 128; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = -cos ((M_PI / 256) * (k - 0.25)); pre1[i].imag = -sin ((M_PI / 256) * (k - 0.25)); } for (i = 0; i < 64; i++) { post1[i].real = cos ((M_PI / 256) * (i + 0.5)); post1[i].imag = sin ((M_PI / 256) * (i + 0.5)); } for (i = 0; i < 64; i++) { k = fftorder[i] / 4; pre2[i].real = cos ((M_PI / 128) * (k - 0.25)); pre2[i].imag = sin ((M_PI / 128) * (k - 0.25)); } for (i = 0; i < 32; i++) { post2[i].real = cos ((M_PI / 128) * (i + 0.5)); post2[i].imag = sin ((M_PI / 128) * (i + 0.5)); } #ifdef LIBA52_DJBFFT if (mm_accel & MM_ACCEL_DJBFFT) { fprintf (stderr, "Using djbfft for IMDCT transform\n"); ifft128 = (void (*) (complex_t *)) fftc4_un128; ifft64 = (void (*) (complex_t *)) fftc4_un64; } else #endif { fprintf (stderr, "No accelerated IMDCT transform found\n"); ifft128 = ifft128_c; ifft64 = ifft64_c; } }
void a52_imdct_init (uint32_t mm_accel) { int i, k; double sum; sample_t local_imdct_window[256]; /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */ sum = 0; for (i = 0; i < 256; i++) { sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256)); local_imdct_window[i] = sum; } sum++; for (i = 0; i < 256; i++) a52_imdct_window[i] = (sample_t) (sqrt (local_imdct_window[i] / sum)); for (i = 0; i < 3; i++) roots16[i] = cos ((M_PI / 8) * (i + 1)); for (i = 0; i < 7; i++) roots32[i] = cos ((M_PI / 16) * (i + 1)); for (i = 0; i < 15; i++) roots64[i] = cos ((M_PI / 32) * (i + 1)); for (i = 0; i < 31; i++) roots128[i] = cos ((M_PI / 64) * (i + 1)); for (i = 0; i < 64; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = cos ((M_PI / 256) * (k - 0.25)); pre1[i].imag = sin ((M_PI / 256) * (k - 0.25)); } for (i = 64; i < 128; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = -cos ((M_PI / 256) * (k - 0.25)); pre1[i].imag = -sin ((M_PI / 256) * (k - 0.25)); } for (i = 0; i < 64; i++) { post1[i].real = cos ((M_PI / 256) * (i + 0.5)); post1[i].imag = sin ((M_PI / 256) * (i + 0.5)); } for (i = 0; i < 64; i++) { k = fftorder[i] / 4; pre2[i].real = cos ((M_PI / 128) * (k - 0.25)); pre2[i].imag = sin ((M_PI / 128) * (k - 0.25)); } for (i = 0; i < 32; i++) { post2[i].real = cos ((M_PI / 128) * (i + 0.5)); post2[i].imag = sin ((M_PI / 128) * (i + 0.5)); } { ifft128 = ifft128_c; ifft64 = ifft64_c; } }
void a52_imdct_init (uint32_t mm_accel) { int i, k; double sum; double local_imdct_window[256]; /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */ sum = 0; for (i = 0; i < 256; i++) { sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256)); local_imdct_window[i] = sum; } sum++; for (i = 0; i < 256; i++) a52_imdct_window[i] = SAMPLE (sqrt (local_imdct_window[i] / sum)); for (i = 0; i < 3; i++) roots16[i] = SAMPLE (cos ((M_PI / 8) * (i + 1))); for (i = 0; i < 7; i++) roots32[i] = SAMPLE (cos ((M_PI / 16) * (i + 1))); for (i = 0; i < 15; i++) roots64[i] = SAMPLE (cos ((M_PI / 32) * (i + 1))); for (i = 0; i < 31; i++) roots128[i] = SAMPLE (cos ((M_PI / 64) * (i + 1))); for (i = 0; i < 64; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = SAMPLE (cos ((M_PI / 256) * (k - 0.25))); pre1[i].imag = SAMPLE (sin ((M_PI / 256) * (k - 0.25))); } for (i = 64; i < 128; i++) { k = fftorder[i] / 2 + 64; pre1[i].real = SAMPLE (-cos ((M_PI / 256) * (k - 0.25))); pre1[i].imag = SAMPLE (-sin ((M_PI / 256) * (k - 0.25))); } for (i = 0; i < 64; i++) { post1[i].real = SAMPLE (cos ((M_PI / 256) * (i + 0.5))); post1[i].imag = SAMPLE (sin ((M_PI / 256) * (i + 0.5))); } for (i = 0; i < 64; i++) { k = fftorder[i] / 4; pre2[i].real = SAMPLE (cos ((M_PI / 128) * (k - 0.25))); pre2[i].imag = SAMPLE (sin ((M_PI / 128) * (k - 0.25))); } for (i = 0; i < 32; i++) { post2[i].real = SAMPLE (cos ((M_PI / 128) * (i + 0.5))); post2[i].imag = SAMPLE (sin ((M_PI / 128) * (i + 0.5))); } #ifdef LIBA52_DJBFFT if (mm_accel & MM_ACCEL_DJBFFT) { ifft128 = (void (*) (complex_t *)) fftc4_un128; ifft64 = (void (*) (complex_t *)) fftc4_un64; } else #endif { ifft128 = ifft128_c; ifft64 = ifft64_c; } }