guxingganyue 发表于 2013-4-11 14:01:09

讨论一个类似正弦波波峰个数单片机统计算法!!!!!!

本帖最后由 guxingganyue 于 2013-4-11 14:23 编辑

这个波峰统计的帖子上次我已经发过了:http://www.amobbs.com/forum.php?mod=viewthread&tid=5512859

但上次是要用硬件电路来实现,折腾了好久效果都不是很好,现在改为了用单片机AD采集后分析波形,再得出波峰个数。

单片机:msp430f5438a
系统频率:使用外部20M晶振
AD参数:5M频率,200ksps,12位模式
参考电压:用AVCC=3.3v(注:输入AD的最大电压不会超过3V)

简单描述:某按键按下后ad开始采样(在定时器中以N毫秒(时间待定)为间隔连续采样),按键松开后ad停止采样。按键松开后在很短的时间(1秒内)内显示出ad采样的数据中波峰的个数。
          ad采样后的数据直接存到数组buffer0和buffer1中,buffer0存满后就存到buffer1中,如果数据分析比较慢的话,ad有可能把上次的数据覆盖,这个问题暂时不考虑。


下面是我得到的一些数据和把该数据导入到excel中生成的波形,哪位有好的算法能正确的统计出波峰的个数。

我的思路:先存一次数据到数组中,后面采集的数据和上一次存储的数据做比较,如果一样则丢掉本次的数据,不一样的话把本次的数据存到数组中的下一个数据(如buffer0),当数组中存满1024个数据后我再分析:

如果buffer0>buffer0,则把buffer0中的数据放到一个变量max中,再把buffer0和max相比较,如果buffer>max则把buffer中的数据存到max中;如果buffer比max小,则把buffer放到一个变量min中;再把buffer和min做比较,如果buffer比min小则把buffer放到min中,如果buffer比min大,则把buffer放大max中,波峰个数加1。依次类推直到比较完这1024个数据。这里再加一个去出毛刺的判断,即max中的数据比min中的数据大于K(这个值可以调整)后才算是一个波形。


1、比较好的波形1和数据(10进制格式)





2、比较好的波形2和数据(10进制格式)



3、波形很差、数据(10进制格式)


guxingganyue 发表于 2013-4-11 17:45:27

沙发自己做

ShuJi187 发表于 2013-4-11 17:52:16

降低采样频率(滤波)!

guxingganyue 发表于 2013-4-12 09:02:59

在来点波形

welcome_cool 发表于 2013-4-12 10:01:20

有奇点的情况不行吧。所以还得判断波峰波谷之间的采样点数。
最好先做一个低通滤波。

asma 发表于 2013-4-12 10:16:22

你先得说说 峰值要满足什么条件,比如间隔,幅度值,频率啥的。

guxingganyue 发表于 2013-4-12 15:49:04

asma 发表于 2013-4-12 10:16 static/image/common/back.gif
你先得说说 峰值要满足什么条件,比如间隔,幅度值,频率啥的。

看1楼、4楼的图片即可。大的波峰肯定算,但小的波峰有的算,有的不算。

winster321 发表于 2013-4-13 22:47:26

先做简单低通滤波,然后前后两点相减做差分,找负向过零点个数?

hhxb 发表于 2013-4-13 23:23:43

{:titter:}有偿提供代码

guxingganyue 发表于 2013-4-14 13:02:16

hhxb 发表于 2013-4-13 23:23 static/image/common/back.gif
有偿提供代码

呵呵,可以先发你几个波形试试

TANK99 发表于 2013-4-14 21:17:15

先滤波,整理出大体与采样数据趋势一致,变化平滑,然后再数 上升&下降的个数就可以了。

wugang_1213 发表于 2013-4-14 22:42:43

对的,先滤波。

huzhen816 发表于 2013-4-15 12:38:10

图3那种情况好像是需要信号放大

guxingganyue 发表于 2013-4-15 20:06:06

TANK99 发表于 2013-4-14 21:17 static/image/common/back.gif
先滤波,整理出大体与采样数据趋势一致,变化平滑,然后再数 上升&下降的个数就可以了。 ...

不是很灵
有的可以,有的不可以啊

电源模块 发表于 2013-4-15 20:36:42

不管软件硬件,首先要有一个明确的界定条件。“小的波峰有的算,有的不算”,你打算用个随机程序来做选择?另外大的小的也是相对说法,这样的要求没法做成可靠的软硬件,只能做成“模糊”控制的{:lol:}

最大值定义,可以参考高数里面导数部分的极值的内容,有明确的定义,很容易转换成程序或者硬件

电源模块 发表于 2013-4-15 20:38:34

比如你4楼的图,3和4之间有个小波峰,2比他大不了多少,凭什么2就算,3、4之间那个就不算?程序如何判定?

TANK99 发表于 2013-4-16 19:34:35

这个貎似在数节拍。

zhangsusu 发表于 2013-4-17 09:50:46

滑动平均+Peak Search Peac Search 做个过过零检测做保证

lyz1900 发表于 2013-4-17 13:50:36

波形有点像线性ccd。。是不是啊?

guxingganyue 发表于 2013-4-17 19:34:31

lyz1900 发表于 2013-4-17 13:50 static/image/common/back.gif
波形有点像线性ccd。。是不是啊?

一种光学传感器上出来的,没有放大等

guxingganyue 发表于 2013-4-17 19:34:47

zhangsusu 发表于 2013-4-17 09:50 static/image/common/back.gif
滑动平均+Peak Search Peac Search 做个过过零检测做保证

多谢,我试试

lixin91985 发表于 2013-4-17 20:31:31

我怎么感觉像是医疗检测设备上的数细胞。

个人感觉用比较高的采样率(需根据实际情况定)。每次采样得到的数据相同的丢弃。计算当前点斜率。。斜率的每次过零 就是一个波谷或波峰。至于这两个怎么分别 温习下高中功课。

zhangsusu 发表于 2013-4-17 21:22:30

guxingganyue 发表于 2013-4-17 19:34 static/image/common/back.gif
多谢,我试试

处理前先求平均值 把直流分量滤掉 处理起来效果好些

guxingganyue 发表于 2013-4-18 09:22:29

lixin91985 发表于 2013-4-17 20:31 static/image/common/back.gif
我怎么感觉像是医疗检测设备上的数细胞。

个人感觉用比较高的采样率(需根据实际情况定)。每次采样得到的 ...

嗯,现在大概就是这么数的

但不是很准确,有的小波峰多数或少数了

lixin91985 发表于 2013-4-18 09:36:26

guxingganyue 发表于 2013-4-18 09:22 static/image/common/back.gif
嗯,现在大概就是这么数的

但不是很准确,有的小波峰多数或少数了

那就设置一个斜率的连续两个波峰之间的最小变化量。

guxingganyue 发表于 2013-4-18 11:26:17

lixin91985 发表于 2013-4-18 09:36 static/image/common/back.gif
那就设置一个斜率的连续两个波峰之间的最小变化量。

我现在判断极值点左右两个点的大小

TANK99 发表于 2013-4-18 20:46:35

这个需要峰值点的数据有平滑度,否则简单的比较可能会受数据小扰动的干扰,一定是先滤成一个平滑的波。

guxingganyue 发表于 2013-4-18 22:19:43

TANK99 发表于 2013-4-18 20:46 static/image/common/back.gif
这个需要峰值点的数据有平滑度,否则简单的比较可能会受数据小扰动的干扰,一定是先滤成一个平滑的波。 ...

其实不滤波也行,关键是要有一个波峰的趋势就行

significance201 发表于 2013-4-18 22:34:26

sf
yige .........

ak5136728 发表于 2013-8-14 10:28:51

楼主问题解决了 ? 分享下解决经验啊!感谢了

guxingganyue 发表于 2013-8-14 11:27:56

ak5136728 发表于 2013-8-14 10:28 static/image/common/back.gif
楼主问题解决了 ? 分享下解决经验啊!感谢了

还没有呢,还在研究中

你怎么也对这个敢兴趣?

ren0214 发表于 2013-8-14 13:02:32

可以考虑小波分析或傅立叶变换。

gongxd 发表于 2013-8-14 13:08:39

先做包络线 再算就方便了

ak5136728 发表于 2013-8-14 16:26:52

guxingganyue 发表于 2013-8-14 11:27 static/image/common/back.gif
还没有呢,还在研究中

你怎么也对这个敢兴趣?

   嗯 ,感兴趣,最近有个项目也要测这个,很麻烦

清雨影 发表于 2013-8-14 16:53:06

我有方案,有偿代码,QQ,1763509044。

guxingganyue 发表于 2013-8-14 19:56:03

ren0214 发表于 2013-8-14 13:02 static/image/common/back.gif
可以考虑小波分析或傅立叶变换。

数据要实时的采集,分析。

我现在用的单片机是430,5438A。想把数据存下来后分析,没那么大地方

换其他单片机也可以,但要考虑功耗,毕竟是一个手势设备。



这个单片机做这些分析估计来不及吧

guxingganyue 发表于 2013-8-14 19:59:12

清雨影 发表于 2013-8-14 16:53 static/image/common/back.gif
我有方案,有偿代码,QQ,1763509044。

算法复杂吗?

非常复杂的话就行了

guxingganyue 发表于 2013-8-14 19:59:59

ak5136728 发表于 2013-8-14 16:26 static/image/common/back.gif
嗯 ,感兴趣,最近有个项目也要测这个,很麻烦

那可以一起研究研究

hendry 发表于 2013-8-14 21:58:22

这个应该不难,再次提供个思路仅供参考:

1. 对输入信号做快速傅里叶变换(FFT), 找出峰值频率f0
2. 以f0为中心频率,对输入信号进行带通滤波
3. 滤波后的信号在时域里求差分,数出差分信号的过零点个数,即可求解

hhxb 发表于 2013-8-15 00:18:22

本帖最后由 hhxb 于 2013-8-15 00:20 编辑

看了一些数据

我个人觉得,很明显楼主的方案或者说传感器有问题,人都不一定能数准,更何况机器

guxingganyue 发表于 2013-8-15 09:17:19

hendry 发表于 2013-8-14 21:58 static/image/common/back.gif
这个应该不难,再次提供个思路仅供参考:

1. 对输入信号做快速傅里叶变换(FFT), 找出峰值频率f0


关键是这个波形的带宽不是一定的,它有的宽点,有的窄。没有一个合适的范围

hendry 发表于 2013-8-15 11:50:55

guxingganyue 发表于 2013-8-15 09:17 static/image/common/back.gif
关键是这个波形的带宽不是一定的,它有的宽点,有的窄。没有一个合适的范围 ...

你说的 "关键是这个波形的带宽不是一定的,它有的宽点,有的窄",   意思是说这个波形的宽度(即周期)是变化的吧,这正是要进行 FFT 的原因啊,
如果是固定的,这步骤就可以省了,直接从步骤2开始即可。

步骤1的作用就是求取周期波形的宽度(即周期)

hendry 发表于 2013-8-15 11:54:42

回复以后,我大概理解楼主的意思了:”关键是这个波形的带宽不是一定的,它有的宽点,有的窄“
楼主的意思是说,在一次计算中,波形的宽度不是恒定的,是吧。
波形宽度变化范围,实际反映的是带宽滤波器的通带带宽,滤波时,可以将带宽适当设宽点。

guxingganyue 发表于 2013-8-15 12:43:29

hendry 发表于 2013-8-15 11:54 static/image/common/back.gif
回复以后,我大概理解楼主的意思了:”关键是这个波形的带宽不是一定的,它有的宽点,有的窄“
楼主的意思 ...

宽了以后噪声如何剔除呢?


比如说下面的波形:

hendry 发表于 2013-8-15 18:56:34

guxingganyue 发表于 2013-8-15 12:43 static/image/common/back.gif
宽了以后噪声如何剔除呢?




楼主可以将本图中的原始数据发上来,我按照我发布的思路处理一下,然后将处理结果公布出来。

俗话说,百闻不如一见,是否可行一试便知。

Friendz 发表于 2013-8-15 22:39:50

楼主应该模拟数字结合起来做, 先用带通滤波,把想要的特征峰搞明显,再A/D,再数字处理。

特征频率如果不确定,就要FFT,很费劲了。

条条大路通罗马, 感觉楼主还要多加把劲,博采众长才行。

ak5136728 发表于 2013-8-16 09:10:20

hendry 发表于 2013-8-14 21:58 static/image/common/back.gif
这个应该不难,再次提供个思路仅供参考:

1. 对输入信号做快速傅里叶变换(FFT), 找出峰值频率f0


数学算法 大家都应该都能想的出来
关键是如果用单片机去算这些量的话估计不现实,计算量太大了点。

1066950103 发表于 2015-5-15 12:01:02

楼主怎么样啦! 求经验分享

zhonghua_li 发表于 2015-5-15 14:22:55

楼主,你先把你的界定条件所清楚,我告诉你方法。
页: [1]
查看完整版本: 讨论一个类似正弦波波峰个数单片机统计算法!!!!!!