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