Add 3-band equalizer. Not hooked up to client for time being though. Maybe later I'll expand it to more bands and create presets. Just wanted to check it in for now.

This commit is contained in:
beirich 2012-04-21 20:22:13 +00:00
parent c112573c30
commit fad95b6bab
1 changed files with 98 additions and 0 deletions

View File

@ -0,0 +1,98 @@
// C# port of C-based 3-band equalizer (C) Neil C / Etanza Systems / 2006
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Emulation.Sound
{
public sealed class Equalizer
{
double lowFilter;
double lowFilterPole0;
double lowFilterPole1;
double lowFilterPole2;
double lowFilterPole3;
double highFilter;
double highFilterPole0;
double highFilterPole1;
double highFilterPole2;
double highFilterPole3;
double sampleDataMinus1;
double sampleDataMinus2;
double sampleDataMinus3;
double lowGain;
double midGain;
double highGain;
const double sampleRate = 44100.0;
const double verySmallAmount = (1.0 / 4294967295.0);
double lowfreq;
public double LowFreqCutoff
{
get { return lowfreq; }
set
{
lowfreq = value;
lowFilter = 2 * Math.Sin(Math.PI * (lowfreq / sampleRate));
}
}
double highfreq;
public double HighFreqCutoff
{
get { return highfreq; }
set
{
highfreq = value;
highFilter = 2 * Math.Sin(Math.PI * (highfreq / sampleRate));
}
}
public Equalizer(double lowFreq=880, double highFreq=5000)
{
lowGain = 1.3;
midGain = 0.9;
highGain = 1.3;
LowFreqCutoff = lowFreq;
HighFreqCutoff = highFreq;
}
public short EqualizeSample(short sample)
{
lowFilterPole0 += (lowFilter * (sample - lowFilterPole0)) + verySmallAmount;
lowFilterPole1 += lowFilter * (lowFilterPole0 - lowFilterPole1);
lowFilterPole2 += lowFilter * (lowFilterPole1 - lowFilterPole2);
lowFilterPole3 += lowFilter * (lowFilterPole2 - lowFilterPole3);
double l = lowFilterPole3;
highFilterPole0 += (highFilter * (sample - highFilterPole0)) + verySmallAmount;
highFilterPole1 += highFilter * (highFilterPole0 - highFilterPole1);
highFilterPole2 += highFilter * (highFilterPole1 - highFilterPole2);
highFilterPole3 += highFilter * (highFilterPole2 - highFilterPole3);
double h = sampleDataMinus3 - highFilterPole3;
double m = sample - (h + l);
l *= lowGain;
m *= midGain;
h *= highGain;
sampleDataMinus3 = sampleDataMinus2;
sampleDataMinus2 = sampleDataMinus1;
sampleDataMinus1 = sample;
return (short) (l + m + h);
}
public void Equalize(short[] samples)
{
for (int i = 0; i < samples.Length; i++)
samples[i] = EqualizeSample(samples[i]);
}
}
}