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