public CpxBandFilter() { this._cpxFilter = new CpxFirFilter(); this._coeffs = new float[this._order]; this._fftBuf = new Complex[this._fftLen]; this._kernel = new Complex[this._order]; }
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); }
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; }