ref: a8831f4d0fc4666d80e73b886ab2e60d176bb4a2
dir: /LEAF/Src/leaf-oversampler.c/
// // leaf-oversampler.c // LEAF // // Created by Matthew Wang and Joshua Becker on 2/28/19. // Copyright © 2019 Princeton University. All rights reserved. // #if _WIN32 || _WIN64 #include "..\Inc\leaf-oversampler.h" #include "..\Inc\leaf-tables.h" #else #include "../Inc/leaf-oversampler.h" #include "../Inc/leaf-tables.h" #endif // Oversampler void tOversampler_init(tOversampler* const os, int ratio, oBool extraQuality) { uint8_t offset = 0; if (extraQuality) offset = 6; if (ratio == 2 || ratio == 4 || ratio == 8 || ratio == 16 || ratio == 32 || ratio == 64) { os->ratio = ratio; tFIR_init(&os->firUp, firCoeffs[(int)(os->ratio*0.5f)-1+offset]); tFIR_init(&os->firDown, firCoeffs[(int)(os->ratio*0.5f)-1+offset]); } } void tOversampler_upsample(tOversampler* const os, float input, float* output) { output[0] = input; for (int i = 0; i < os->ratio; ++i) { if (i > 0) output[i] = 0; output[i] = tFIR_tick(&os->firUp, output[i]); } } float tOversampler_downsample(tOversampler* const os, float* input) { float output = tFIR_tick(&os->firDown, input[0]); for (int i = 1; i < os->ratio; ++i) { tFIR_tick(&os->firDown, input[i]); } return output; } float tOversampler_tick(tOversampler* const os, float input, float (*effectTick)(float)) { float buf[os->ratio]; tOversampler_upsample(os, input, buf); for (int i = 0; i < os->ratio; ++i) { buf[i] = effectTick(buf[i]); } return tOversampler_downsample(os, buf); // float samples[os->ratio]; // samples[0] = input; // for (int i = 1; i < os->ratio; ++i) { // samples[i]= 0.f; // } // // int whichFilter = 0; // int i = 0; // int j = 0; // for (; i < os->order; ++i) { // for (; j < exp2(i+1); j += os->order-i) { // samples[j] = tFIR_tick(&os->filters[whichFilter], samples[j]); // } // whichFilter++; // } // // for (int s = 0; s < os->ratio; ++s) { // samples[s] = effectTick(samples[s]); // } // // for (; i >= 0; --i) { // for (; j >= 0; j -= os->order-i) { // samples[j] = tFIR_tick(&os->filters[whichFilter], samples[j]); // } // whichFilter++; // } }