shithub: leaf

ref: a8831f4d0fc4666d80e73b886ab2e60d176bb4a2
dir: /LEAF/Src/leaf-oversampler.c/

View raw version
//
//  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++;
//    }
}