45 lines
1.8 KiB
C++
45 lines
1.8 KiB
C++
#include "stdafx.h"
|
|
#include "Equalizer.h"
|
|
#include "orfanidis_eq.h"
|
|
|
|
void Equalizer::ApplyEqualizer(uint32_t sampleCount, int16_t *samples)
|
|
{
|
|
double outL, outR;
|
|
for(uint32_t i = 0; i < sampleCount; i++) {
|
|
double inL = samples[i * 2];
|
|
double inR = samples[i * 2 + 1];
|
|
|
|
_equalizerLeft->sbs_process(&inL, &outL);
|
|
_equalizerRight->sbs_process(&inR, &outR);
|
|
|
|
samples[i * 2] = (int16_t)std::max(std::min(outL, 32767.0), -32768.0);
|
|
samples[i * 2 + 1] = (int16_t)std::max(std::min(outR, 32767.0), -32768.0);
|
|
}
|
|
}
|
|
|
|
void Equalizer::UpdateEqualizers(vector<double> bandGains, uint32_t sampleRate)
|
|
{
|
|
if(_prevSampleRate != sampleRate || memcmp(bandGains.data(), _prevEqualizerGains.data(), bandGains.size() * sizeof(double)) != 0) {
|
|
vector<double> bands = { 40, 56, 80, 113, 160, 225, 320, 450, 600, 750, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 10000, 12500, 13000 };
|
|
bands.insert(bands.begin(), bands[0] - (bands[1] - bands[0]));
|
|
bands.insert(bands.end(), bands[bands.size() - 1] + (bands[bands.size() - 1] - bands[bands.size() - 2]));
|
|
|
|
_eqFrequencyGrid.reset(new orfanidis_eq::freq_grid());
|
|
for(size_t i = 1; i < bands.size() - 1; i++) {
|
|
_eqFrequencyGrid->add_band((bands[i] + bands[i - 1]) / 2, bands[i], (bands[i + 1] + bands[i]) / 2);
|
|
}
|
|
|
|
_equalizerLeft.reset(new orfanidis_eq::eq1(_eqFrequencyGrid.get(), orfanidis_eq::filter_type::butterworth));
|
|
_equalizerRight.reset(new orfanidis_eq::eq1(_eqFrequencyGrid.get(), orfanidis_eq::filter_type::butterworth));
|
|
_equalizerLeft->set_sample_rate(sampleRate);
|
|
_equalizerRight->set_sample_rate(sampleRate);
|
|
|
|
for(unsigned int i = 0; i < _eqFrequencyGrid->get_number_of_bands(); i++) {
|
|
_equalizerLeft->change_band_gain_db(i, bandGains[i]);
|
|
_equalizerRight->change_band_gain_db(i, bandGains[i]);
|
|
}
|
|
|
|
_prevSampleRate = sampleRate;
|
|
_prevEqualizerGains = bandGains;
|
|
}
|
|
}
|