77 lines
2.8 KiB
C#
77 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using ScottPlot;
|
|
|
|
namespace 测试Scottplot
|
|
{
|
|
|
|
public class SignalProcessor
|
|
{
|
|
/// <summary>
|
|
/// 将采样数据按周期转换为真有效值并拟合为直流信号
|
|
/// </summary>
|
|
/// <param name="sampledData">采样数据列表</param>
|
|
/// <param name="samplingRate">采样率(Hz)</param>
|
|
/// <param name="signalFrequency">信号频率(Hz)</param>
|
|
/// <returns>每个周期的RMS值列表(直流信号)</returns>
|
|
public static List<double> ConvertToRmsPerPeriod(List<double> sampledData, double samplingRate = 200000, double signalFrequency = 1000)
|
|
{
|
|
if (sampledData == null || sampledData.Count == 0)
|
|
return new List<double>();
|
|
|
|
// 计算每个周期的采样点数
|
|
int samplesPerPeriod = (int)(samplingRate / signalFrequency);
|
|
if (samplesPerPeriod <= 0)
|
|
throw new ArgumentException("采样率必须大于信号频率");
|
|
|
|
// 计算完整周期数
|
|
int completePeriods = sampledData.Count / samplesPerPeriod;
|
|
|
|
List<double> rmsValues = new List<double>(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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 计算直流拟合信号(将RMS值扩展为与原信号相同长度的直流信号)
|
|
/// </summary>
|
|
public static List<double> GenerateDcSignal(List<double> rmsValues, double samplingRate = 200000, double signalFrequency = 1000)
|
|
{
|
|
if (rmsValues == null || rmsValues.Count == 0)
|
|
return new List<double>();
|
|
|
|
int samplesPerPeriod = (int)(samplingRate / signalFrequency);
|
|
List<double> dcSignal = new List<double>();
|
|
|
|
// 将每个RMS值重复samplesPerPeriod次以生成直流信号
|
|
foreach (var rms in rmsValues)
|
|
{
|
|
dcSignal.AddRange(Enumerable.Repeat(rms, samplesPerPeriod));
|
|
}
|
|
|
|
return dcSignal;
|
|
}
|
|
|
|
private static double CalculateTrueRms(List<double> 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);
|
|
}
|
|
}
|
|
}
|