C#中的简单信号处理

roz*_*zon 3 c# signal-processing

我正在采样一个真实世界的传感器,我需要显示其过滤值.信号以10 Hz的速率采样,在此期间它可以上升到最大范围的80%.

之前我曾使用均方根作为过滤器,并将其应用于我记录的最后五个值.对于这个应用程序,这不会很好,因为我不存储未更改的值.换句话说,我需要在我的过滤器中考虑时间......

我已经阅读过DSP指南,但我并没有从中获得太多帮助.是否有专门针对程序员的教程,而不是Mathcad工程师?是否有一些简单的代码片段可以提供帮助?

更新:经过多次电子表格测试后,我已采取行政决定记录所有样本,并应用Butterworth过滤器.

Pet*_*sen 6

您始终需要存储一些值(但不一定是所有输入值).滤波器的电流输出取决于许多输入值以及可能的某些过去输出值.

最简单的滤波器是一阶巴特沃斯低通滤波器.这只需要您存储一个过去的输出值.过滤器的(当前)输出y(n)是:

y(n)= x(n) - a1*y(n-1)

其中x(n)是当前输入,y(n-1)是滤波器的先前输出.a1取决于截止频率和采样频率.截止频率频率必须小于5 Hz(采样频率的一半),足够低以滤除噪声,但不能低到输出将相对于输入延迟.当然不是那么低,真实的信号被过滤掉了!

在代码中(主要是C#):

double a1 = 0.57; //0.57 is just an example value.
double lastY = 0.0;
while (true)
{
    double x = <get an input value>;

    double y = x - a1 * lastY;

    <Use y somehow>

    lastY = y;
}
Run Code Online (Sandbox Code Playgroud)

一阶滤波器是否足够取决于您的要求和输入信号的特性(较高阶滤波器可能能够以输出信号的较高延迟为代价来抑制更多噪声).

对于更高阶的滤波器,必须存储更多的值,并且代码变得更复杂一些.通常,值需要以数组的形式向下移动; 在过去的y值的数组和过去的x值的数组中.


Mus*_*sis 5

在DSP中,术语"滤波器"通常是指连续信号内频率分量的放大或衰减(即"降低").这通常使用快速傅里叶变换(FFT)来完成.FFT以在给定时间长度内记录的信号开始(数据在所谓的"时域"内)并将这些值转换为所谓的"频域",其中结果表明信号的强度在一系列中频率"箱"的范围从0 Hz到采样率(在您的情况下为10 Hz).因此,作为一个粗略的例子,一秒钟的数据(10个样本)的FFT将告诉您信号在0-2 Hz,2-4 Hz,4-6 Hz,6-8 Hz和8-10赫兹.

要"过滤"这些数据,您可以增加或减少任何或所有这些信号强度值,然后执行反向FFT将这些值转换回时域信号.因此,例如,假设您想对转换后的数据执行低通滤波器,截止频率为6 Hz(换句话说,您希望将信号中的任何频率成分移除到6 Hz以上).您可以以编程方式将6-8 Hz值设置为零,并将8-10 Hz值设置为0,然后执行反向FFT.

我提到这一切是因为它听起来不像"过滤"真的是你想要做的.我想您只想显示传感器的当前值,但是您希望平滑结果,以便它不会过度响应传感器测量值的瞬态波动.执行此操作的最佳方法是使用简单的运行平均值,可能使更近期的值比旧值更重要.

移动平均值是很容易的程序(比FFT更容易,相信我)通过存储最近一次测量的集合.您提到您的应用仅存储与先前值不同的值.假设您还存储了记录每个值的时间,您的运行平均代码应该很容易通过使用记录的先前值填充"缺失值".

  • 运行平均值*是*过滤器.它是一个简单的过滤器,但仍然是一个过滤器."平滑结果"与移除或降低高频分量完全相同. (2认同)