搜索
bottom↓
回复: 48

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

[复制链接]

出0入0汤圆

发表于 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[1024]和buffer1[1024]中,buffer0存满后就存到buffer1中,如果数据分析比较慢的话,ad有可能把上次的数据覆盖,这个问题暂时不考虑。


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

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

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


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





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



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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-4-11 17:45:27 | 显示全部楼层
沙发自己做

出0入0汤圆

发表于 2013-4-11 17:52:16 | 显示全部楼层
降低采样频率(滤波)!

出0入0汤圆

 楼主| 发表于 2013-4-12 09:02:59 | 显示全部楼层
在来点波形

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-12 10:01:20 | 显示全部楼层
有奇点的情况不行吧。所以还得判断波峰波谷之间的采样点数。
最好先做一个低通滤波。

出420入0汤圆

发表于 2013-4-12 10:16:22 | 显示全部楼层
你先得说说 峰值要满足什么条件,比如间隔,幅度值,频率啥的。

出0入0汤圆

 楼主| 发表于 2013-4-12 15:49:04 | 显示全部楼层
asma 发表于 2013-4-12 10:16
你先得说说 峰值要满足什么条件,比如间隔,幅度值,频率啥的。

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

出0入0汤圆

发表于 2013-4-13 22:47:26 | 显示全部楼层
先做简单低通滤波,然后前后两点相减做差分,找负向过零点个数?

出0入17汤圆

发表于 2013-4-13 23:23:43 | 显示全部楼层
有偿提供代码

出0入0汤圆

 楼主| 发表于 2013-4-14 13:02:16 | 显示全部楼层
hhxb 发表于 2013-4-13 23:23
有偿提供代码

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

出0入0汤圆

发表于 2013-4-14 21:17:15 | 显示全部楼层
先滤波,整理出大体与采样数据趋势一致,变化平滑,然后再数 上升&下降的个数就可以了。

出0入0汤圆

发表于 2013-4-14 22:42:43 | 显示全部楼层
对的,先滤波。

出0入0汤圆

发表于 2013-4-15 12:38:10 | 显示全部楼层
图3那种情况好像是需要信号放大

出0入0汤圆

 楼主| 发表于 2013-4-15 20:06:06 | 显示全部楼层
TANK99 发表于 2013-4-14 21:17
先滤波,整理出大体与采样数据趋势一致,变化平滑,然后再数 上升&下降的个数就可以了。 ...

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

出0入0汤圆

发表于 2013-4-15 20:36:42 | 显示全部楼层
不管软件硬件,首先要有一个明确的界定条件。“小的波峰有的算,有的不算”,你打算用个随机程序来做选择?另外大的小的也是相对说法,这样的要求没法做成可靠的软硬件,只能做成“模糊”控制的

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

出0入0汤圆

发表于 2013-4-15 20:38:34 | 显示全部楼层
比如你4楼的图,3和4之间有个小波峰,2比他大不了多少,凭什么2就算,3、4之间那个就不算?程序如何判定?

出0入0汤圆

发表于 2013-4-16 19:34:35 | 显示全部楼层
这个貎似在数节拍。

出0入0汤圆

发表于 2013-4-17 09:50:46 | 显示全部楼层
滑动平均+Peak Search Peac Search 做个过过零检测做保证

出0入0汤圆

发表于 2013-4-17 13:50:36 | 显示全部楼层
波形有点像线性ccd。。是不是啊?

出0入0汤圆

 楼主| 发表于 2013-4-17 19:34:31 | 显示全部楼层
lyz1900 发表于 2013-4-17 13:50
波形有点像线性ccd。。是不是啊?

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

出0入0汤圆

 楼主| 发表于 2013-4-17 19:34:47 | 显示全部楼层
zhangsusu 发表于 2013-4-17 09:50
滑动平均+Peak Search Peac Search 做个过过零检测做保证

多谢,我试试

出0入22汤圆

发表于 2013-4-17 20:31:31 | 显示全部楼层
我怎么感觉像是医疗检测设备上的数细胞。

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

出0入0汤圆

发表于 2013-4-17 21:22:30 | 显示全部楼层
guxingganyue 发表于 2013-4-17 19:34
多谢,我试试

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

出0入0汤圆

 楼主| 发表于 2013-4-18 09:22:29 | 显示全部楼层
lixin91985 发表于 2013-4-17 20:31
我怎么感觉像是医疗检测设备上的数细胞。

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

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

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

出0入22汤圆

发表于 2013-4-18 09:36:26 | 显示全部楼层
guxingganyue 发表于 2013-4-18 09:22
嗯,现在大概就是这么数的

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

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

出0入0汤圆

 楼主| 发表于 2013-4-18 11:26:17 | 显示全部楼层
lixin91985 发表于 2013-4-18 09:36
那就设置一个斜率的连续两个波峰之间的最小变化量。

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

出0入0汤圆

发表于 2013-4-18 20:46:35 | 显示全部楼层
这个需要峰值点的数据有平滑度,否则简单的比较可能会受数据小扰动的干扰,一定是先滤成一个平滑的波。

出0入0汤圆

 楼主| 发表于 2013-4-18 22:19:43 | 显示全部楼层
TANK99 发表于 2013-4-18 20:46
这个需要峰值点的数据有平滑度,否则简单的比较可能会受数据小扰动的干扰,一定是先滤成一个平滑的波。 ...

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

出0入0汤圆

发表于 2013-4-18 22:34:26 | 显示全部楼层
sf
yige .........

出0入0汤圆

发表于 2013-8-14 10:28:51 | 显示全部楼层
楼主问题解决了 ? 分享下解决经验啊!感谢了

出0入0汤圆

 楼主| 发表于 2013-8-14 11:27:56 | 显示全部楼层
ak5136728 发表于 2013-8-14 10:28
楼主问题解决了 ? 分享下解决经验啊!感谢了

还没有呢,还在研究中

你怎么也对这个敢兴趣?

出0入0汤圆

发表于 2013-8-14 13:02:32 | 显示全部楼层
可以考虑小波分析或傅立叶变换。

出0入0汤圆

发表于 2013-8-14 13:08:39 | 显示全部楼层
先做包络线 再算就方便了

出0入0汤圆

发表于 2013-8-14 16:26:52 | 显示全部楼层
guxingganyue 发表于 2013-8-14 11:27
还没有呢,还在研究中

你怎么也对这个敢兴趣?

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

出0入0汤圆

发表于 2013-8-14 16:53:06 | 显示全部楼层
我有方案,有偿代码,QQ,1763509044。

出0入0汤圆

 楼主| 发表于 2013-8-14 19:56:03 | 显示全部楼层
ren0214 发表于 2013-8-14 13:02
可以考虑小波分析或傅立叶变换。

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

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

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



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

出0入0汤圆

 楼主| 发表于 2013-8-14 19:59:12 | 显示全部楼层
清雨影 发表于 2013-8-14 16:53
我有方案,有偿代码,QQ,1763509044。

算法复杂吗?

非常复杂的话就行了

出0入0汤圆

 楼主| 发表于 2013-8-14 19:59:59 | 显示全部楼层
ak5136728 发表于 2013-8-14 16:26
嗯 ,感兴趣,最近有个项目也要测这个,很麻烦

那可以一起研究研究

出0入0汤圆

发表于 2013-8-14 21:58:22 | 显示全部楼层
这个应该不难,再次提供个思路仅供参考:

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

出0入17汤圆

发表于 2013-8-15 00:18:22 | 显示全部楼层
本帖最后由 hhxb 于 2013-8-15 00:20 编辑

看了一些数据

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

出0入0汤圆

 楼主| 发表于 2013-8-15 09:17:19 | 显示全部楼层
hendry 发表于 2013-8-14 21:58
这个应该不难,再次提供个思路仅供参考:

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

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

出0入0汤圆

发表于 2013-8-15 11:50:55 | 显示全部楼层
guxingganyue 发表于 2013-8-15 09:17
关键是这个波形的带宽不是一定的,它有的宽点,有的窄。没有一个合适的范围 ...

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

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

出0入0汤圆

发表于 2013-8-15 11:54:42 | 显示全部楼层
回复以后,我大概理解楼主的意思了:”关键是这个波形的带宽不是一定的,它有的宽点,有的窄“
楼主的意思是说,在一次计算中,波形的宽度不是恒定的,是吧。
波形宽度变化范围,实际反映的是带宽滤波器的通带带宽,滤波时,可以将带宽适当设宽点。

出0入0汤圆

 楼主| 发表于 2013-8-15 12:43:29 | 显示全部楼层
hendry 发表于 2013-8-15 11:54
回复以后,我大概理解楼主的意思了:”关键是这个波形的带宽不是一定的,它有的宽点,有的窄“
楼主的意思 ...

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


比如说下面的波形:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-15 18:56:34 | 显示全部楼层
guxingganyue 发表于 2013-8-15 12:43
宽了以后噪声如何剔除呢?

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

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

出0入0汤圆

发表于 2013-8-15 22:39:50 | 显示全部楼层
楼主应该模拟数字结合起来做, 先用带通滤波,把想要的特征峰搞明显,再A/D,再数字处理。

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

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

出0入0汤圆

发表于 2013-8-16 09:10:20 | 显示全部楼层
hendry 发表于 2013-8-14 21:58
这个应该不难,再次提供个思路仅供参考:

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

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

出0入0汤圆

发表于 2015-5-15 12:01:02 来自手机 | 显示全部楼层
楼主怎么样啦! 求经验分享

出0入0汤圆

发表于 2015-5-15 14:22:55 | 显示全部楼层
楼主,你先把你的界定条件所清楚,我告诉你方法。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 03:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表