添加项目文件。
This commit is contained in:
76
测试用/SignalProcessor.cs
Normal file
76
测试用/SignalProcessor.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace 测试用
|
||||
{
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user