3

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

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

我读过DSP Guide,但我没有从中得到太多。是否有专门针对程序员而非Mathcad工程师的教程?是否有一些简单的代码片段可以提供帮助?

更新:经过几次电子表格测试后,我决定记录所有样本,并应用巴特沃斯过滤器

4

4 回答 4

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;
}

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

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

于 2009-08-29T15:45:50.263 回答
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。

I mention all this because it doesn't sound like "filtering" is really what you want to do here. I think you just want to display the current value of your sensor, but you want to smooth out the results so that it doesn't respond excessively to transient fluctuations in the sensor's measured value. The best way to do this is with a simple running average, possibly with the more recent values weighted more heavily than older values.

A running average is very easy to program (much easier than FFT, trust me) by storing a collection of the most recent measurements. You mention that your app only stores values that are different from the prior value. Assuming you also store the time at which each value is recorded, it should be easy for your running average code to fill in the "missing values" by using the recorded prior values.

于 2009-08-29T15:46:17.063 回答
2

我没有可以帮助您的教程,但在 C# 中您可能需要考虑使用 Reactive LINQ - 请参阅博客文章Reactive programming (II.) - Introducing Reactive LINQ

作为获取事件的一种方式,因此您可以在不必存储所有值的情况下进行处理,它只会在您进入下一个事件时进行处理。

要考虑时间,您可以只使用带有负指数的指数来减少过去测量的影响。

于 2009-08-29T15:24:03.740 回答
-1

Yes, for complex real-time systems sampling multiple streams of data, there could be an issue in the data processing (calculation and storage of data) and data consistency.

于 2011-02-24T21:36:15.887 回答