I quickly made (using Cycling74's Max/MSP) a fully working prototype demo of PhonoEQ software which I'm going to release ... tomorrow.
This prototype works best at sampling frequencies above 88.2kHz because of the method used for to compute the biquad filter coefficients. Final release runs internally at 384kHz to get the EQ response to about ideal.
Magnitude error at 96kHz:
- input can be taken from ADC or audio file (few audio file formats supported)
- recording the output (few audio file formats supported)
- 38 presets for RIAA and non-RIAA equalizations + custom preset so it's possible tweak those frequencies (see below)
- Remove RIAA is usable when recording non-RIAA record through RIAA pre-amp/circuit
- 4th order butterworth highpass as rumble filter (24dB/Oct at 20Hz)
- Neumann and IEC poles for RIAA (custom preset lets to use these freely)
- filter gain control is done through filter gain coefficients (i.e. in use only when eq filter is in use)
Probably there's not many here who needs this type of software but if something comes in to mind, any suggestions for additional features would be great.
Project DL links coming later.
BTW, looks like this new editor isn't working smoothly with IE11!
OK, here's the prototype demo DL page - http://jiiteepee.blogspot.com/2016/03/phonoeq-software-project.html
I'm trying to improve the response at lower sampling frequencies (you know the issue close Nyqvist) but, as my math skills are not very good .... I know couple biquad optimization articles but would need help with the conversion of the needed equations to non complex c++ code as for an example. ATM, I'm trying to solve how to use optimization method described in Martin Vicanek's fresh article Matched Second Order Digital Filters (http://www.vicanek.de/articles/BiquadFits.pdf) (chapter 4) but, with optimizating only b coefficients the output is wrong (its ok at low frequencies only). If the method is suitable for say RIAA coefficients which are calculated this way:
double a0, a1, a2, b0, b1, b2;
double fs = 96000.0;
//timeconstants (case RIAA):
// frequency -> time conversion 1/(2*pi*fc) (= R*C)
double p1 = 3180e-6; // 1/(2*pi*50.05Hz)
double p2 = 75e-6; // 2212Hz
double z1 = 318e-6; // 500.5Hz
double z2 = 0.0; // use 3.18e-6 for Neumann pole (50kHz)
double pole1= exp(-1.0/(fs*p1));
double pole2 = exp(-1.0/(fs*p2));
double zero1= exp(-1.0/(fs*z1));
double zero2 = exp(-1.0/(fs*z2));
a0 = 1.0; // 1.0
a1 = -pole1 - pole2; // -0.967774
a2 = pole1 * pole2; // 0.0
b0 = 1.0; // 1.0
b1 = -zero1 - zero2; // -1.867057
b2 = zero1 * zero2; // 0.867481
, then I suppose some optimization equations for a coefficients is needed as well?
Any help in this would be appreciated.