【C#】示波器大数据量取点采样及绘图(波形回放)
一、示波器不同取样方式的选择
示波器的抽取(Decimation)模式-电子工程世界 (eeworld.com.cn)
一般用等间隔采样比较还原波形。
二、控件选择
1、Dev的ChartControl
点数多、曲线多的时候很容易卡顿。
2、TeeChart
3、ScottPlot
C# 使用 ScottPlot.WinForms 实现示波器的波形显示_scottplot的winform案例-CSDN博客
我用ScottPlot5没在工具箱看到FormsPlot控件,用ScottPlot4可以。
三、滤波算法
来源:https://blog.csdn.net/mayuxin1314/article/details/135588501
1、一阶低通滤波算法
低通滤波(Low Pass Filter)用于从一个信号中去除高于某个频率的成分。它的基本原理是,信号中高于某个频率的成分在信号传输或接收过程中会发生衰减,而低于该频率的成分则不受影响。因此,通过将信号通过一个低通滤波器,可以去除高频噪声,保留信号中的低频成分。
一阶低通滤波器是低通滤波的一阶离散形式,用于滤除输入信号中的高频分量,只保留低频分量。它通过减弱高频部分的幅度,从而实现对信号的平滑处理。一阶低通滤波器的基本原理涉及限制信号的变化速率,对快速变化的信号进行衰减,而对缓慢变化的信号保留。
在这个方程中, A越小,时间常数越大,低通滤波器的截止频率就越低,对高频部分的抑制效果就越强。
C#:
/// RC低通滤波 /// </summary> /// <param name="DataArray">数据源</param> /// <param name="fc">截止频率</param> /// <param name="fl">采样频率</param> public static double[] RCLowPass(double[]DataArray,double fc,double fl) { double a = fc * 2 * Math.PI / fl; //滤波系数 double[] result = new double[DataArray.Length]; result[0] = DataArray[0]; for (int i = 1; i < DataArray.Length; i++) { result[i] = a * DataArray[i] + (1 - a) * result[i - 1]; } return result; }
Y(n)= a * X(n) + (1-a) * Y(n-1);
a = (fc*2π) / fl
fc :截止频率
fl :采样频率
经过滤波后,会有相位延迟和幅值衰减,具体如下:
当 f截 = f目标 时,幅值衰减为原幅值的√2/2,相位滞后 45°(滞后点数 = f采/(8*f截))。
当 f截 > f目标时,幅值衰减逐渐减弱,相位滞后:θ=arctan(f目标/fc)。
当 f截 >= 3 * f目标 时。幅值几乎不衰减,相位滞后:θ=arctan(f目标/fc)。
既然是低通滤波就不需要讨论 f截 < f 目标的情况了。
如果不考虑相位与幅值变化的影响,完全可以舍弃 fc 与 fl , 只需要调整滤波系数即可。滤波系数 a (0<a<1)越小曲线越平滑、a越大 曲线越接近原曲线。
代码来源:https://blog.csdn.net/qq_41848097/article/details/106124194
2、一阶高通滤波算法
高通滤波(High Pass Filter)可以滤除信号中的低频部分,保留高频部分。高通滤波器的应用非常广泛,例如在音频处理中可以用来去除低频噪声、在图像处理中可以用来增强图像的边缘等。
高通滤波算法的基本思想是:将信号分解成高频和低频两部分,去掉低频部分,只保留高频部分。高通滤波的实现可以通过频域方法和时域方法两种方式实现。
频域方法是将信号转换到频域进行处理,常用的有傅里叶变换和小波变换等。通过滤波器在频域中滤除低频成分,然后再将信号转换回时域。
时域方法则是通过差分等方式,直接在时域中滤除低频部分。
一阶高通滤波器是高通滤波的一阶差分形式,用于滤除输入信号中的低频分量,同时保留高频分量。高通滤波器的作用是弱化或消除信号中的低频成分,从而突出高频变化或忽略缓慢变化的部分。一阶高通滤波器的设计原理涉及对低频分量进行衰减,保留高频部分。
在这个方程中, A越小,时间常数越大,高通滤波器的截止频率就越低,对低频部分的抑制效果就越弱。
一阶高通滤波器通常应用于需要突出信号中快速变化或高频成分的应用场景。在图像处理、音频处理、传感器信号处理等领域,高通滤波器被广泛用于去除低频噪声或趋势成分。
3、详解 最近邻插值、线性插值、双线性插值
来源:https://blog.csdn.net/qq_39478403/article/details/105796249
(1)最近邻插值 (Nearest Neighbor Interpolation) —— 零阶插值法
上图是一个一维的最近邻插值的示意图,坐标轴上各点 xi-1,xi,xi+1 ... 两两对半等分间隔 (红色虚线划分),从而非边界的各坐标点都有一个等宽的邻域,并根据每个坐标点的值构成一个类似分段函数的函数约束,从而使各插值坐标点的值等同于所在邻域原坐标点的值。例如,插值点 x 坐落于 坐标点 xi 的邻域,那么其值 f(x) 就等于 f(xi)。
上图是一个二维最近邻插值的定量俯视示意图,(x0, y0)、(x0, y1)、(x1, y0)、(x1, y1) 都是原图像上的坐标点,灰度值分别对应为 Q11、Q12、Q21、Q22。而灰度值未知的插值点 (x, y),根据最近邻插值方法的约束,其与坐标点 (x0, y0) 位置最接近 (即位于 (x0, y0) 的邻域内),故插值点 (x, y) 的灰度值 P = Q11。
(2)线性插值 (Linear Interpolation) —— 一阶插值法
上图是一个一维的线性插值的定性示意图,坐标轴上各点 xi-1,xi,xi+1 ... 的值“两两直接相连”为线段,从而构成了一条连续的约束函数。而插值坐标点例如 x,根据约束函数其值应为 f(x)。因为每两个坐标点之间的约束函数曲线是一次线性的线段,对插值结果而言是“线性” 的,所以该方法称为线性插值。
上图是一个一维线性插值的定量示意图,x0 和 x1 都是原有的坐标点,灰度值分别对应为 y0 和 y1。而灰度值未知的插值点 x,根据线性插值法约束,在 (x0, y0) 和 (x1, y1) 构成的一次函数上,其灰度值 y 即为:
实际上,即便 x 不在 x0 与 x1 之间,该公式也成立,但此时这种方法叫 线性外插。
(3)双线性插值 (Bilinear Interpolation) —— 一阶插值法
由一维的线性插值很容易拓展到二维图像的双线性插值,每次需要要经过三次一阶线性插值才能获得最终结果,上图便展示了该过程的一种定性斜视示意图。其中,(x0, y0)、(x0, y1)、(x1, y0)、(x1, y1) 均为原图像上的像素坐标点,灰度值分别对应为 f(x0, y0)、f(x0, y1)、f(x1, y0)、f(x1, y1)。而灰度值未知的插值点 (x, y),根据双线性插值法的约束,可以先由像素坐标点 (x0, y0) 和 (x0, y1) 在 y 轴向作一维线性插值得到 f(x0, y)、由像素坐标点 (x1, y0) 和 (x1, y1) 在 y 轴向作一维线性插值得到 f(x1, y),然后再由 (x0, y) 和 (x1, y) 在 x 轴向作一维线性插值得到插值点 (x, y) 的灰度值 f(x, y)。当然,一维线性插值先作 x 轴向再作 y 轴向,得到的结果完全相同,仅为顺序先后的区别,例如:
上图是一个二维双线性插值的定量俯视示意图 (点位稍有变动但不影响),我们换个顺序。先由像素坐标点 (x0, y0) 和 (x1, y0) 在 x 轴向作一维线性插值得到 f(x, y0)、由像素坐标点 (x0, y1) 和 (x1, y1) 在 x 轴向作一维线性插值得到 f(x, y1):
然后再由 (x, y0) 和 (x, y1) 在 y 轴向作一维线性插值得到插值点 (x, y) 的灰度值 f(x, y):
合并上式,得到最终的双线性插值结果: