mirror of
https://github.com/AndroidAudioMods/ViPERFX_RE.git
synced 2025-06-23 08:32:52 +08:00
Update
This commit is contained in:
@ -30,6 +30,7 @@ set(FILES
|
||||
src/cpp/viper/effects/DiffSurround.cpp
|
||||
src/cpp/viper/effects/DynamicSystem.cpp
|
||||
src/cpp/viper/effects/FETCompressor.cpp
|
||||
src/cpp/viper/effects/FIREqualizer.cpp
|
||||
src/cpp/viper/effects/IIRFilter.cpp
|
||||
src/cpp/viper/effects/PlaybackGain.cpp
|
||||
src/cpp/viper/effects/Reverberation.cpp
|
||||
@ -51,7 +52,7 @@ set(FILES
|
||||
src/cpp/viper/utils/DepthSurround.cpp
|
||||
src/cpp/viper/utils/DynamicBass.cpp
|
||||
src/cpp/viper/utils/FIR.cpp
|
||||
src/cpp/viper/utils/FixedBiquad.cpp
|
||||
src/cpp/viper/utils/Biquad.cpp
|
||||
src/cpp/viper/utils/Harmonic.cpp
|
||||
src/cpp/viper/utils/HiFi.cpp
|
||||
src/cpp/viper/utils/HighShelf.cpp
|
||||
@ -67,7 +68,7 @@ set(FILES
|
||||
src/cpp/viper/utils/Stereo3DSurround.cpp
|
||||
src/cpp/viper/utils/Subwoofer.cpp
|
||||
src/cpp/viper/utils/TimeConstDelay.cpp
|
||||
src/cpp/viper/utils/WaveBuffer_I32.cpp)
|
||||
src/cpp/viper/utils/WaveBuffer.cpp)
|
||||
|
||||
message(${CMAKE_BUILD_TYPE})
|
||||
|
||||
|
@ -7,8 +7,8 @@ ViPER::ViPER() {
|
||||
VIPER_LOGI("Welcome to ViPER FX");
|
||||
VIPER_LOGI("Current version is %s %s", VERSION_STRING, VERSION_CODENAME);
|
||||
|
||||
this->adaptiveBuffer = new AdaptiveBuffer(2, 4096);
|
||||
this->waveBuffer = new WaveBuffer_I32(2, 4096);
|
||||
this->adaptiveBuffer = new FIREqualizer(2, 4096);
|
||||
this->waveBuffer = new WaveBuffer(2, 4096);
|
||||
|
||||
this->convolver = new Convolver();
|
||||
this->convolver->SetEnable(false);
|
||||
@ -331,7 +331,7 @@ void ViPER::processBuffer(float *buffer, int frameSize) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto pWaveBuffer = this->waveBuffer->GetCurrentBufferI32Ptr();
|
||||
auto pWaveBuffer = this->waveBuffer->GetBuffer();
|
||||
this->convolver->Process(pWaveBuffer, pWaveBuffer, frameSize);
|
||||
this->vhe->Process(pWaveBuffer, pWaveBuffer, frameSize);
|
||||
this->waveBuffer->SetBufferOffset(frameSize);
|
||||
|
@ -1,10 +1,7 @@
|
||||
//
|
||||
// Created by mart on 7/25/21.
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#include "Effect.h"
|
||||
#include "utils/WaveBuffer_I32.h"
|
||||
#include "utils/WaveBuffer.h"
|
||||
#include "effects/SpectrumExtend.h"
|
||||
#include "effects/Reverberation.h"
|
||||
#include "effects/DynamicSystem.h"
|
||||
@ -51,8 +48,8 @@ public:
|
||||
// FxMode mode;
|
||||
|
||||
// Effects
|
||||
AdaptiveBuffer *adaptiveBuffer;
|
||||
WaveBuffer_I32 *waveBuffer;
|
||||
FIREqualizer *adaptiveBuffer;
|
||||
WaveBuffer *waveBuffer;
|
||||
bool fetcomp_enabled;
|
||||
Convolver *convolver;
|
||||
VHE *vhe;
|
||||
|
@ -7,7 +7,7 @@ DiffSurround::DiffSurround() {
|
||||
this->delayTime = 0.0f;
|
||||
this->enabled = false;
|
||||
for (auto &buffer : this->buffers) {
|
||||
buffer = new WaveBuffer_I32(1, 0x1000);
|
||||
buffer = new WaveBuffer(1, 0x1000);
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,8 +30,8 @@ void DiffSurround::Process(float *samples, uint32_t size) {
|
||||
bufs[i % 2][i / 2] = samples[i];
|
||||
}
|
||||
|
||||
outbufs[0] = this->buffers[0]->GetCurrentBufferI32Ptr();
|
||||
outbufs[1] = this->buffers[1]->GetCurrentBufferI32Ptr();
|
||||
outbufs[0] = this->buffers[0]->GetBuffer();
|
||||
outbufs[1] = this->buffers[1]->GetBuffer();
|
||||
|
||||
for (int i = 0; i < size * 2; i++) {
|
||||
samples[i] = outbufs[i % 2][i / 2];
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "../utils/WaveBuffer_I32.h"
|
||||
#include "../utils/WaveBuffer.h"
|
||||
|
||||
class DiffSurround {
|
||||
public:
|
||||
@ -17,7 +17,7 @@ public:
|
||||
uint32_t samplerate;
|
||||
bool enabled;
|
||||
float delayTime;
|
||||
WaveBuffer_I32 *buffers[2];
|
||||
WaveBuffer *buffers[2];
|
||||
};
|
||||
|
||||
|
||||
|
2
src/cpp/viper/effects/FIREqualizer.cpp
Normal file
2
src/cpp/viper/effects/FIREqualizer.cpp
Normal file
@ -0,0 +1,2 @@
|
||||
#include "FIREqualizer.h"
|
||||
#include <cstring>
|
12
src/cpp/viper/effects/FIREqualizer.h
Normal file
12
src/cpp/viper/effects/FIREqualizer.h
Normal file
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
class FIREqualizer {
|
||||
public:
|
||||
FIREqualizer();
|
||||
~FIREqualizer();
|
||||
|
||||
};
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include "../utils/MultiBiquad.h"
|
||||
#include "../utils/FixedBiquad.h"
|
||||
#include "../utils/Biquad.h"
|
||||
|
||||
class SpeakerCorrection {
|
||||
public:
|
||||
@ -17,6 +17,6 @@ public:
|
||||
uint32_t samplerate;
|
||||
bool enabled;
|
||||
MultiBiquad highpass[2];
|
||||
FixedBiquad lowpass[2];
|
||||
FixedBiquad bandpass[2];
|
||||
Biquad lowpass[2];
|
||||
Biquad bandpass[2];
|
||||
};
|
||||
|
@ -7,8 +7,8 @@ VHE::VHE() {
|
||||
convSize = 0;
|
||||
samplerate = DEFAULT_SAMPLERATE;
|
||||
|
||||
bufA = new WaveBuffer_I32(2, 0x1000);
|
||||
bufB = new WaveBuffer_I32(2, 0x1000);
|
||||
bufA = new WaveBuffer(2, 0x1000);
|
||||
bufB = new WaveBuffer(2, 0x1000);
|
||||
Reset();
|
||||
}
|
||||
|
||||
@ -21,7 +21,7 @@ void VHE::Process(float *source, float *dest, int frameSize) {
|
||||
if (enabled && convLeft.InstanceUsable() && convRight.InstanceUsable()) {
|
||||
if (bufA->PushSamples(source, frameSize) != 0) {
|
||||
while (bufA->GetBufferOffset() > convSize) {
|
||||
float *buffer = bufA->GetCurrentBufferI32Ptr();
|
||||
float *buffer = bufA->GetBuffer();
|
||||
convLeft.ConvolveInterleaved(buffer, 0);
|
||||
convRight.ConvolveInterleaved(buffer, 1);
|
||||
bufB->PushSamples(buffer, convSize);
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include "../utils/PConvSingle_F32.h"
|
||||
#include "../utils/WaveBuffer_I32.h"
|
||||
#include "../utils/WaveBuffer.h"
|
||||
|
||||
class VHE {
|
||||
public:
|
||||
@ -17,7 +17,7 @@ public:
|
||||
void SetSamplingRate(uint32_t srate);
|
||||
|
||||
PConvSingle_F32 convLeft, convRight;
|
||||
WaveBuffer_I32 *bufA, *bufB;
|
||||
WaveBuffer *bufA, *bufB;
|
||||
uint32_t samplerate;
|
||||
bool enabled;
|
||||
int effectLevel;
|
||||
|
@ -1,9 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "../utils/FixedBiquad.h"
|
||||
#include "../utils/Biquad.h"
|
||||
#include "../utils/Subwoofer.h"
|
||||
#include "../utils/WaveBuffer_I32.h"
|
||||
#include "../utils/WaveBuffer.h"
|
||||
#include "../utils/Polyphase.h"
|
||||
|
||||
class ViPERBass {
|
||||
@ -21,9 +21,9 @@ public:
|
||||
|
||||
private:
|
||||
Polyphase *polyphase;
|
||||
FixedBiquad *fixedBiquad;
|
||||
Biquad *fixedBiquad;
|
||||
Subwoofer *subwoofer;
|
||||
WaveBuffer_I32 *waveBuffer;
|
||||
WaveBuffer *waveBuffer;
|
||||
bool enable;
|
||||
bool initOk;
|
||||
int processMode;
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include <cstring>
|
||||
#include "AdaptiveBuffer.h"
|
||||
|
||||
AdaptiveBuffer::AdaptiveBuffer(uint32_t channels, uint32_t length) {
|
||||
FIREqualizer::FIREqualizer(uint32_t channels, uint32_t length) {
|
||||
this->channels = channels;
|
||||
this->buffer = nullptr;
|
||||
this->length = 0;
|
||||
@ -12,32 +12,32 @@ AdaptiveBuffer::AdaptiveBuffer(uint32_t channels, uint32_t length) {
|
||||
}
|
||||
}
|
||||
|
||||
AdaptiveBuffer::~AdaptiveBuffer() {
|
||||
FIREqualizer::~FIREqualizer() {
|
||||
delete this->buffer;
|
||||
this->buffer = nullptr;
|
||||
}
|
||||
|
||||
void AdaptiveBuffer::FlushBuffer() {
|
||||
void FIREqualizer::FlushBuffer() {
|
||||
this->offset = 0;
|
||||
}
|
||||
|
||||
uint32_t AdaptiveBuffer::GetBufferLength() const {
|
||||
uint32_t FIREqualizer::GetBufferLength() const {
|
||||
return this->length;
|
||||
}
|
||||
|
||||
uint32_t AdaptiveBuffer::GetBufferOffset() const {
|
||||
uint32_t FIREqualizer::GetBufferOffset() const {
|
||||
return this->offset;
|
||||
}
|
||||
|
||||
float *AdaptiveBuffer::GetBufferPointer() const {
|
||||
float *FIREqualizer::GetBufferPointer() const {
|
||||
return this->buffer;
|
||||
}
|
||||
|
||||
uint32_t AdaptiveBuffer::GetChannels() const {
|
||||
uint32_t FIREqualizer::GetChannels() const {
|
||||
return this->channels;
|
||||
}
|
||||
|
||||
void AdaptiveBuffer::PanFrames(float left, float right) {
|
||||
void FIREqualizer::PanFrames(float left, float right) {
|
||||
if (this->buffer != nullptr && this->channels == 2) {
|
||||
for (int i = 0; i < this->offset * this->channels; i++) {
|
||||
if (i % 2 == 0) {
|
||||
@ -49,7 +49,7 @@ void AdaptiveBuffer::PanFrames(float left, float right) {
|
||||
}
|
||||
}
|
||||
|
||||
int AdaptiveBuffer::PopFrames(float *frames, uint32_t length) {
|
||||
int FIREqualizer::PopFrames(float *frames, uint32_t length) {
|
||||
if (this->buffer == nullptr || this->offset < length) {
|
||||
return 0;
|
||||
}
|
||||
@ -65,7 +65,7 @@ int AdaptiveBuffer::PopFrames(float *frames, uint32_t length) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int AdaptiveBuffer::PushFrames(const float *frames, uint32_t length) {
|
||||
int FIREqualizer::PushFrames(const float *frames, uint32_t length) {
|
||||
if (this->buffer == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
@ -86,7 +86,7 @@ int AdaptiveBuffer::PushFrames(const float *frames, uint32_t length) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int AdaptiveBuffer::PushZero(uint32_t length) {
|
||||
int FIREqualizer::PushZero(uint32_t length) {
|
||||
if (this->buffer == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
@ -105,7 +105,7 @@ int AdaptiveBuffer::PushZero(uint32_t length) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void AdaptiveBuffer::ScaleFrames(float scale) {
|
||||
void FIREqualizer::ScaleFrames(float scale) {
|
||||
if (this->buffer != nullptr) {
|
||||
for (uint32_t i = 0; i < this->offset * this->channels; i++) {
|
||||
this->buffer[i] = this->buffer[i] * scale;
|
||||
@ -113,6 +113,6 @@ void AdaptiveBuffer::ScaleFrames(float scale) {
|
||||
}
|
||||
}
|
||||
|
||||
void AdaptiveBuffer::SetBufferOffset(uint32_t offset) {
|
||||
void FIREqualizer::SetBufferOffset(uint32_t offset) {
|
||||
this->offset = offset;
|
||||
}
|
||||
|
@ -2,10 +2,10 @@
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
class AdaptiveBuffer {
|
||||
class FIREqualizer {
|
||||
public:
|
||||
AdaptiveBuffer(uint32_t channels, uint32_t length);
|
||||
~AdaptiveBuffer();
|
||||
FIREqualizer(uint32_t channels, uint32_t length);
|
||||
~FIREqualizer();
|
||||
|
||||
void FlushBuffer();
|
||||
uint32_t GetBufferLength() const;
|
||||
|
98
src/cpp/viper/utils/Biquad.cpp
Normal file
98
src/cpp/viper/utils/Biquad.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
#include "Biquad.h"
|
||||
#include <cmath>
|
||||
|
||||
Biquad::Biquad() {
|
||||
Reset();
|
||||
SetCoeffs(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
double Biquad::ProcessSample(double sample) {
|
||||
double out = sample * this->b0 + this->x_1 * this->b1 + this->x_2 * this->b2 + this->y_1 * this->a1 +
|
||||
this->y_2 * this->a2;
|
||||
this->y_2 = this->y_1;
|
||||
this->y_1 = out;
|
||||
this->x_2 = this->x_1;
|
||||
this->x_1 = sample;
|
||||
return out;
|
||||
}
|
||||
|
||||
void Biquad::Reset() {
|
||||
this->a1 = 0;
|
||||
this->a2 = 0;
|
||||
this->b0 = 0;
|
||||
this->b1 = 0;
|
||||
this->b2 = 0;
|
||||
this->x_1 = 0;
|
||||
this->x_2 = 0;
|
||||
this->y_1 = 0;
|
||||
this->y_2 = 0;
|
||||
}
|
||||
|
||||
void Biquad::SetBandPassParameter(double frequency, double samplingRate, double qFactor) {
|
||||
double x = (2.0 * M_PI * frequency) / samplingRate;
|
||||
double sinX = sin(x);
|
||||
double cosX = cos(x);
|
||||
double y = sinX / (2.0 * qFactor);
|
||||
|
||||
double a0 = 1.0 + y;
|
||||
double a1 = -cosX * 2.0;
|
||||
double a2 = 1.0 - y;
|
||||
double b0 = sinX / 2.0;
|
||||
double b1 = 0.0;
|
||||
double b2 = -sinX / 2.0;
|
||||
this->SetCoeffs(a0, a1, a2, b0, b1, b2);
|
||||
}
|
||||
|
||||
void Biquad::SetCoeffs(double a0, double a1, double a2, double b0, double b1, double b2) {
|
||||
this->x_2 = 0;
|
||||
this->x_1 = 0;
|
||||
this->y_2 = 0;
|
||||
this->y_1 = 0;
|
||||
this->a1 = -a1 / a0;
|
||||
this->a2 = -a2 / a0;
|
||||
this->b0 = b0 / a0;
|
||||
this->b1 = b1 / a0;
|
||||
this->b2 = b2 / a0;
|
||||
}
|
||||
|
||||
void
|
||||
Biquad::SetHighPassParameter(double frequency, double samplingRate, double param_4, double qFactor, double param_6) {
|
||||
double x = (2.0 * M_PI * frequency) / samplingRate;
|
||||
double sinX = sin(x);
|
||||
double cosX = cos(x);
|
||||
|
||||
double y = pow(10.0, param_4 / 40.0);
|
||||
double sqrtY = sqrt(y);
|
||||
|
||||
double z = sinX / 2.0 * sqrt((1.0 / y + y) * (1.0 / qFactor - 1.0) + 2.0);
|
||||
double a = (y - 1.0) * cosX;
|
||||
double b = (y + 1.0) + a;
|
||||
double c = (y + 1.0) * cosX;
|
||||
double d = (y + 1.0) - a;
|
||||
double e = pow(10.0, param_6 / 20.0);
|
||||
double f = (y - 1.0) - c;
|
||||
|
||||
double a0 = d + (sqrtY * 2.0) * z;
|
||||
double a1 = f * 2.0;
|
||||
double a2 = d - (sqrtY * 2.0) * z;
|
||||
double b0 = (b + (sqrtY * 2.0) * z) * y * e;
|
||||
double b1 = y * -2.0 * ((y - 1.0) + c) * e;
|
||||
double b2 = (b - (sqrtY * 2.0) * z) * y * e;
|
||||
this->SetCoeffs(a0, a1, a2, b0, b1, b2);
|
||||
}
|
||||
|
||||
void Biquad::SetLowPassParameter(double frequency, double samplingRate, double qFactor) {
|
||||
double x = (2.0 * M_PI * frequency) / samplingRate;
|
||||
double sinX = sin(x);
|
||||
double y = sinX / (qFactor * 2.0);
|
||||
double cosX = cos(x);
|
||||
double z = 1.0 - cosX;
|
||||
|
||||
double a0 = y + 1.0;
|
||||
double a1 = -cosX * 2.0;
|
||||
double a2 = 1.0 - y;
|
||||
double b0 = z / 2.0;
|
||||
double b1 = z;
|
||||
double b2 = z / 2.0;
|
||||
this->SetCoeffs(a0, a1, a2, b0, b1, b2);
|
||||
}
|
20
src/cpp/viper/utils/Biquad.h
Normal file
20
src/cpp/viper/utils/Biquad.h
Normal file
@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
class Biquad {
|
||||
public:
|
||||
Biquad();
|
||||
|
||||
double ProcessSample(double sample);
|
||||
void Reset();
|
||||
void SetBandPassParameter(double frequency, double samplingRate, double qFactor);
|
||||
void SetCoeffs(double a0, double a1, double a2, double b0, double b1, double b2);
|
||||
void SetHighPassParameter(double frequency, double samplingRate, double param_4, double qFactor, double param_6);
|
||||
void SetLowPassParameter(double frequency, double samplingRate, double qFactor);
|
||||
|
||||
private:
|
||||
double y_2, y_1, x_2, x_1;
|
||||
double b0, b1, b2, a1, a2;
|
||||
};
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "FixedBiquad.h"
|
||||
#include "Biquad.h"
|
||||
#include "TimeConstDelay.h"
|
||||
|
||||
|
||||
@ -23,5 +23,5 @@ public:
|
||||
uint32_t gain;
|
||||
float prev[2];
|
||||
TimeConstDelay delay[2];
|
||||
FixedBiquad highpass;
|
||||
Biquad highpass;
|
||||
};
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include "PolesFilter.h"
|
||||
#include "FixedBiquad.h"
|
||||
#include "Biquad.h"
|
||||
|
||||
class DynamicBass {
|
||||
public:
|
||||
@ -31,5 +31,5 @@ public:
|
||||
|
||||
PolesFilter filterX;
|
||||
PolesFilter filterY;
|
||||
FixedBiquad lowPass;
|
||||
Biquad lowPass;
|
||||
};
|
||||
|
@ -1,81 +0,0 @@
|
||||
#include <cmath>
|
||||
#include "FixedBiquad.h"
|
||||
|
||||
FixedBiquad::FixedBiquad() {
|
||||
Reset();
|
||||
SetCoeffs(1.f, 0.f, 0.f, 1.f, 0.f, 0.f);
|
||||
}
|
||||
|
||||
float FixedBiquad::ProcessSample(float sample) {
|
||||
float out = sample * this->b0 + this->x_1 * this->b1 + this->x_2 * this->b2 + this->y_1 * this->a1 +
|
||||
this->y_2 * this->a2;
|
||||
this->y_2 = this->y_1;
|
||||
this->y_1 = out;
|
||||
this->x_2 = this->x_1;
|
||||
this->x_1 = sample;
|
||||
return out;
|
||||
}
|
||||
|
||||
void FixedBiquad::Reset() {
|
||||
this->y_2 = 0;
|
||||
this->y_1 = 0;
|
||||
this->x_2 = 0;
|
||||
this->x_1 = 0;
|
||||
this->b0 = 0;
|
||||
this->b1 = 0;
|
||||
this->b2 = 0;
|
||||
this->a1 = 0;
|
||||
this->a2 = 0;
|
||||
}
|
||||
|
||||
void FixedBiquad::SetCoeffs(float a0, float a1, float a2, float b0, float b1, float b2) {
|
||||
this->y_2 = 0;
|
||||
this->y_1 = 0;
|
||||
this->x_2 = 0;
|
||||
this->x_1 = 0;
|
||||
this->b0 = b0 / a0;
|
||||
this->b1 = b1 / a0;
|
||||
this->b2 = b2 / a0;
|
||||
this->a1 = -a1 / a0;
|
||||
this->a2 = -a2 / a0;
|
||||
}
|
||||
|
||||
void FixedBiquad::SetBandPassParameter(float frequency, uint32_t samplerate, float qFactor) {
|
||||
float x = (2.f * frequency * (float) M_PI / (float) samplerate);
|
||||
float sinX = sinf(x);
|
||||
float cosX = cosf(x);
|
||||
float y = x / (2.f * qFactor);
|
||||
SetCoeffs(y + 1.f, -2.f * cosX, 1.f - y, sinX / 2.f, 0.f, -sinX / 2.f);
|
||||
}
|
||||
|
||||
void
|
||||
FixedBiquad::SetHighPassParameter(float frequency, uint32_t samplerate, float param_4, float qFactor, float param_6) {
|
||||
// TODO: Cleanup and named params
|
||||
float fVar12 = (frequency * 2.f * (float) M_PI) / (float) samplerate;
|
||||
float x = powf(10.f, param_4 / 40.f);
|
||||
float fVar5 = (1.f / x + x) * (1.f / qFactor - 1.f) + 2.f;
|
||||
float fVar7 = sqrtf(x);
|
||||
float fVar8 = x - 1.f;
|
||||
float fVar10 = x + 1.f;
|
||||
float fVar6 = sinf(fVar12) * 0.f * sqrtf(fVar5);
|
||||
fVar5 = cosf(fVar12);
|
||||
fVar12 = fVar10 + fVar8 * fVar5;
|
||||
float fVar11 = fVar10 - fVar8 * fVar5;
|
||||
float fVar2 = powf(10.f, param_6 / 20.f);
|
||||
float fVar9 = fVar8 - fVar10 * fVar5;
|
||||
SetCoeffs(fVar11 + (fVar7 + fVar7) * fVar6,
|
||||
fVar9 + fVar9,
|
||||
fVar11 - (fVar7 + fVar7) * fVar6,
|
||||
(fVar12 + (fVar7 + fVar7) * fVar6) * x * fVar2,
|
||||
x * -2.f * (fVar8 + fVar10 * fVar5) * fVar2,
|
||||
(fVar12 - (fVar7 + fVar7) * fVar6) * x * fVar2);
|
||||
}
|
||||
|
||||
void FixedBiquad::SetLowPassParameter(float frequency, uint32_t samplerate, float qFactor) {
|
||||
float x = (frequency * 2.f * (float) M_PI) / (float) samplerate;
|
||||
float sinX = sinf(x);
|
||||
float y = sinX / (qFactor * 2.f);
|
||||
float cosX = cosf(x);
|
||||
float z = (1.f - cosX) / 2.f;
|
||||
SetCoeffs(y + 1.f, cosX * -2.f, 1.f - y, z, 1.f - cosX, z);
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
class FixedBiquad {
|
||||
public:
|
||||
FixedBiquad();
|
||||
|
||||
float ProcessSample(float sample);
|
||||
|
||||
void Reset();
|
||||
|
||||
void SetCoeffs(float a0, float a1, float a2, float b0, float b1, float b2);
|
||||
|
||||
void SetBandPassParameter(float frequency, uint32_t samplerate, float qFactor);
|
||||
|
||||
void SetHighPassParameter(float frequency, uint32_t samplerate, float param_4, float qFactor, float param_6);
|
||||
|
||||
void SetLowPassParameter(float frequency, uint32_t samplerate, float qFactor);
|
||||
|
||||
|
||||
float y_2, y_1, x_2, x_1;
|
||||
float b0, b1, b2, a1, a2;
|
||||
};
|
@ -5,7 +5,7 @@ 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->buffers[i] = new WaveBuffer(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);
|
||||
@ -40,8 +40,8 @@ void HiFi::Process(float *samples, uint32_t size) {
|
||||
lpBuf[i] = out1;
|
||||
bpBuf[i] = out3;
|
||||
}
|
||||
float *bpOut = this->buffers[0]->GetCurrentBufferI32Ptr();
|
||||
float *lpOut = this->buffers[1]->GetCurrentBufferI32Ptr();
|
||||
float *bpOut = this->buffers[0]->GetBuffer();
|
||||
float *lpOut = this->buffers[1]->GetBuffer();
|
||||
for (int i = 0; i < size * 2; i++) {
|
||||
float hp = samples[i] * this->gain * 1.2f;
|
||||
float bp = bpOut[i] * this->gain;
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
#include "IIR_NOrder_BW_LH.h"
|
||||
#include "WaveBuffer_I32.h"
|
||||
#include "WaveBuffer.h"
|
||||
#include "IIR_NOrder_BW_BP.h"
|
||||
|
||||
class HiFi {
|
||||
@ -19,7 +19,7 @@ public:
|
||||
|
||||
void SetSamplingRate(uint32_t samplerate);
|
||||
|
||||
WaveBuffer_I32 *buffers[2];
|
||||
WaveBuffer *buffers[2];
|
||||
struct {
|
||||
IIR_NOrder_BW_LH *lowpass;
|
||||
IIR_NOrder_BW_LH *highpass;
|
||||
|
1
src/cpp/viper/utils/MinPhaseIIRCoeffs.cpp
Normal file
1
src/cpp/viper/utils/MinPhaseIIRCoeffs.cpp
Normal file
@ -0,0 +1 @@
|
||||
#include "MinPhaseIIRCoeffs.h"
|
13
src/cpp/viper/utils/MinPhaseIIRCoeffs.h
Normal file
13
src/cpp/viper/utils/MinPhaseIIRCoeffs.h
Normal file
@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
class MinPhaseIIRCoeffs {
|
||||
public:
|
||||
MinPhaseIIRCoeffs();
|
||||
~MinPhaseIIRCoeffs();
|
||||
|
||||
void Find_F1_F2(double a, double b, double *c, double *d);
|
||||
float *GetCoefficients();
|
||||
float *GetIndexFrequency();
|
||||
int *SolveRoot(double a, double b, double c, double *d);
|
||||
int UpdateCoeffs(int a, int samplingRate);
|
||||
};
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "WaveBuffer_I32.h"
|
||||
#include "WaveBuffer.h"
|
||||
#include "FIR.h"
|
||||
|
||||
class Polyphase {
|
||||
@ -17,8 +17,8 @@ public:
|
||||
private:
|
||||
FIR *fir1;
|
||||
FIR *fir2;
|
||||
WaveBuffer_I32 *waveBuffer1;
|
||||
WaveBuffer_I32 *waveBuffer2;
|
||||
WaveBuffer *waveBuffer1;
|
||||
WaveBuffer *waveBuffer2;
|
||||
int *unknown1;
|
||||
bool enabled;
|
||||
// 3 unknowns
|
||||
|
@ -17,10 +17,10 @@ float TimeConstDelay::ProcessSample(float sample) {
|
||||
if (this->samples != nullptr) {
|
||||
float val = this->samples[this->offset];
|
||||
this->samples[this->offset] = sample;
|
||||
this->offset = (int) modf((float) this->offset + 1, (float *) &this->sampleCount);
|
||||
this->offset = (int) modf((float) this->offset + 1, (float *) &this->sampleCount); // TODO: check if this is correct
|
||||
return val;
|
||||
}
|
||||
return 0.f;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
void TimeConstDelay::SetParameters(uint32_t samplerate, float delay) {
|
||||
|
@ -1,6 +1,3 @@
|
||||
//
|
||||
// Created by mart on 7/26/21.
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
|
@ -1,36 +1,31 @@
|
||||
#include <cstdlib>
|
||||
#include "WaveBuffer.h"
|
||||
#include <cstring>
|
||||
#include "WaveBuffer_I32.h"
|
||||
|
||||
WaveBuffer_I32::WaveBuffer_I32(int channels, uint32_t size) {
|
||||
WaveBuffer::WaveBuffer(int channels, uint32_t size) {
|
||||
this->channels = channels;
|
||||
this->size = size * channels;
|
||||
this->index = 0;
|
||||
this->buffer = new float[this->size];
|
||||
}
|
||||
|
||||
WaveBuffer_I32::~WaveBuffer_I32() {
|
||||
WaveBuffer::~WaveBuffer() {
|
||||
delete this->buffer;
|
||||
this->buffer = nullptr;
|
||||
}
|
||||
|
||||
void WaveBuffer_I32::Reset() {
|
||||
this->index = 0;
|
||||
}
|
||||
|
||||
uint32_t WaveBuffer_I32::GetBufferOffset() {
|
||||
uint32_t WaveBuffer::GetBufferOffset() {
|
||||
return this->index / this->channels;
|
||||
}
|
||||
|
||||
uint32_t WaveBuffer_I32::GetBufferSize() {
|
||||
uint32_t WaveBuffer::GetBufferSize() {
|
||||
return this->size / this->channels;
|
||||
}
|
||||
|
||||
float *WaveBuffer_I32::GetCurrentBufferI32Ptr() {
|
||||
float *WaveBuffer::GetBuffer() {
|
||||
return this->buffer;
|
||||
}
|
||||
|
||||
uint32_t WaveBuffer_I32::PopSamples(uint32_t size, bool resetIndex) {
|
||||
uint32_t WaveBuffer::PopSamples(uint32_t size, bool resetIndex) {
|
||||
if (this->buffer == nullptr || this->size == 0) {
|
||||
return 0;
|
||||
}
|
||||
@ -50,13 +45,13 @@ uint32_t WaveBuffer_I32::PopSamples(uint32_t size, bool resetIndex) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t WaveBuffer_I32::PopSamples(float *dest, uint32_t size, bool resetIndex) {
|
||||
uint32_t WaveBuffer::PopSamples(float *dest, uint32_t size, bool resetIndex) {
|
||||
if (this->buffer == nullptr || this->size == 0 || dest == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (this->channels * size <= this->index) {
|
||||
memcpy(dest, this->buffer, this->index * sizeof(float));
|
||||
memcpy(dest, this->buffer, this->channels * size * sizeof(float));
|
||||
this->index -= this->channels * size;
|
||||
memmove(this->buffer, &this->buffer[this->channels * size], this->index * sizeof(float));
|
||||
return size;
|
||||
@ -72,18 +67,19 @@ uint32_t WaveBuffer_I32::PopSamples(float *dest, uint32_t size, bool resetIndex)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WaveBuffer_I32::PushSamples(float *source, uint32_t size) {
|
||||
int WaveBuffer::PushSamples(float *source, uint32_t size) {
|
||||
if (this->buffer == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (size > 0) {
|
||||
if (this->size < this->channels * size + this->index) {
|
||||
auto *buf = new float[this->channels * size + this->index];
|
||||
uint32_t requiredSize = this->channels * size + this->index;
|
||||
if (this->size < requiredSize) {
|
||||
auto *buf = new float[requiredSize];
|
||||
memcpy(buf, this->buffer, this->index * sizeof(float));
|
||||
delete this->buffer;
|
||||
this->buffer = buf;
|
||||
this->size = this->channels * size + this->index;
|
||||
this->size = requiredSize;
|
||||
}
|
||||
memcpy(&this->buffer[this->index], source, this->channels * size * sizeof(float));
|
||||
this->index += this->channels * size;
|
||||
@ -92,18 +88,19 @@ int WaveBuffer_I32::PushSamples(float *source, uint32_t size) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int WaveBuffer_I32::PushZeros(uint32_t size) {
|
||||
int WaveBuffer::PushZeros(uint32_t size) {
|
||||
if (this->buffer == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (size > 0) {
|
||||
if (this->size < this->channels * size + this->index) {
|
||||
auto *buf = new float[this->channels * size + this->index];
|
||||
uint32_t requiredSize = this->channels * size + this->index;
|
||||
if (this->size < requiredSize) {
|
||||
auto *buf = new float[requiredSize];
|
||||
memcpy(buf, this->buffer, this->index * sizeof(float));
|
||||
delete this->buffer;
|
||||
this->buffer = buf;
|
||||
this->size = this->channels * size + this->index;
|
||||
this->size = requiredSize;
|
||||
}
|
||||
memset(&this->buffer[this->index], 0, this->channels * size * sizeof(float));
|
||||
this->index += this->channels * size;
|
||||
@ -112,26 +109,36 @@ int WaveBuffer_I32::PushZeros(uint32_t size) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
float *WaveBuffer_I32::PushZerosGetBuffer(uint32_t size) {
|
||||
float *WaveBuffer::PushZerosGetBuffer(uint32_t size) {
|
||||
uint32_t oldIndex = this->index;
|
||||
|
||||
if (this->buffer == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (size > 0) {
|
||||
if (this->size < this->channels * size + this->index) {
|
||||
auto *buf = new float[this->channels * size + this->index];
|
||||
uint32_t requiredSize = this->channels * size + this->index;
|
||||
if (this->size < requiredSize) {
|
||||
auto *buf = new float[requiredSize];
|
||||
memcpy(buf, this->buffer, this->index * sizeof(float));
|
||||
delete this->buffer;
|
||||
this->buffer = buf;
|
||||
this->size = this->channels * size + this->index;
|
||||
this->size = requiredSize;
|
||||
}
|
||||
memset(&this->buffer[this->index], 0, this->channels * size * sizeof(float));
|
||||
this->index += this->channels * size;
|
||||
}
|
||||
|
||||
return &this->buffer[this->index];
|
||||
return &this->buffer[oldIndex];
|
||||
}
|
||||
|
||||
void WaveBuffer_I32::SetBufferOffset(uint32_t offset) {
|
||||
this->index = offset;
|
||||
void WaveBuffer::Reset() {
|
||||
this->index = 0;
|
||||
}
|
||||
|
||||
void WaveBuffer::SetBufferOffset(uint32_t offset) {
|
||||
uint32_t maxOffset = this->size / this->channels;
|
||||
if (offset <= maxOffset) {
|
||||
this->index = offset * this->channels;
|
||||
}
|
||||
}
|
@ -3,11 +3,11 @@
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
class WaveBuffer_I32 {
|
||||
class WaveBuffer {
|
||||
public:
|
||||
WaveBuffer_I32(int channels, uint32_t size);
|
||||
WaveBuffer(int channels, uint32_t size);
|
||||
|
||||
~WaveBuffer_I32();
|
||||
~WaveBuffer();
|
||||
|
||||
void Reset();
|
||||
|
||||
@ -15,7 +15,7 @@ public:
|
||||
|
||||
uint32_t GetBufferSize();
|
||||
|
||||
float *GetCurrentBufferI32Ptr();
|
||||
float *GetBuffer();
|
||||
|
||||
uint32_t PopSamples(uint32_t size, bool resetIndex);
|
||||
|
Reference in New Issue
Block a user