public static void SystemResponse(ZedGraphControl systemGraph, Drivers drivers, bool phaseToggleSum) { double FcLP = 0.0; double FcHP = 0.0; double phaseAtFcLP = 0; double phaseAtFcHP = 0; double splAtFcLP = 0; double splAtFcHP = 0; double[,] groupDelayLP, groupDelayHP, groupDelaySum; double maxLP, maxHP, maxSum; double[,] sum = (new FilterCore().SumResponses(drivers.woofer1.target.splInterpolated, drivers.tweeter.target.splInterpolated)); Curves.AddSummedComplexCurves(systemGraph, sum , Color.Black, "SummedSPL", "SummedSPL", "SummedPhase" , FcLP, splAtFcLP, phaseAtFcLP , FcHP, splAtFcHP, phaseAtFcHP , phaseToggleSum); // Lowpass delay groupDelayLP = GroupDelay.Calculate(drivers.woofer1.target.splInterpolated, out maxLP); // Highpass delay groupDelayHP = GroupDelay.Calculate(drivers.tweeter.target.splInterpolated, out maxHP); // System delay groupDelaySum = GroupDelay.Calculate(sum, out maxSum); var max = (maxLP > maxHP) ? maxLP : maxHP; Curves.AddGroupDelayCurves(systemGraph, groupDelayLP, Color.Violet, "LowpassDelay", "LowpassDelay", curveIsVisible: true, yMax: max); Curves.AddGroupDelayCurves(systemGraph, groupDelayHP, Color.Orange, "HighpassDelay", "HighpassDelay", curveIsVisible: true, yMax: max); Curves.AddGroupDelayCurves(systemGraph, groupDelaySum, Color.Green, "SystemDelay", "SystemDelay", phaseToggleSum, yMax: max); // Data used for graph export FilterSPL.Instance.lowpass = drivers.woofer1.target.splInterpolated; FilterSPL.Instance.highpass = drivers.tweeter.target.splInterpolated; }
/// <summary> /// Used only to initialize at startup /// </summary> private void CalculateAll() { double FcLP = 1000; double FcHP = 1000; double splAtFcLP = 1; double phaseAtFcLP = 0; double splAtFcHP = 1; double phaseAtFcHP = 0; double factoredFcLP; double factoredFcHP; double[,] groupDelay; double max; // Lowpass section if (IsFilterConsistentWithOrder(trgtOrderLP, trgtTypeLP)) { FcLP = Convert.ToDouble(trgtFreqLP.Value); Filters.Calculate(drivers.woofer1, FrequencyRange.dynamicFreqs , FcLP, out splAtFcLP, out phaseAtFcLP , FcHP, out splAtFcHP, out phaseAtFcHP , out factoredFcLP, out factoredFcHP); FilterSPL.Instance.lowpass = drivers.woofer1.target.splInterpolated; Curves.AddTargetComplexCurves(systemGraph, drivers.woofer1 , Color.Blue, "LowpassSPL", "LowpassSPL", "LowpassPhase" , FcLP, splAtFcLP, phaseAtFcLP , FcHP, splAtFcHP, phaseAtFcHP); besselFcPhaseLP.Text = phaseAtFcLP.ToString(); UpdateFactorLP(FcLP); // Lowpass delay groupDelay = GroupDelay.Calculate(drivers.woofer1.target.splInterpolated, out max); Curves.AddGroupDelayCurves(systemGraph, groupDelay, Color.Violet, "LowpassDelay", "LowpassDelay", curveIsVisible: true, yMax: max); } // Highpass section if (IsFilterConsistentWithOrder(trgtOrderHP, trgtTypeHP)) { FcHP = Convert.ToDouble(trgtFreqHP.Value); Filters.Calculate(drivers.tweeter, FrequencyRange.dynamicFreqs , FcLP, out splAtFcLP, out phaseAtFcLP , FcHP, out splAtFcHP, out phaseAtFcHP , out factoredFcLP, out factoredFcHP , hpIsInverted); //FilterSPL.Instance.lowpass = drivers.tweeter.target.splInterpolated; FilterSPL.Instance.highpass = drivers.tweeter.target.splInterpolated; Curves.AddTargetComplexCurves(systemGraph, drivers.tweeter , Color.Red, "HighpassSPL", "HighpassSPL", "HighpassPhase" , FcLP, splAtFcLP, phaseAtFcLP , FcHP, splAtFcHP, phaseAtFcHP); besselFcPhaseHP.Text = phaseAtFcHP.ToString(); UpdateFactorHP(FcHP); // Highpass delay groupDelay = GroupDelay.Calculate(drivers.tweeter.target.splInterpolated, out max); Curves.AddGroupDelayCurves(systemGraph, groupDelay, Color.Orange, "HighpassDelay", "HighpassDelay", curveIsVisible: true, yMax: max); } // System sum section double[,] sum = (new FilterCore().SumResponses(drivers.woofer1.target.splInterpolated, drivers.tweeter.target.splInterpolated)); Curves.AddSummedComplexCurves(systemGraph, sum , Color.Black, "SummedSPL", "SummedSPL", "SummedPhase" , FcLP, splAtFcLP, phaseAtFcLP , FcHP, splAtFcHP, phaseAtFcHP); // System delay groupDelay = GroupDelay.Calculate(sum, out max); Curves.AddGroupDelayCurves(systemGraph, groupDelay, Color.Green, "SystemDelay", "SystemDelay", curveIsVisible: true, yMax: max); FilterSPL.Instance.lowpass = drivers.woofer1.target.splInterpolated; FilterSPL.Instance.highpass = drivers.tweeter.target.splInterpolated; }