Files
2026-01-16 19:25:21 +08:00

163 lines
5.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
{
}
}
}