diff --git a/iircoeff b/iircoeff new file mode 100755 index 0000000..85d75f5 --- /dev/null +++ b/iircoeff @@ -0,0 +1,76 @@ +#!/usr/bin/perl + +use Math::Trig; + +my $fs = 96000; + +printCo(0, 20, 25, $fs); +printCo(20, 25, 31.5, $fs); +printCo(25, 31.5, 40, $fs); +printCo(31.5, 40, 50, $fs); +printCo(40, 50, 63, $fs); +printCo(50, 63, 80, $fs); +printCo(63, 80, 100, $fs); +printCo(80, 100, 125, $fs); +printCo(100, 125, 160, $fs); +printCo(125, 160, 200, $fs); +printCo(160, 200, 250, $fs); +printCo(200, 250, 315, $fs); +printCo(250, 315, 400, $fs); +printCo(315, 400, 500, $fs); +printCo(400, 500, 630, $fs); +printCo(500, 630, 800, $fs); +printCo(630, 800, 1000, $fs); +printCo(800, 1000, 1250, $fs); +printCo(1000, 1250, 1600, $fs); +printCo(1250, 1600, 2000, $fs); +printCo(1600, 2000, 2500, $fs); +printCo(2000, 2500, 3150, $fs); +printCo(2500, 3150, 4000, $fs); +printCo(3150, 4000, 5000, $fs); +printCo(4000, 5000, 6300, $fs); +printCo(5000, 6300, 8000, $fs); +printCo(6300, 8000, 10000, $fs); +printCo(8000, 10000, 12500, $fs); +printCo(10000, 12500, 16000, $fs); +printCo(12500, 16000, 20000, $fs); +printCo(16000, 20000, $fs / 2, $fs); + +sub printCo($$$$) { + my $fl = shift; + my $f0 = shift; + my $fh = shift; + my $fs = shift; + + my $f1 = $f0 - (($f0 - $fl) / 2); + my $f2 = $f0 + (($fh - $f0) / 2); + + @coeff = coefficient($f0, $fs, $f1, $f2); + print "/* $f0 Hz */\n"; + printf("new IIRCoefficients(%.10e, %.10e, %.10e),\n" , $coeff[1] * 2, $coeff[0] * 2, $coeff[2] * 2); +} + + +sub coefficient($$$$) { + my $f0 = shift; + my $fs = shift; + my $f1 = shift; + my $f2 = shift; + + my $q = $f0 / ($f2 - $f1); + + my $pi = 3.141592653; + + my $theta0 = 2 * $pi * ($f0 / $fs); + + my $thetaOverTwoQ = $theta0 / (2 * $q); + + my $beta = 0.5 * ((1 - tan($thetaOverTwoQ)) / (1 + tan($thetaOverTwoQ))); + + my $gamma = (0.5 + $beta) * cos($theta0); + + my $alpha = (0.5 - $beta) / 2; + + return ($alpha, $beta, $gamma); +} + diff --git a/src/uk/co/majenko/audiobookrecorder/Equaliser.java b/src/uk/co/majenko/audiobookrecorder/Equaliser.java index bb913f0..3a06bb8 100644 --- a/src/uk/co/majenko/audiobookrecorder/Equaliser.java +++ b/src/uk/co/majenko/audiobookrecorder/Equaliser.java @@ -15,6 +15,12 @@ public class Equaliser extends JPanel { EqualiserChannel channels[]; + static final double[] frequencies = { + 20d, 25d, 31.5d, 40d, 50d, 63d, 80d, 100d, 125d, 160d, 200d, + 250d, 315d, 400d, 500d, 630d, 800d, 1000d, 1250d, 1600d, 2000d, + 2500d, 3150d, 4000d, 5000d, 6300d, 8000d, 10000d, 12500d, 16000d, + 20000d + }; public Equaliser() { super(); @@ -28,7 +34,7 @@ public class Equaliser extends JPanel { inner.setLayout(new FlowLayout()); for (int i = 0; i < 31; i++) { - channels[i] = new EqualiserChannel(); + channels[i] = new EqualiserChannel(frequencies[i]); inner.add(channels[i]); } diff --git a/src/uk/co/majenko/audiobookrecorder/EqualiserChannel.java b/src/uk/co/majenko/audiobookrecorder/EqualiserChannel.java index 64e4ccf..8e17dbd 100644 --- a/src/uk/co/majenko/audiobookrecorder/EqualiserChannel.java +++ b/src/uk/co/majenko/audiobookrecorder/EqualiserChannel.java @@ -15,17 +15,35 @@ public class EqualiserChannel extends JPanel { float value; JSlider slider; JTextField textbox; + JLabel frequency; - public EqualiserChannel() { + public EqualiserChannel(double freq) { super(); + value = 0; slider = new JSlider(-120, 120, 0); textbox = new JTextField(); + String suffix = "Hz"; + if (freq > 1000) { + freq /= 1000; + suffix = "kHz"; + } + + String ftxt = String.format("%.4f", freq); + while (ftxt.endsWith("0")) { + ftxt = ftxt.substring(0, ftxt.length() - 1); + } + if (ftxt.endsWith(".")) { + ftxt = ftxt.substring(0, ftxt.length() - 1); + } + frequency = new JLabel(ftxt + suffix); + setLayout(new BorderLayout()); + add(frequency, BorderLayout.NORTH); slider.setOrientation(SwingConstants.VERTICAL); add(slider, BorderLayout.CENTER); textbox = new JTextField("0.0");