Files

163 lines
5.5 KiB
C#
Raw Permalink Normal View History

2026-01-16 19:25:21 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
formsPlot1.Plot.Clear();
// 生成测试信号 - 200KHz采样率下的1kHz正弦波(带噪声)
double sampleRate = 200000; // 200 kHz 采样率
double frequency = 200000; // 1 kHz 实际信号频率
Random rand = new Random();
List<double> sampledData = new List<double>();
sampledData= GenerateSineWave();
formsPlot1.Plot.Title("BackTemperatur vs. Time");
formsPlot1.Plot.XLabel("Times(s)");
formsPlot1.Plot.YLabel("Voltage(V)");
double[][] tempReceive = { sampledData.ToArray() };
formsPlot1.Plot.AddSignal(tempReceive[0], sampleRate, Color.Black);
formsPlot1.Plot.AxisAuto();
// 转换为周期RMS值
var rmsValues = SignalProcessor.ConvertToRmsPerPeriod(sampledData, sampleRate, frequency);
double[][] tempReceive2 = { rmsValues.ToArray() };
formsPlot1.Plot.AddSignal(tempReceive2[0], sampleRate, Color.Red);
formsPlot1.Plot.AxisAuto();
// 生成直流拟合信号
dcSignal = SignalProcessor.GenerateDcSignal(rmsValues, sampleRate, frequency);
double[][] tempReceive3 = { dcSignal.ToArray() };
formsPlot1.Plot.AddSignal(tempReceive3[0], sampleRate, Color.Blue);
formsPlot1.Plot.AxisAuto();
formsPlot1.Refresh();
}
List <double> dcSignal = new List<double>();
/// <summary>
/// 生成标准正弦波测试信号
/// </summary>
/// <param name="samplingRate">采样率(Hz)</param>
/// <param name="signalFrequency">信号频率(Hz)</param>
/// <param name="amplitude">振幅</param>
/// <param name="duration">持续时间(秒)</param>
/// <param name="noiseLevel">噪声水平(0-1)</param>
/// <returns>生成的正弦波信号</returns>
public static List<double> GenerateSineWave(
double samplingRate = 200000,
double signalFrequency = 1000,
double amplitude = 1.0,
double duration = 0.1,
double noiseLevel = 0.0)
{
int sampleCount = (int)(samplingRate * duration);
List<double> signal = new List<double>(sampleCount);
Random rand = new Random();
for (int i = 0; i < sampleCount; i++)
{
double time = i / samplingRate;
double value = amplitude * Math.Sin(2 * Math.PI * signalFrequency * time);
// 添加噪声(如果指定)
if (noiseLevel > 0)
{
value += noiseLevel * amplitude * (rand.NextDouble() - 0.5);
}
signal.Add(value);
}
return signal;
}
private void button2_Click(object sender, EventArgs e)
{
double[][] tempReceive2 = { Smoothing(dcSignal, 1000).ToArray() };
// var dcSignaltest= Smoothing(dcSignal,1000);
formsPlot1.Plot.AddSignal(tempReceive2[0], 200000, Color.Green);
formsPlot1.Plot.AxisAuto();
formsPlot1.Refresh();
}
/// <summary>
/// 移动平均,曲线平滑
/// </summary>
/// <param name="rawData">原曲线数据列表</param>
/// <param name="step">步长默认3</param>
/// <returns>平滑后的数据列表</returns>
public List<double> Smoothing(List<double> rawData, int step)
{
if (rawData == null || rawData.Count == 0)
return new List<double>();
List<double> smooth = new List<double>(new double[rawData.Count]);
for (int i = step; i < rawData.Count; i++)
{
double total = 0;
int count = 0;
// 计算当前点前后step范围内的平均值
for (int j = i - step; j <= i + step; j++)
{
if (j >= 0 && j < rawData.Count)
{
total += rawData[j];
count++;
}
}
smooth[i] = total / count;
}
// 填充头部数据前step个点
for (int i = 0; i < step; i++)
{
smooth[i] = smooth[step];
}
// 填充尾部数据
int tailStart = rawData.Count - (rawData.Count % (step + 1)) - 1;
for (int j = tailStart; j < rawData.Count; j++)
{
smooth[j] = smooth[tailStart - 1];
}
return smooth;
}
Stopwatch stopwatch = new Stopwatch();
private void button3_Click(object sender, EventArgs e)
{
stopwatch.Restart();
//stopwatch.Start();
Thread.Sleep(100);
stopwatch.Stop();
MessageBox.Show("耗时:" + stopwatch.Elapsed.TotalMilliseconds.ToString() + "ms");
}
private void button4_Click(object sender, EventArgs e)
{
}
}
}