ViPERFX_RE/src/cpp/utils/HiFi.cpp

83 lines
2.5 KiB
C++
Raw Normal View History

2021-07-31 16:00:35 +02:00
//
// Created by mart on 7/31/21.
//
#include "HiFi.h"
#include "../constants.h"
HiFi::HiFi() {
this->gain = 1.f;
this->samplerate = DEFAULT_SAMPLERATE;
for (int i = 0; i < 2; i++) {
this->buffers[i] = new WaveBuffer_I32(2, 0x800);
this->filters[i].lowpass = new IIR_NOrder_BW_LH(1);
this->filters[i].highpass = new IIR_NOrder_BW_LH(3);
this->filters[i].bandpass = new IIR_NOrder_BW_BP(3);
}
Reset();
}
HiFi::~HiFi() {
for (int i = 0; i < 2; i++) {
delete this->buffers[i];
delete this->filters[i].lowpass;
delete this->filters[i].highpass;
delete this->filters[i].bandpass;
}
}
void HiFi::Process(float *samples, uint32_t size) {
if (size > 0) {
float* bpBuf = this->buffers[0]->PushZerosGetBuffer(size);
float* lpBuf = this->buffers[1]->PushZerosGetBuffer(size);
if (bpBuf == nullptr || lpBuf == nullptr) {
Reset();
return;
}
for (int i = 0; i < size*2; i++) {
int index = i % 2;
float out1 = do_filter_lh(this->filters[index].lowpass, samples[i]);
float out2 = do_filter_lh(this->filters[index].highpass, samples[i]);
float out3 = do_filter_bp(this->filters[index].bandpass, samples[i]);
samples[i] = out2;
lpBuf[i] = out1;
bpBuf[i] = out3;
}
float* bpOut = this->buffers[0]->GetCurrentBufferI32Ptr();
float* lpOut = this->buffers[1]->GetCurrentBufferI32Ptr();
for (int i = 0; i < size * 2; i++) {
float hp = samples[i] * this->gain * 1.2f;
float bp = bpOut[i] * this->gain;
samples[i] = hp + bp + lpOut[i];
}
this->buffers[0]->PopSamples(size, false);
this->buffers[1]->PopSamples(size, false);
}
}
void HiFi::Reset() {
for (int i = 0; i < 2; i++) {
this->filters[i].lowpass->setLPF(120.0, this->samplerate);
this->filters[i].lowpass->Mute();
this->filters[i].highpass->setHPF(1200.0, this->samplerate);
this->filters[i].highpass->Mute();
this->filters[i].bandpass->setBPF(120.f, 1200.f, this->samplerate);
this->filters[i].bandpass->Mute();
}
this->buffers[0]->Reset();
this->buffers[0]->PushZeros(this->samplerate/400);
this->buffers[1]->Reset();
this->buffers[1]->PushZeros(this->samplerate/200);
}
void HiFi::SetClarity(float value) {
this->gain = value;
}
void HiFi::SetSamplingRate(uint32_t samplerate) {
this->samplerate = samplerate;
Reset();
}