lianlian123 发表于 2009-8-26 10:35

关于求取峰峰值的小程序

许多人想测量计算得到信号的峰峰值,并将其和对应的时间的波形和值显示出来,下面是用Famos程序实现的。首先生成一个虚拟的原始信号testdata,处理后的结果名为PeakToPeak图,源程序为:
; Create Test data
;产生一个从0开始,间隔为0.1,总共3000个点的时间序列
_t = ramp(0,0.1, 30000)
;产生一虚拟信号,其中PI2=2*PI
_a1 = sqrt(2)*2*sin ( _t *(0.3*PI2)*(_t/400+1) )*(_t/1000+1),
xdelta _a1 0.001;改变间隔为0.001
;通过带通滤波,并附加一个谐波和直流分量20,创建原始数据testdata,
testdata = 5 *filtbp(_a1,0,0,2,150,200) + 0.9*sin ( _t*(0.7*PI2) ) + 20
;删除中间变量
delete _t;
delete _a1
;定义单位
yunit testdata N
xunit testdata s
testdata = 12
testdata = -10
testdata = 13
testdata = -7
;光滑处理,利用hysteresis滤波器
testdata = hyst ( testdata, 0.5 )

; calculate peak to peak values:

_MinPos = xMax(-testdata,-1e35);最小峰值点所在坐标
_MaxPos = xMax(testdata,-1e35);最大峰值点所在坐标
_size = min ( join ( leng?(_MaxPos), leng?(_MinPos) ));取最大值点数和最小值点数的最小者
_MinPos = leng ( _MinPos, _size )
_MaxPos = leng ( _MaxPos, _size )
_MinAmp = value ( testdata, _MinPos );求取各最小值
_MaxAmp = value ( testdata, _MaxPos );求取各最小值
PeakToPeak = xyof ( _MaxPos, _MaxAmp - _MinAmp );绘制峰峰值时域图
;

; clean-up

delete _MaxPos
delete _MinPos
delete _MinAmp
delete _MaxAmp
delete _size

将源程序copy至famos的sequence栏,运行即可。
原始数据为testdata如下图所示:




处理后的结果名为PeakToPeak,如下图所示:



欢迎大家一起探讨该问题。

gzy666q 发表于 2009-8-26 16:39

很好的东西哦,我看了看你的程序,好像实现的语句很简单哦,不像是用通用语言C 什么的实现的吧,后来仔细看了一下,好像是用一个famos的软件实现的吧,以前用过那个famos软件,很不错的软件,应该是德国IMC的后分析处理软件实现的吧,楼主是专门做数据分析处理的,他们的硬件产品怎么样,听说用的很好的,就是没有用过,有机会给介绍一下imc的硬件哦,我也是听我的同事说的,因为我只做后分析处理用了,前面的数据采集,都是他们拿着德国imc的数据采集设备去用的,他们说很不错的数据采集设备,携带方便并且不重,用起来很方便,

iam7766 发表于 2015-4-14 18:27

學習了!
页: [1]
查看完整版本: 关于求取峰峰值的小程序