163 lines
5.5 KiB
C#
163 lines
5.5 KiB
C#
|
|
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)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|