Exemple #1
0
        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;
        }