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); }
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)); } }
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); }
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); }