lianlian123 发表于 2009-8-26 11:00:03

峰峰值求取小程序分享, 信号处理

许多人想测量计算得到信号的峰峰值,并将其和对应的时间的波形和值显示出来,下面是用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,如下图所示:



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

MechTest 发表于 2009-9-15 00:13:07

谢谢了,又学到一个函数xmax的使用
页: [1]
查看完整版本: 峰峰值求取小程序分享, 信号处理