using System; using System.Collections.Generic; using System.Linq; using System.Text; using ScottPlot; namespace 测试Scottplot { public class SignalProcessor { /// /// 将采样数据按周期转换为真有效值并拟合为直流信号 /// /// 采样数据列表 /// 采样率(Hz) /// 信号频率(Hz) /// 每个周期的RMS值列表(直流信号) public static List ConvertToRmsPerPeriod(List sampledData, double samplingRate = 200000, double signalFrequency = 1000) { if (sampledData == null || sampledData.Count == 0) return new List(); // 计算每个周期的采样点数 int samplesPerPeriod = (int)(samplingRate / signalFrequency); if (samplesPerPeriod <= 0) throw new ArgumentException("采样率必须大于信号频率"); // 计算完整周期数 int completePeriods = sampledData.Count / samplesPerPeriod; List rmsValues = new List(completePeriods); // 对每个完整周期计算RMS值 for (int i = 0; i < completePeriods; i++) { int startIndex = i * samplesPerPeriod; var periodSamples = sampledData.Skip(startIndex).Take(samplesPerPeriod).ToList(); double rms = CalculateTrueRms(periodSamples); rmsValues.Add(rms); } return rmsValues; } /// /// 计算直流拟合信号(将RMS值扩展为与原信号相同长度的直流信号) /// public static List GenerateDcSignal(List rmsValues, double samplingRate = 200000, double signalFrequency = 1000) { if (rmsValues == null || rmsValues.Count == 0) return new List(); int samplesPerPeriod = (int)(samplingRate / signalFrequency); List dcSignal = new List(); // 将每个RMS值重复samplesPerPeriod次以生成直流信号 foreach (var rms in rmsValues) { dcSignal.AddRange(Enumerable.Repeat(rms, samplesPerPeriod)); } return dcSignal; } private static double CalculateTrueRms(List samples) { if (samples == null || samples.Count == 0) return 0; double sumOfSquares = samples.Sum(x => x * x); double meanOfSquares = sumOfSquares / samples.Count; return Math.Sqrt(meanOfSquares); } } }