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 sampledData = new List(); 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 dcSignal = new List(); /// /// 生成标准正弦波测试信号 /// /// 采样率(Hz) /// 信号频率(Hz) /// 振幅 /// 持续时间(秒) /// 噪声水平(0-1) /// 生成的正弦波信号 public static List 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 signal = new List(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(); } /// /// 移动平均,曲线平滑 /// /// 原曲线数据列表 /// 步长(默认3) /// 平滑后的数据列表 public List Smoothing(List rawData, int step) { if (rawData == null || rawData.Count == 0) return new List(); List smooth = new List(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) { } } }