Example #1
0
		public CpxBandFilter()
		{
			this._cpxFilter = new CpxFirFilter();
			this._coeffs = new float[this._order];
			this._fftBuf = new Complex[this._fftLen];
			this._kernel = new Complex[this._order];
		}
Example #2
0
        private void initFilters()
        {
            int num         = this._bandwidth / 2;
            int filterOrder = (this._actualDetectorType == DetectorType.WFM) ? 60 : this._filterOrder;

            float[] coefficients = FilterBuilder.MakeLowPassKernel(this._sampleRate / Math.Pow(2.0, (double)this._baseBandDecimationStageCount), filterOrder, (double)num, this._windowType);
            if (this._realIqFilter == null)
            {
                this._realIqFilter = new IQFirFilter(coefficients, this._actualDetectorType == DetectorType.WFM, 1);
            }
            else
            {
                this._realIqFilter.SetCoefficients(coefficients);
            }
            if (this._cpxIqFilter == null)
            {
                this._cpxIqFilter = new CpxFirFilter(coefficients);
            }
            else
            {
                this._cpxIqFilter.SetCoefficients(coefficients);
            }
            this._envFilter.MakeCoefficients(this._sampleRate / Math.Pow(2.0, (double)this._envelopeDecimationStageCount), 6000, num, this._windowType, false);
            if (this._notch >= 0)
            {
                this._notchFilter[this._notch].MakeCoefficients(this._sampleRate / Math.Pow(2.0, (double)this._baseBandDecimationStageCount), this._notchFrequency, this._notchWidth, this._windowType, true);
                this._notch = -1;
            }
            int num2 = 0;
            int num3 = 10000;

            switch (this._actualDetectorType)
            {
            case DetectorType.AM:
            case DetectorType.SAM:
                num2 = 20;
                num3 = Math.Min(this._bandwidth / 2, 16000);
                break;

            case DetectorType.CW:
                num2 = this._cwToneShift - this._bandwidth / 2;
                num3 = this._cwToneShift + this._bandwidth / 2;
                break;

            case DetectorType.LSB:
            case DetectorType.USB:
                num2 = 400;
                num3 = this._bandwidth;
                break;

            case DetectorType.DSB:
                num2 = 400;
                num3 = this._bandwidth / 2;
                break;

            case DetectorType.NFM:
                num2 = 300;
                num3 = this._bandwidth / 2;
                break;
            }
            coefficients = FilterBuilder.MakeBandPassKernel(this._sampleRate / Math.Pow(2.0, (double)(this._baseBandDecimationStageCount + this._audioDecimationStageCount)), this._filterOrder, (double)num2, (double)num3, this._windowType);
            this._audioFilter.SetCoefficients(coefficients);
            this._rFilter.SetCoefficients(coefficients);
            this._lFilter.SetCoefficients(coefficients);
        }
Example #3
0
        public unsafe void SetCoefficients(Complex[] coefficients)
        {
            this._isFast = false;
            if (coefficients != null)
            {
                if (this._coeffBuffer == null || coefficients.Length != this._queueSize)
                {
                    this._queueSize   = coefficients.Length;
                    this._offset      = this._queueSize * 3;
                    this._coeffBuffer = UnsafeBuffer.Create(this._queueSize, sizeof(Complex));
                    this._coeffPtr    = (Complex *)(void *)this._coeffBuffer;
                    this._queueBuffer = UnsafeBuffer.Create(this._queueSize * 4, sizeof(Complex));
                    this._queuePtr    = (Complex *)(void *)this._queueBuffer;
                }
                for (int i = 0; i < this._queueSize; i++)
                {
                    this._coeffPtr[i] = coefficients[i];
                }
                this._isSymmetric = true;
                this._isSparse    = true;
                if (this._queueSize % 2 != 0)
                {
                    int num = this._queueSize / 2;
                    for (int j = 0; j < num; j++)
                    {
                        int num2 = this._queueSize - 1 - j;
                        Complex.Sub(ref this._dif, this._coeffPtr[j], this._coeffPtr[num2]);
                        if ((double)this._dif.Modulus() > 1E-06)
                        {
                            this._isSymmetric = false;
                            this._isSparse    = false;
                            break;
                        }
                        if (j % 2 != 0)
                        {
                            this._isSparse = (this._coeffPtr[j].Real == 0f && this._coeffPtr[j].Imag == 0f && this._coeffPtr[num2].Real == 0f && this._coeffPtr[num2].Imag == 0f);
                        }
                    }
                }
                if (this._segment == null || this._segment.Length != this._fftSize)
                {
                    this._segment = UnsafeBuffer.Create(this._fftSize, sizeof(Complex));
                    this._segPtr  = (Complex *)(void *)this._segment;
                    this._kernel  = UnsafeBuffer.Create(this._fftSize, sizeof(Complex));
                    this._kerPtr  = (Complex *)(void *)this._kernel;
                    this._overlap = UnsafeBuffer.Create(this._fftSize, sizeof(Complex));
                    this._olaPtr  = (Complex *)(void *)this._overlap;
                    this._temp    = UnsafeBuffer.Create(this._fftSize, sizeof(Complex));
                    this._tmpPtr  = (Complex *)(void *)this._temp;
                }
                if (this._queueSize < 64)
                {
                    this._fftLen = 128;
                    goto IL_033c;
                }
                if (this._queueSize < 128)
                {
                    this._fftLen = 256;
                    goto IL_033c;
                }
                if (this._queueSize < 256)
                {
                    this._fftLen = 512;
                    goto IL_033c;
                }
                if (this._queueSize < 512)
                {
                    this._fftLen = 1024;
                    goto IL_033c;
                }
                if (this._queueSize < 1024)
                {
                    this._fftLen = 2048;
                    goto IL_033c;
                }
                if (this._queueSize < 2048)
                {
                    this._fftLen = 4096;
                    goto IL_033c;
                }
                throw new Exception("kernel too long");
            }
            return;

IL_033c:
            CpxFirFilter.FillFft(this._kerPtr, this._fftLen, this._coeffPtr, this._queueSize);
            Fourier.ForwardTransform(this._kerPtr, this._fftLen, false);
            this._isFast = true;
        }