示例#1
0
        /// <summary>
        /// Kaiser Window Filter
        /// </summary>
        /// <param name="inputData">Input waform data</param>
        /// <param name="f">Band edges</param>
        /// <param name="a"> Desired amplitude on the bands define by f</param>
        /// <param name="dev">Passband ripple and stopband attenuation</param>
        /// <param name="fs">Samplerate</param>
        /// <returns>Output waveform data</returns>
        public static double[] Kaiser(double[] inputData, double[] f, double[] a, double[] dev, double fs)
        {
            MWNumericArray inputDataMatlab = inputData;
            MWNumericArray fMatlab         = f;
            MWNumericArray aMatlab         = a;
            MWNumericArray devMatlab       = dev;
            MWArray        fsMatlab        = fs;

            MWArray[] resultMatlab;
            double[,] result2D;
            double[] result;

            DSPClass dspTask = new DSPClass();

            resultMatlab = dspTask.Kaiser(1, inputDataMatlab, fMatlab, aMatlab, devMatlab, fsMatlab);

            result2D = (double[, ])resultMatlab[0].ToArray();
            result   = new double[result2D.Length];
            Buffer.BlockCopy(result2D, 0, result, 0, result2D.Length * sizeof(double));
            return(result);
        }
示例#2
0
        /// <summary>
        /// FFT Spectrum
        /// </summary>
        /// <param name="Wave">Input Wave</param>
        /// <param name="SampleRate">Sampling Rate</param>
        /// <param name="df">Frequency interval</param>
        /// <param name="Unit">Date Unit: V/Vrms/DBV</param>
        /// <returns>Spectrum result</returns>
        public static double[] FFTSpectrum(double[] Wave, int SampleRate, ref double df, DataUnit Unit)
        {
            MWNumericArray WaveMatlab       = Wave;
            MWArray        WavePointMatlab  = Wave.Length;
            MWArray        SampleRateMatlab = SampleRate;
            MWArray        UnitMatlab       = (int)Unit;

            MWArray[] FFTResult;

            double[,] X2D, Y2D;
            double[] Y;
            DSPClass DSPTask = new DSPClass();

            FFTResult = DSPTask.Spectrum(2, WaveMatlab, WavePointMatlab, SampleRateMatlab, UnitMatlab);

            X2D = (double[, ])FFTResult[1].ToArray();
            Y2D = (double[, ])FFTResult[0].ToArray();
            Y   = new double[Y2D.Length];
            df  = X2D[0, 0];
            Buffer.BlockCopy(Y2D, 0, Y, 0, Y2D.Length * sizeof(double));
            return(Y);
        }
示例#3
0
        /// <summary>
        /// Filter
        /// </summary>
        /// <param name="inputData">Input waform data</param>
        /// <param name="mode">Folter design method</param>
        /// <param name="type">Filter type</param>
        /// <param name="fpass1">PassBand left frequency</param>
        /// <param name="fstop1">StopBand left frequency</param>
        /// <param name="fpass2">PassBand right frequency</param>
        /// <param name="fstop2">StopBand right frequency</param>
        /// <param name="fs">Samplerate</param>
        /// <param name="rp">Passband ripple</param>
        /// <param name="rs">Stopband attenuation</param>
        /// <returns>Output waveform data</returns>
        private static double[] Filter(double[] inputData, DesignMethod mode, FilterType type, double fpass1, double fstop1, double fpass2, double fstop2, double fs, double rp = 0.1, double rs = 50)
        {
            MWNumericArray waveMatlab = inputData;
            MWNumericArray wpMatlab;
            MWNumericArray wsMatlab;
            MWNumericArray wnMatlab;
            MWArray        typeMatlab;
            MWArray        rpMatlab = rp;
            MWArray        rsMatlab = rs;

            MWArray[] resultMatlab;
            double[]  fpassandFstop = new double[4];
            double[]  frange        = new double[2];
            double[,] result2D;
            double[] result;
            switch (type)
            {
            case FilterType.Highpass:
                if (fpass1 > fstop1)
                {
                    wpMatlab = fpass1 / (fs / 2);
                    wsMatlab = fstop1 / (fs / 2);
                }
                else
                {
                    wpMatlab = fstop1 / (fs / 2);
                    wsMatlab = fpass1 / (fs / 2);
                }
                typeMatlab = "high";
                if (mode == DesignMethod.InvChebyshev)
                {
                    wnMatlab = wsMatlab;
                }
                else
                {
                    wnMatlab = wpMatlab;
                }
                break;

            case FilterType.Lowpass:
                if (fpass1 < fstop1)
                {
                    wpMatlab = fpass1 / (fs / 2);
                    wsMatlab = fstop1 / (fs / 2);
                }
                else
                {
                    wpMatlab = fstop1 / (fs / 2);
                    wsMatlab = fpass1 / (fs / 2);
                }
                typeMatlab = "low";
                if (mode == DesignMethod.InvChebyshev)
                {
                    wnMatlab = wsMatlab;
                }
                else
                {
                    wnMatlab = wpMatlab;
                }
                break;

            case FilterType.Bandpass:
                fpassandFstop[0] = fpass1 / (fs / 2);
                fpassandFstop[1] = fstop1 / (fs / 2);
                fpassandFstop[2] = fpass2 / (fs / 2);
                fpassandFstop[3] = fstop2 / (fs / 2);
                Array.Sort(fpassandFstop);
                frange[0]  = fpassandFstop[1];
                frange[1]  = fpassandFstop[2];
                wpMatlab   = frange;
                frange[0]  = fpassandFstop[0];
                frange[1]  = fpassandFstop[3];
                wsMatlab   = frange;
                typeMatlab = "bandpass";
                if (mode == DesignMethod.InvChebyshev)
                {
                    wnMatlab = wsMatlab;
                }
                else
                {
                    wnMatlab = wpMatlab;
                }
                break;

            case FilterType.Bandstop:
            default:
                fpassandFstop[0] = fpass1 / (fs / 2);
                fpassandFstop[1] = fstop1 / (fs / 2);
                fpassandFstop[2] = fpass2 / (fs / 2);
                fpassandFstop[3] = fstop2 / (fs / 2);
                Array.Sort(fpassandFstop);
                frange[0]  = fpassandFstop[1];
                frange[1]  = fpassandFstop[2];
                wpMatlab   = frange;
                frange[0]  = fpassandFstop[0];
                frange[1]  = fpassandFstop[3];
                wsMatlab   = frange;
                typeMatlab = "stop";
                if (mode == DesignMethod.InvChebyshev)
                {
                    wnMatlab = wpMatlab;
                }
                else
                {
                    wnMatlab = wsMatlab;
                }
                break;
            }

            DSPClass dspTask = new DSPClass();

            switch (mode)
            {
            case DesignMethod.Butterworth:
                resultMatlab = dspTask.Butter(1, waveMatlab, wpMatlab, wsMatlab, rpMatlab, rsMatlab, typeMatlab);
                break;

            case DesignMethod.Elliptic:
                resultMatlab = dspTask.Ellip(1, waveMatlab, wpMatlab, wsMatlab, wnMatlab, rpMatlab, rsMatlab, typeMatlab);
                break;

            case DesignMethod.InvChebyshev:
            default:
                resultMatlab = dspTask.Cheb2(1, waveMatlab, wpMatlab, wsMatlab, wnMatlab, rpMatlab, rsMatlab, typeMatlab);
                break;
            }

            result2D = (double[, ])resultMatlab[0].ToArray();
            result   = new double[result2D.Length];
            Buffer.BlockCopy(result2D, 0, result, 0, result2D.Length * sizeof(double));
            return(result);
        }