static void *resampler_sinc_new(const struct resampler_config *config, double bandwidth_mod, resampler_simd_mask_t mask) { size_t phase_elems, elems; double cutoff; rarch_sinc_resampler_t *re = (rarch_sinc_resampler_t*) calloc(1, sizeof(*re)); if (!re) return NULL; (void)config; re->taps = TAPS; cutoff = CUTOFF; /* Downsampling, must lower cutoff, and extend number of * taps accordingly to keep same stopband attenuation. */ if (bandwidth_mod < 1.0) { cutoff *= bandwidth_mod; re->taps = (unsigned)ceil(re->taps / bandwidth_mod); } /* Be SIMD-friendly. */ #if (defined(__AVX__) && ENABLE_AVX) || defined(__ARM_NEON__) re->taps = (re->taps + 7) & ~7; #else re->taps = (re->taps + 3) & ~3; #endif phase_elems = (1 << PHASE_BITS) * re->taps; #if SINC_COEFF_LERP phase_elems *= 2; #endif elems = phase_elems + 4 * re->taps; re->main_buffer = (float*) aligned_alloc__(128, sizeof(float) * elems); if (!re->main_buffer) goto error; re->phase_table = re->main_buffer; re->buffer_l = re->main_buffer + phase_elems; re->buffer_r = re->buffer_l + 2 * re->taps; init_sinc_table(re, cutoff, re->phase_table, 1 << PHASE_BITS, re->taps, SINC_COEFF_LERP); #if defined(__ARM_NEON__) process_sinc_func = mask & RESAMPLER_SIMD_NEON ? process_sinc_neon : process_sinc_C; #endif return re; error: resampler_sinc_free(re); return NULL; }
static void *resampler_sinc_new(double bandwidth_mod) { rarch_sinc_resampler_t *re = (rarch_sinc_resampler_t*)calloc(1, sizeof(*re)); if (!re) return NULL; memset(re, 0, sizeof(*re)); re->taps = TAPS; double cutoff = CUTOFF; // Downsampling, must lower cutoff, and extend number of taps accordingly to keep same stopband attenuation. if (bandwidth_mod < 1.0) { cutoff *= bandwidth_mod; re->taps = (unsigned)ceil(re->taps / bandwidth_mod); } // Be SIMD-friendly. #if (defined(__AVX__) && ENABLE_AVX) || defined(HAVE_NEON) re->taps = (re->taps + 7) & ~7; #else re->taps = (re->taps + 3) & ~3; #endif size_t phase_elems = (1 << PHASE_BITS) * re->taps; #if SINC_COEFF_LERP phase_elems *= 2; #endif size_t elems = phase_elems + 4 * re->taps; re->main_buffer = (float*)aligned_alloc__(128, sizeof(float) * elems); if (!re->main_buffer) goto error; re->phase_table = re->main_buffer; re->buffer_l = re->main_buffer + phase_elems; re->buffer_r = re->buffer_l + 2 * re->taps; init_sinc_table(re, cutoff, re->phase_table, 1 << PHASE_BITS, re->taps, SINC_COEFF_LERP); #if defined(__AVX__) && ENABLE_AVX RARCH_LOG("Sinc resampler [AVX]\n"); #elif defined(__SSE__) RARCH_LOG("Sinc resampler [SSE]\n"); #elif defined(HAVE_NEON) process_sinc_func = process_sinc_neon; RARCH_LOG("Sinc resampler [%s]\n", "NEON"); #else RARCH_LOG("Sinc resampler [C]\n"); #endif RARCH_LOG("SINC params (%u phase bits, %u taps).\n", PHASE_BITS, re->taps); return re; error: resampler_sinc_free(re); return NULL; }
rarch_resampler_t *resampler_new(void) { rarch_resampler_t *re = (rarch_resampler_t*)aligned_alloc__(16, sizeof(*re)); if (!re) return NULL; memset(re, 0, sizeof(*re)); init_sinc_table(re); #ifdef __SSE__ RARCH_LOG("Sinc resampler [SSE]\n"); #else RARCH_LOG("Sinc resampler [C]\n"); #endif return re; }