Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的简单信号处理#_C#_Signal Processing - Fatal编程技术网

C# C语言中的简单信号处理#

C# C语言中的简单信号处理#,c#,signal-processing,C#,Signal Processing,我正在对一个真实世界的传感器进行采样,我需要显示它的过滤值。信号以10Hz的频率采样,在此期间,信号可能会上升到最大范围的80% 前面我使用均方根作为过滤器,并将其应用于我记录的最后五个值。对于这个应用程序来说,这不太好,因为我不存储未更改的值。换句话说,我需要考虑过滤器中的时间……/P> 我读过,但没从中得到什么。有专门针对程序员而不是工程师的教程吗?是否有一些简单的代码片段可以帮助您 Update:经过几次电子表格测试后,我执行了执行所有日志的执行决定,并应用了.< /P> < P>我没有教

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

前面我使用均方根作为过滤器,并将其应用于我记录的最后五个值。对于这个应用程序来说,这不太好,因为我不存储未更改的值。换句话说,我需要考虑过滤器中的时间……/P> 我读过,但没从中得到什么。有专门针对程序员而不是工程师的教程吗?是否有一些简单的代码片段可以帮助您


Update:经过几次电子表格测试后,我执行了执行所有日志的执行决定,并应用了.< /P> < P>我没有教程可以帮助您,但是在C语言中,您可能需要考虑使用活动LINQ——请参阅博客文章。< /P> 作为获取事件的一种方式,您可以在不必存储所有值的情况下进行处理,它只需在中获取下一个事件时进行处理


考虑时间,你可以使用一个负指数的指数来减少过去测量的影响。

你总是需要存储一些值(但不一定)。 所有输入值)。滤波器的电流输出取决于 输入值的数量,可能还有一些过去的输出值

最简单的滤波器是一阶巴特沃斯低通滤波器 过滤器。这只需要存储一个过去的输出 价值滤波器的(电流)输出y(n)为:

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

其中x(n)为当前输入,y(n-1)为前一输入 滤波器的输出。a1取决于截止频率 以及采样频率。截止频率 必须小于5Hz(采样频率的一半), 足够低以滤除噪音,但不太低 输出将相对于输入延迟。及 当然不会太低,以至于真正的信号被过滤掉

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

double a1=0.57//0.57只是一个示例值。
双拉丝=0.0;
while(true)
{
双x=;
双y=x-a1*整形;
lastY=y;
}
一阶过滤器是否足够取决于您的 输入信号的要求和特性(a 高阶滤波器可能能够抑制更多的噪声 噪声(以输出信号的更高延迟为代价)

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

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

要“过滤”这些数据,您可以增加或减少任何或所有这些信号强度值,然后执行反向FFT将这些值转换回时域信号。例如,假设您想对转换后的数据进行低通滤波,其中截止频率为6 Hz(换句话说,您想去除信号中高于6 Hz的任何频率分量)。您可以通过编程将6-8 Hz值设置为零,将8-10 Hz值设置为0,然后进行反向FFT

我之所以提到这些,是因为听起来“过滤”并不是你真正想要做的。我想你只是想显示你的传感器的当前值,但是你想平滑结果,这样它就不会对传感器测量值的瞬时波动做出过度反应。最好的方法是使用一个简单的运行平均值,可能是使用较新的值比较旧的值权重更大


通过存储最新测量值的集合,运行平均值很容易编程(相信我,比FFT容易得多)。您提到您的应用程序只存储与先前值不同的值。假设您还存储了记录每个值的时间,运行平均值代码应该可以很容易地使用记录的先前值来填充“缺失值”。

是的,对于采样多个数据流的复杂实时系统,数据处理(数据的计算和存储)中可能存在问题和数据一致性。

因此,仅计算最后五个值的问题在于,由于未记录未更改的数据,它们不能反映实时性?我理解正确吗?+1的链接,似乎是一个非常好的主意。然而,这似乎有点脱离了他的实际问题。。。对我来说,他的主要问题似乎是,他只存储变化,而不存储随时间变化的信号,在进行计算时,他需要后者。存储时间或更改日志本身可能就足够了。他似乎想保留一个值,但要向其中添加时间,需要先减小值,然后再添加新值。随着时间的推移,这将更多地减少旧值,并且通过使用反应式linq,他可以更好地拥有一种算法来满足他的需要。你是对的,我不想弄乱FFT。我不介意数学或其他任何东西,但当我看到FFT实现(或函数)时,我会感到一阵寒意。一旦你经历了最初的痛苦,这真的很有趣,它为你打开了很多大门
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;
}