public bool PSD; // whether convert to power spectral density. public UnitConvSetting(SpectrumUnits unit = SpectrumUnits.dBV, PeakScaling peakScaling = PeakScaling.Rms, double impedance = 50.00, bool psd = false) { Unit = unit; PeakScaling = peakScaling; Impedance = impedance; PSD = psd; }
/// <summary> /// <para>Computes the power spectrum of input time-domain signal.</para> /// <para>Chinese Simplified: 计算输入信号的功率频谱。</para> /// </summary> /// <param name="waveform"> /// <para>input time-domain signal.</para> /// <para>Chinese Simplified: 输入的时域波形。</para> /// </param> /// <param name="samplingRate"> /// <para>sampling rate of the input time-domain signal, in samples per second.</para> /// <para>Chinese Simplified: 输入信号的采样率,以S/s为单位。</para> /// </param> /// <param name="spectrum"> /// <para>output sequence containing the power spectrum.</para> /// <para>Chinese Simplified: 输出功率谱。</para> /// </param> /// <param name="df"> /// <para>the frequency resolution of the spectrum, in hertz.</para> /// <para>Chinese Simplified: 功率谱的频谱间隔,以Hz为单位。</para> /// </param> /// <param name="unit"> /// <para>unit of the output power spectrum</para> /// <para>Chinese Simplified: 设置功率谱的单位。</para> /// </param> /// <param name="windowType"> /// <para>the time-domain window to apply to the time signal.</para> /// <para>Chinese Simplified: 窗类型。</para> /// </param> /// <param name="windowPara"> /// <para>parameter for a Kaiser/Gaussian/Dolph-Chebyshev window, If window is any other window, this parameter is ignored</para> /// <para>Chinese Simplified: 窗调整系数,仅用于Kaiser/Gaussian/Dolph-Chebyshev窗。</para> /// </param> /// <param name="PSD"> /// <para>specifies whether the output power spectrum is converted to power spectral density.</para> /// <para>Chinese Simplified: 输出的频谱是否为功率谱密度。</para> /// </param> public static void PowerSpectrum(double[] waveform, double samplingRate, ref double[] spectrum, out double df, SpectrumUnits unit = SpectrumUnits.V2, WindowType windowType = WindowType.Hanning, double windowPara = double.NaN, bool PSD = false) { int spectralLines = spectrum.Length; //谱线数是输出数组的大小 SpectralInfo spectralInfo = new SpectralInfo(); AdvanceComplexFFT(waveform, spectralLines, windowType, spectrum, ref spectralInfo); double scale = 1.0 / spectralInfo.FFTSize; CBLASNative.cblas_dscal(spectralLines, scale, spectrum, 1); df = 0.5 * samplingRate / spectralInfo.spectralLines; //计算频率间隔 //Unit Conversion UnitConvSetting unitSettings = new UnitConvSetting(unit, PeakScaling.Rms, 50.00, PSD); UnitConversion(spectrum, df, SpectrumType.Amplitude, unitSettings, Window.WindowENBWFactor[(int)windowType]); }