コード例 #1
0
ファイル: IirFilter.cs プロジェクト: Radiomix2000/sdrsharp-1
        public void Init(IirFilterType filterType, double frequency, double sampleRate, int qualityFactor)
        {
            var w0    = 2.0 * Math.PI * frequency / sampleRate;
            var alpha = Math.Sin(w0) / (2.0 * qualityFactor);

            switch (filterType)
            {
            case IirFilterType.LowPass:
                _b0 = (float)((1.0 - Math.Cos(w0)) / 2.0);
                _b1 = (float)(1.0 - Math.Cos(w0));
                _b2 = (float)((1.0 - Math.Cos(w0)) / 2.0);
                _a0 = (float)(1.0 + alpha);
                _a1 = (float)(-2.0 * Math.Cos(w0));
                _a2 = (float)(1.0 - alpha);
                break;

            case IirFilterType.HighPass:
                _b0 = (float)((1.0 + Math.Cos(w0)) / 2.0);
                _b1 = (float)(-(1.0 + Math.Cos(w0)));
                _b2 = (float)((1.0 + Math.Cos(w0)) / 2.0);
                _a0 = (float)(1.0 + alpha);
                _a1 = (float)(-2.0 * Math.Cos(w0));
                _a2 = (float)(1.0 - alpha);
                break;

            //case IirFilterType.BandPass:
            default:
                _b0 = (float)(alpha);
                _b1 = 0.0f;
                _b2 = (float)(-alpha);
                _a0 = (float)(1.0 + alpha);
                _a1 = (float)(-2.0 * Math.Cos(w0));
                _a2 = (float)(1.0 - alpha);
                break;

            case IirFilterType.Notch:
                _b0 = 1.0f;
                _b1 = (float)(-2.0 * Math.Cos(w0));
                _b2 = 1.0f;
                _a0 = (float)(1.0 + alpha);
                _a1 = (float)(-2.0 * Math.Cos(w0));
                _a2 = (float)(1.0 - alpha);
                break;
            }

            _b0 /= _a0;
            _b1 /= _a0;
            _b2 /= _a0;
            _a1 /= _a0;
            _a2 /= _a0;

            _x1 = 0;
            _x2 = 0;
            _y1 = 0;
            _y2 = 0;
        }
コード例 #2
0
ファイル: IirFilter.cs プロジェクト: taozhengbo/sdrsharp
        public void Init(IirFilterType filterType, double frequency, double sampleRate, int qualityFactor)
        {
            var w0 = 2.0 * Math.PI * frequency / sampleRate;
            var alpha = Math.Sin(w0) / (2.0 * qualityFactor);
            
            switch (filterType)
            {
                case IirFilterType.LowPass:
                    _b0 = (float) ((1.0 - Math.Cos(w0)) / 2.0);
                    _b1 = (float) ( 1.0 - Math.Cos(w0));
                    _b2 = (float) ((1.0 - Math.Cos(w0)) / 2.0);
                    _a0 = (float) ( 1.0 + alpha);
                    _a1 = (float) (-2.0 * Math.Cos(w0));
                    _a2 = (float) ( 1.0 - alpha);
                    break;

                case IirFilterType.HighPass:
                    _b0 = (float) ( (1.0 + Math.Cos(w0)) / 2.0);
                    _b1 = (float) (-(1.0 + Math.Cos(w0)));
                    _b2 = (float) ( (1.0 + Math.Cos(w0)) / 2.0);
                    _a0 = (float) (  1.0 + alpha);
                    _a1 = (float) ( -2.0 * Math.Cos(w0));
                    _a2 = (float) (  1.0 - alpha);
                    break;

                //case IirFilterType.BandPass:
                default:
                    _b0 = (float) (alpha);
                    _b1 = 0.0f;
                    _b2 = (float) (-alpha);
                    _a0 = (float) ( 1.0 + alpha);
                    _a1 = (float) (-2.0 * Math.Cos(w0));
                    _a2 = (float) ( 1.0 - alpha);
                    break;

                case IirFilterType.Notch:
                    _b0 = 1.0f;
                    _b1 = (float) (-2.0 * Math.Cos(w0));
                    _b2 = 1.0f;
                    _a0 = (float) ( 1.0 + alpha);
                    _a1 = (float) (-2.0 * Math.Cos(w0));
                    _a2 = (float) ( 1.0 - alpha);
                    break;
            }

            _b0 /= _a0;
            _b1 /= _a0;
            _b2 /= _a0;
            _a1 /= _a0;
            _a2 /= _a0;

            _x1 = 0;
            _x2 = 0;
            _y1 = 0;
            _y2 = 0;
        }
コード例 #3
0
        public void Init(IirFilterType filterType, float frequency, float sampleRate, int qualityFactor)
        {
            var w0    = 2.0f * MathF.PI * frequency / sampleRate;
            var alpha = MathF.Sin(w0) / (2.0f * qualityFactor);

            switch (filterType)
            {
            case IirFilterType.LowPass:
                _b0 = (1.0f - MathF.Cos(w0)) / 2.0f;
                _b1 = 1.0f - MathF.Cos(w0);
                _b2 = (1.0f - MathF.Cos(w0)) / 2.0f;
                _a0 = 1.0f + alpha;
                _a1 = -2.0f * MathF.Cos(w0);
                _a2 = 1.0f - alpha;
                break;

            case IirFilterType.HighPass:
                _b0 = (1.0f + MathF.Cos(w0)) / 2.0f;
                _b1 = -(1.0f + MathF.Cos(w0));
                _b2 = (1.0f + MathF.Cos(w0)) / 2.0f;
                _a0 = 1.0f + alpha;
                _a1 = -2.0f * MathF.Cos(w0);
                _a2 = 1.0f - alpha;
                break;

            //case IirFilterType.BandPass:
            default:
                _b0 = alpha;
                _b1 = 0.0f;
                _b2 = -alpha;
                _a0 = 1.0f + alpha;
                _a1 = -2.0f * MathF.Cos(w0);
                _a2 = 1.0f - alpha;
                break;

            case IirFilterType.Notch:
                _b0 = 1.0f;
                _b1 = -2.0f * MathF.Cos(w0);
                _b2 = 1.0f;
                _a0 = 1.0f + alpha;
                _a1 = -2.0f * MathF.Cos(w0);
                _a2 = 1.0f - alpha;
                break;
            }

            _b0 /= _a0;
            _b1 /= _a0;
            _b2 /= _a0;
            _a1 /= _a0;
            _a2 /= _a0;

            _x1 = 0;
            _x2 = 0;
            _y1 = 0;
            _y2 = 0;
        }
コード例 #4
0
ファイル: IirFilter.cs プロジェクト: jamezleedz/SDRSharper
        public void Init(IirFilterType filterType, double frequency, double sampleRate, int qualityFactor)
        {
            double num  = 6.2831853071795862 * frequency / sampleRate;
            double num2 = Math.Sin(num) / (2.0 * (double)qualityFactor);

            switch (filterType)
            {
            case IirFilterType.LowPass:
                this._b0 = (float)((1.0 - Math.Cos(num)) / 2.0);
                this._b1 = (float)(1.0 - Math.Cos(num));
                this._b2 = (float)((1.0 - Math.Cos(num)) / 2.0);
                this._a0 = (float)(1.0 + num2);
                this._a1 = (float)(-2.0 * Math.Cos(num));
                this._a2 = (float)(1.0 - num2);
                break;

            case IirFilterType.HighPass:
                this._b0 = (float)((1.0 + Math.Cos(num)) / 2.0);
                this._b1 = (float)(0.0 - (1.0 + Math.Cos(num)));
                this._b2 = (float)((1.0 + Math.Cos(num)) / 2.0);
                this._a0 = (float)(1.0 + num2);
                this._a1 = (float)(-2.0 * Math.Cos(num));
                this._a2 = (float)(1.0 - num2);
                break;

            default:
                this._b0 = (float)num2;
                this._b1 = 0f;
                this._b2 = (float)(0.0 - num2);
                this._a0 = (float)(1.0 + num2);
                this._a1 = (float)(-2.0 * Math.Cos(num));
                this._a2 = (float)(1.0 - num2);
                break;

            case IirFilterType.Notch:
                this._b0 = 1f;
                this._b1 = (float)(-2.0 * Math.Cos(num));
                this._b2 = 1f;
                this._a0 = (float)(1.0 + num2);
                this._a1 = (float)(-2.0 * Math.Cos(num));
                this._a2 = (float)(1.0 - num2);
                break;
            }
            this._b0 /= this._a0;
            this._b1 /= this._a0;
            this._b2 /= this._a0;
            this._a1 /= this._a0;
            this._a2 /= this._a0;
            this._x1  = 0f;
            this._x2  = 0f;
            this._y1  = 0f;
            this._y2  = 0f;
        }
コード例 #5
0
ファイル: IirFilter.cs プロジェクト: zloiia/sdrsrc
 public void Init(IirFilterType filterType, double frequency, double sampleRate, double qualityFactor)
 {
     double num1 = 2.0 * Math.PI * frequency / sampleRate;
       double num2 = Math.Sin(num1) / (2.0 * qualityFactor);
       switch (filterType)
       {
     case IirFilterType.LowPass:
       this._b0 = (float) ((1.0 - Math.Cos(num1)) / 2.0);
       this._b1 = (float) (1.0 - Math.Cos(num1));
       this._b2 = (float) ((1.0 - Math.Cos(num1)) / 2.0);
       this._a0 = (float) (1.0 + num2);
       this._a1 = (float) (-2.0 * Math.Cos(num1));
       this._a2 = (float) (1.0 - num2);
       break;
     case IirFilterType.HighPass:
       this._b0 = (float) ((1.0 + Math.Cos(num1)) / 2.0);
       this._b1 = (float) -(1.0 + Math.Cos(num1));
       this._b2 = (float) ((1.0 + Math.Cos(num1)) / 2.0);
       this._a0 = (float) (1.0 + num2);
       this._a1 = (float) (-2.0 * Math.Cos(num1));
       this._a2 = (float) (1.0 - num2);
       break;
     case IirFilterType.Notch:
       this._b0 = 1f;
       this._b1 = (float) (-2.0 * Math.Cos(num1));
       this._b2 = 1f;
       this._a0 = (float) (1.0 + num2);
       this._a1 = (float) (-2.0 * Math.Cos(num1));
       this._a2 = (float) (1.0 - num2);
       break;
     default:
       this._b0 = (float) num2;
       this._b1 = 0.0f;
       this._b2 = (float) -num2;
       this._a0 = (float) (1.0 + num2);
       this._a1 = (float) (-2.0 * Math.Cos(num1));
       this._a2 = (float) (1.0 - num2);
       break;
       }
       this._b0 /= this._a0;
       this._b1 /= this._a0;
       this._b2 /= this._a0;
       this._a1 /= this._a0;
       this._a2 /= this._a0;
       this._x1 = 0.0f;
       this._x2 = 0.0f;
       this._y1 = 0.0f;
       this._y2 = 0.0f;
 }
コード例 #6
0
ファイル: FilterFactory.cs プロジェクト: Faham/emophiz
        static IirFilter AnalogPrototypeToDigitalFilter(ZeroPoleGain analogPrototype, Pair<double,double> cornerFreqs, BandType bandType, IirFilterType filterType)
        {
            // Check that we have valid frequencies
            bool isError = false;
            isError |= (cornerFreqs.First < 0 || cornerFreqs.First > Math.PI);

            if(bandType == BandType.BandPass || bandType == BandType.BandStop)
            {
                isError |= (cornerFreqs.Second < 0 || cornerFreqs.Second > Math.PI);
            }

            if (isError)
                throw new Exception("Frequencies must be between 0 and PI inclusive");

            //Prewarp the corner frequencies
            //Assuming sampling frequency of 1/2 so that we don't need to account for sampling frequency when converting from analog to digital.
            const double samplingFreq = 0.5;
            Func<double, double> freqWarp = x => 2 * samplingFreq * Math.Tan(x/2);
            Pair<double, double> warpedCornerFreqs = new Pair<double, double>();
            warpedCornerFreqs.First = freqWarp(cornerFreqs.First);
            warpedCornerFreqs.Second = freqWarp(cornerFreqs.Second);

            // Set prototype to desired band
            ZeroPoleGain analogFilter;
            switch (bandType)
            {
                case BandType.LowPass:
                    analogFilter = FilterModifiers.AnalogPrototypeToLowPass(warpedCornerFreqs.First, analogPrototype);
                    break;

                case BandType.HighPass:
                    analogFilter = FilterModifiers.AnalogPrototypeToHighPass(warpedCornerFreqs.First, analogPrototype);
                    break;

                case BandType.BandPass:
                    analogFilter = FilterModifiers.AnalogPrototypeToBandPass(warpedCornerFreqs.First, warpedCornerFreqs.Second, analogPrototype);
                    break;

                case BandType.BandStop:
                    analogFilter = FilterModifiers.AnalogPrototypeToBandStop(warpedCornerFreqs.First, warpedCornerFreqs.Second, analogPrototype);
                    break;

                default: Debug.Assert(false); throw new Exception();
            }

            //Convert analog (continuous) filter to digital (discrete) filter
            ZeroPoleGain digitalFilter;
            digitalFilter = FilterModifiers.ConvertAnalogToDigital(analogFilter);

            //Convert digital filter into second-order sections
            SosGain sosGain = FilterModifiers.ConvertZeroPoleToSosFilter(digitalFilter);

            //Create filter and return it
            return new IirFilter(sosGain);
        }
コード例 #7
0
 public FloatIirFilter(IirFilterType filterType, float frequency, float sampleRate, int qualityFactor)
 {
     Init(filterType, frequency, sampleRate, qualityFactor);
 }