编辑:
我正在使用通过i2c与Arduino uno连接的
l2g4200d陀螺仪。以下样品是用arduino采集的,通过串行发送并使用matlab进行绘制。
当传感器稳定时,该图会显示一些不希望的尖峰。 >
如何过滤这些尖峰?
第一种方法:尖峰已衰减但仍然存在...
让我们考虑以下示例,其中有两个快速旋转。假设“快速运动”的频率分量是我将在最终应用程序中处理的频率分量。
下面,信号的离散傅立叶变换
使用此滤波器可以保留信号的主要成分。
尽管不希望的尖峰衰减了三倍,但该图显示出轻微的相移...
并且尖峰仍然存在。如何改善此结果?
。谢谢。
编辑2:
1./2。我正在使用Sparkfun的分线板。您可以在这篇文章中找到使用Arduino和陀螺仪的电路:您可以使用L3G4200D陀螺仪,Arduino和Matlab滚动吗?
我在电路中增加了上拉电阻。我将排除此选项,因为其他传感器通过i2c接口连接,并且它们工作正常。
在陀螺仪的集成电路附近没有安装任何去耦电容器。我正在使用的分线板有(0.1 uF)。请检查下面原理图的左侧,也许我错了。
电动机具有单独的电路,我已将所有组件焊接在原型板上。 br />这很有趣。测试中使用的采样频率为200Hz。将更新频率从200Hz增加到400Hz,使故障增加了一倍。打开页面底部的注释,然后按Ctrl-F
virtual1
#1 楼
您是否尝试过中值滤波?这种非线性技术适用于抵消尖峰的存在,同时保留输入信号的高频内容。
#2 楼
您提供了部件号和协议,但是您可以提供电路图中如何安装的示意图吗?
您在使用模块还是单个芯片?
是全部焊接在一起还是连接在面包板上?
这是放在桌子上还是类似的东西上,或者实际上是在四轴飞行器机身上?四轴飞行器电动机正在运行吗?
您使用的采样率是多少?
我问,因为尖峰看起来太大了,以至于“只是”噪声。然后,我对故障排除的想法将是解决尖峰的根本原因,而不是尝试从输出中将其过滤掉。我能想到的潜在问题与我要问的问题有关,所以对于我问的每个问题,我都认为可能是:
可能是电源问题或通讯线路问题。原理图上需要注意的事情:(A)检查电源电压是否确实在2.4-3.6V的允许输入范围内(第11页); (B)检查去耦电容器是否已安装并连接到合适的电压; (C)检查是否安装了I2C上拉电阻; (D)检查电路中还安装了什么其他大型设备(阅读:电动机),并检查电源是否能够提供峰值电流。
再次,检查电容器是否去耦,以及是否正确焊接;在模块上,所有东西都可以正确焊接,但不包括上拉电阻。同样,面包板连接意味着系统可能无法牢固地连接到任何东西。
虽然不太可能,但松动的芯片/模块可能会受到某些振动的影响(可能来自附近的扬声器),这可以解释峰值。如果电动机正在运行,则可能性更大。另外,电动机可能会使您的电源消耗掉,从而给陀螺仪造成问题。
这主要是一个好奇心问题,但是更高的通信速率往往会导致/加剧问题。
我想这可能是电源电压问题,无论是直接给芯片还是在通信线路上,但同样,它们都是黑暗中的镜头,没有更多信息。
:编辑:
在发布的链接OP中,有此注释/答案:
所做的工作是在设置它读取A8和28寄存器,然后进行比较。如果它们不同,请再次阅读!似乎已经解决了我100%的故障。现在,我可以进行和平校准了。
,再加上其他有类似问题的用户,我会认为这是有缺陷的芯片设计。如果您评估数据,并且当出现此故障时最低有效字节实际上始终为255,那么您始终可以仅检查该条件并忽略该样本,或者将先前的读数替换为当前读数,或者执行以下操作由其他网站上的“ virtual1”建议。我会避免将其设置为零,因为如果在实际数据有效的情况下得到尖峰,这可能会导致“反向毛刺”。
评论
$ \ begingroup $
请参阅EDIT2。我感谢您的帮助!
$ \ endgroup $
– UserK
15-10-23在14:16
$ \ begingroup $
好的,这似乎是解决问题的唯一方法。忽略@Brian Lynch建议的不需要的数据。最后一个问题。是否存在基于频率的方法来仅选择尖峰,因为它们始终具有相同的特性?
$ \ endgroup $
– UserK
2015年10月23日在17:50
$ \ begingroup $
非常感谢Chuck。我会接受您的回答,但首先我需要“实施”解决方案。
$ \ endgroup $
– UserK
15-10-23在17:58
$ \ begingroup $
@UserK-我不确定您所说的“基于频率的方法”是什么意思,但是尖峰不会按我可以告诉的规则间隔或规律发生,所以我认为最好的选择是看一下通过仅评估255的最低有效字节或通过比较外部建议的A8和28寄存器为virtual1来确定是否出现尖峰信号。
$ \ endgroup $
–卡盘
15-10-23在18:09
$ \ begingroup $
我认为virtual1的建议更“防弹”,因为它通过比较寄存器并重新轮询设备来检测已验证的错误。如果输出为3个字节长,则忽略LSB中255的每个结果意味着您最多忽略2 ^(8 + 8)= 65,536个可能有效的输出。如果您要做的只是在LSB为255的情况下重新轮询设备,并且该值有效,则可以连续不断地重新轮询设备。
$ \ endgroup $
–卡盘
15-10-23在18:10
#3 楼
一种选择是利用指数移动平均线。下图显示了平均值为零,方差为0.4的高斯噪声破坏的数据,以及滤波器如何出色地去除尖峰噪声数据。x = -pi:0.01:2*pi;
perfectY = cos(x); % generate data
noisyY = perfectY + .4 * randn(1, length(perfectY)); % corrupt data by noise
a = 0.13; % tuning parameter
preSmoothY = cos(-pi); % arbitrary initial value
for i = 1:length(noisyY)
Smooth = (1-a)*preSmoothY + a*noisyY(i);
preSmoothY = Smooth;
expY(i) = Smooth;
end
plot( x,noisyY,'g', x, expY,'r', 'LineWidth', 2)
hold on
plot(x, perfectY, 'b','LineWidth', 2)
grid on
legend('noisy data', 'filtered data', 'data')
另一个选择是使用卡尔曼滤波器。如果您满足要求,它是一个最佳的滤波器,这意味着没有一个滤波器可以比Kalman更好地运行。不幸的是,滤波器对信号施加了一些约束,例如线性和高斯性。此外,必须精确描述系统。
评论
您使用的是什么芯片,电路是什么,使用的通信协议是什么,如何测试呢?我可以推测出峰值的原因,但它们都是黑暗中的镜头,没有更多信息。请看我的编辑
这是个有趣的问题。您是否有任何独立的速度验证,即可以用来计算加速度的编码器,还是可以借以用于剖析的更高分辨率的加速度计?
您是否尝试过简单的中值滤波器?您仍然会得到一些滞后效应。
另一个选择是根据与先前样本的差异忽略那些样本(假设那些尖峰是一个点,没有上下波动)。