private void DrawFilterCurve( Rect r, float[] coeffs, float lowGain, float midGain, float highGain, Color color, bool filled, double samplerate, double magScale) { double wm = -2.0 * 3.1415926 / samplerate; AudioCurveRendering.AudioCurveEvaluator d = delegate(float x) { MathHelpers.ComplexD w = MathHelpers.ComplexD.Exp(wm * GUIHelpers.MapNormalizedFrequency((double)x, samplerate, useLogScale, true)); MathHelpers.ComplexD lpf = MathHelpers.ComplexD.Pow((w * (w * coeffs[0] + coeffs[1]) + coeffs[2]) / (w * (w * coeffs[3] + coeffs[4]) + 1.0f), filterOrder); MathHelpers.ComplexD bpf1 = MathHelpers.ComplexD.Pow((w * (w * coeffs[5] + coeffs[6]) + coeffs[7]) / (w * (w * coeffs[8] + coeffs[9]) + 1.0f), filterOrder); MathHelpers.ComplexD bpf2 = MathHelpers.ComplexD.Pow((w * (w * coeffs[10] + coeffs[11]) + coeffs[12]) / (w * (w * coeffs[13] + coeffs[14]) + 1.0f), filterOrder); MathHelpers.ComplexD hpf = MathHelpers.ComplexD.Pow((w * (w * coeffs[15] + coeffs[16]) + coeffs[17]) / (w * (w * coeffs[18] + coeffs[19]) + 1.0f), filterOrder); double h = (lpf * lowGain).Mag2() + (bpf1 * bpf2 * midGain).Mag2() + (hpf * highGain).Mag2(); double mag = masterGain + 10.0 * Math.Log10(h); return((float)(mag * magScale)); }; if (filled) { AudioCurveRendering.DrawFilledCurve(r, d, color); } else { AudioCurveRendering.DrawCurve(r, d, color); } }
static public ComplexD Div(ComplexD a, double b) { double s = 1.0 / b; return(new ComplexD( a.real * s, a.imag * s)); }
static public ComplexD Div(double a, ComplexD b) { double d = b.real * b.real + b.imag * b.imag; double s = a / d; return(new ComplexD( s * b.real, -s * b.imag)); }
static public ComplexD Div(ComplexD a, ComplexD b) { double d = b.real * b.real + b.imag * b.imag; double s = 1.0 / d; return(new ComplexD( (a.real * b.real + a.imag * b.imag) * s, (a.imag * b.real - a.real * b.imag) * s)); }
static public ComplexD Pow(ComplexD a, double b) { double p = Math.Atan2(a.imag, a.real); double m = Math.Pow(a.Mag2(), b * 0.5f); return(new ComplexD( m * Math.Cos(p * b), m * Math.Sin(p * b) )); }
static public ComplexD Mul(double a, ComplexD b) { return(new ComplexD( a * b.real, a * b.imag)); }
static public ComplexD Mul(ComplexD a, double b) { return(new ComplexD( a.real * b, a.imag * b)); }
static public ComplexD Mul(ComplexD a, ComplexD b) { return(new ComplexD( a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real)); }
static public ComplexD Sub(double a, ComplexD b) { return(new ComplexD( a - b.real, -b.imag)); }
static public ComplexD Sub(ComplexD a, double b) { return(new ComplexD( a.real - b, a.imag)); }
static public ComplexD Sub(ComplexD a, ComplexD b) { return(new ComplexD( a.real - b.real, a.imag - b.imag)); }
static public ComplexD Add(double a, ComplexD b) { return(new ComplexD( a + b.real, b.imag)); }
static public ComplexD Add(ComplexD a, double b) { return(new ComplexD( a.real + b, a.imag)); }
static public ComplexD Add(ComplexD a, ComplexD b) { return(new ComplexD( a.real + b.real, a.imag + b.imag)); }