Files
LaserFlashTesterControl/测试Scottplot/SignalProcessor.cs
2026-01-16 19:20:19 +08:00

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