Ejemplo n.º 1
0
        private bool DesignBilinear(double fc, double fs, long sampleFreq, AnalogFilterDesign.FilterType filterType)
        {
            double twoπ = 2.0 * Math.PI;

            mIIRBilinear = new BilinearDesign(fc, sampleFreq);

            double fc_pw = mIIRBilinear.PrewarpωtoΩ(twoπ * fc) / twoπ;
            double fs_pw = mIIRBilinear.PrewarpωtoΩ(twoπ * fs) / twoπ;

            mAfd = new AnalogFilterDesign();
            mAfd.DesignLowpass(0, CUTOFF_GAIN_DB, StopbandRippleDb(),
                               fc_pw, fs_pw,
                               filterType,
                               ApproximationBase.BetaType.BetaMax);

            // 連続時間伝達関数を離散時間伝達関数に変換。
            for (int i = 0; i < mAfd.HPfdCount(); ++i)
            {
                var s = mAfd.HPfdNth(i);
                mIIRBilinear.Add(s);
            }
            mIIRBilinear.Calc();

            return(true);
        }
Ejemplo n.º 2
0
        public bool Design(double fc, double fs, long samplingFreq, Method method,
                           AnalogFilterDesign.FilterType filterType = AnalogFilterDesign.FilterType.Cauer)
        {
            CutoffFreq       = fc;
            StopbandEdgeFreq = fs;

            mMethod           = method;
            SamplingFrequency = samplingFreq;

            switch (method)
            {
            case Method.Bilinear:
                return(DesignBilinear(fc, fs, samplingFreq, filterType));

            default:
                return(DesignImpulseInvariance(fc, fs, samplingFreq, filterType));
            }
        }
Ejemplo n.º 3
0
        private bool DesignImpulseInvariance(double fc, double fs, long samplingFreq, AnalogFilterDesign.FilterType filterType)
        {
            mAfd = new AnalogFilterDesign();
            mAfd.DesignLowpass(0, CUTOFF_GAIN_DB, StopbandRippleDb(),
                               fc,
                               fs,
                               filterType,
                               ApproximationBase.BetaType.BetaMax);

            var H_s = new List <FirstOrderComplexRationalPolynomial>();

            for (int i = 0; i < mAfd.HPfdCount(); ++i)
            {
                var p = mAfd.HPfdNth(i);
                H_s.Add(p);
            }

            mIIRiim = new ImpulseInvarianceMethod(H_s, fc * 2.0 * Math.PI, samplingFreq, mMethod == Method.ImpulseInvarianceMinimumPhase);
            return(true);
        }
Ejemplo n.º 4
0
        private bool GetParametersFromUI()
        {
            if (!double.TryParse(textBoxG0.Text, out mG0))
            {
                MessageBox.Show("G0 parse error.");
                return(false);
            }
            if (!double.TryParse(textBoxGc.Text, out mGc) || mG0 <= mGc)
            {
                MessageBox.Show("Gc parse error. mGc must be smaller than mG0");
                return(false);
            }
            if (!double.TryParse(textBoxGs.Text, out mGs) || mGc <= mGs)
            {
                MessageBox.Show("Gs parse error. mGs must be smaller than mGc");
                return(false);
            }

            if (!TryParseNumberWithUnit(textBoxFc.Text, out mFc) || mFc <= 0)
            {
                MessageBox.Show("Fc parse error. Fc must be greater than 0");
                return(false);
            }

            if (!TryParseNumberWithUnit(textBoxFs.Text, out mFs))
            {
                MessageBox.Show("Fs parse error. Fs must be number.");
                return(false);
            }

            if (mFs <= 0 || mFs <= mFc)
            {
                MessageBox.Show("Fs parse error. Fs must be greater than Fc and greater than 0");
                return(false);
            }

            mBetaType = ApproximationBase.BetaType.BetaMax;
            if (comboBoxOptimization.SelectedItem == comboBoxItemβmin)
            {
                mBetaType = ButterworthDesign.BetaType.BetaMin;
            }

            mFilterType = AnalogFilterDesign.FilterType.Butterworth;
            if (radioButtonFilterTypeChebyshev.IsChecked == true)
            {
                mFilterType = AnalogFilterDesign.FilterType.Chebyshev;
            }
            if (radioButtonFilterTypePascal.IsChecked == true)
            {
                mFilterType = AnalogFilterDesign.FilterType.Pascal;
            }
            if (radioButtonFilterTypeInverseChebyshev.IsChecked == true)
            {
                mFilterType = AnalogFilterDesign.FilterType.InverseChebyshev;
            }
            if (radioButtonFilterTypeCauer.IsChecked == true)
            {
                mFilterType = AnalogFilterDesign.FilterType.Cauer;
            }

            if (!TryParseNumberWithUnit(textBoxSamplingFrequency.Text, out mSamplingFrequency) || mSamplingFrequency <= 0)
            {
                MessageBox.Show("SamplingFrequency parse error. it must be greater than 0");
                return(false);
            }

            return(true);
        }