固定点的简单低通滤波器

猫爱爵士

我有一个简单的电路设置,可以通过LDR将光水平读取到Arduino中。我正在尝试为读取的数据实现一个简单的低通滤波器。鉴于analogRead()返回一个无符号整数,如何最好地解决这个问题。

我试图实现一个简单的定点表示,但是不确定这是否正确。

这是一个代码片段:

#define WLPF 0.1
#define FIXED_SHIFT 4

ldr_val = ((int)analogRead(A0)) << FIXED_SHIFT;
 while (true) {
    int newval = (int)analogRead(A0) << FIXED_SHIFT;
    ldr_val += WLPF*(newval - ldr_val);
    Serial.println(ldr_val >> FIXED_SHIFT, DEC);
}

请注意,ADC的分辨率为10位,而我正在使用8位Arduino Micro。

克利福德

在没有FPU的设备上,然后乘以0.1(无论如何使它成为浮点而不是固定点的实现),您应该除以10:

#define WLPF_DIV 10

...

ldr_val += (newval - ldr_val) / WLPF_DIV;

但是,在8位处理器上进行除法通常很昂贵(尽管可能与Serial.println()循环中的执行时间相形见--但这是一个不同的问题)。取而代之的是,选择2的幂可以更有效地进行除法运算。

#define WLPF_SHIFT 3  // divide by 8

...

ldr_val += (newval - ldr_val) >> WLPF_SHIFT ;

int由于带符号类型的右移是未定义的行为,因此使用带符号是有问题的。在这种情况下,可以通过将代码更改为:

#define WLPF_DIV 8

... 

ldr_val += (newval - ldr_val) / WLPF_DIV ;

无论如何,编译器很可能会发现2的幂,并使用算术右移来生成代码。但是,您可能最好重新考虑数据类型。

您仍然可以在Serial.println()通话中右移,但也可以用16分频代替:

#define WLPF_DIV 8
#define FIXED_MUL  16

ldr_val = (int)analogRead(A0) * FIXED_MUL  ;

for(;;)
{
    int newval = (int)analogRead(A0) * FIXED_MUL ;
    ldr_val += (newval - ldr_val) / WLPF_DIV 
    Serial.println(ldr_val / FIXED_MUL, DEC);
}

在每个样本的基础上,不确定的数据输出并不能构成一个非常精确的滤波器,在任何情况下,它都将主导时序,因此您几乎无法控制频率响应,并且它将不稳定。这也使先前的性能优化变得毫无意义。您可能想考虑一下它是否对您的应用程序很重要-但这是一个不同的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

应用低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

FPGA的低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

在音频上使用低通滤波器

来自分类Dev

使用fft的Matlab低通滤波器

来自分类Dev

OpenCL中的低通滤波器

来自分类Dev

Python中的低通滤波器

来自分类Dev

低通滤波器和采样频率

来自分类Dev

C中的低通滤波器

来自分类Dev

低通滤波器不起作用

来自分类Dev

如何创建没有舍入误差的简单IIR低通滤波器?(16位pcm数据)

来自分类Dev

C中的定点FIR滤波器?

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

MATLAB中的低通滤波器返回NaN值

来自分类Dev

优化低通滤波器平滑代码以进行活动识别

来自分类Dev

Matlab-在系统上使用低通滤波器

来自分类Dev

IIR低通滤波器在C ++中的实现

来自分类Dev

在Python中表示低通滤波器时的直线

来自分类Dev

将SOX低通滤波器与插孔配合使用

来自分类Dev

使用Pulseaudio在LFE上进行低通滤波器

来自分类Dev

在Matlab中设计一个低通滤波器

来自分类Dev

具有低通滤波器的脱机渲染会导致混叠和剪切

来自分类Dev

在SciPy中创建低通滤波器-了解方法和单位

来自分类Dev

关于在Matlab中使用'butter'功能的低通滤波器的问题

来自分类Dev

使用双线性方法将低通滤波器应用于信号-MATLAB

来自分类Dev

低通滤波器从熊猫数据框中获取数据的二阶导数