我正在尝试计算波形的RMS值,但遇到了一些问题。
我每隔x微秒采样一次由中断触发。样本存储在一个数组中,每次取样时,它会将最后一个值推送到数组中的下一个点并输入一个新值。当我取样时,我将其平方并除以20(每个样本数)周期,假设波形固定频率)然后把它放入我的数组,我也将它加到一个和值,当我达到20个样本时,我减去第一个样本并添加最后一个样本。
value 20 = value 19 //INT16 values
value 19 = value 18
...
value1 = (sample * sample)/20
sumvalue += value1
sumvalue -= value20
然后我调用一个RMS函数,该函数取该值,除以最后计算的RMS值(或者如果尚未计算,则除以1)加上最后一个RMS值,然后将所有值除以2.
CalcRMS(sumvalue)
INT32 tempsum
if(RMS)
tempsum = (sumvalue/RMS + RMS)/2
else
tempsum = (sumvalue + 1)/2
RMS = tempsum
然后我将RMS输出到屏幕。唯一的问题是我的RMS值会不断变化,即使波形是恒定的。如果我在那里运行一个直流值,我的RMS会保持稳定,但是会在正弦波中推动并且它会变得疯狂。
希望有人能指出我正确的方向。我不希望得到答案,只是为了让我重回正轨。
答案 0 :(得分:0)
Alrigth,这个函数并没有真正计算出RMS。
您是否看过sumvalue如何加班?在dc和符号的情况下,sumvalue必须有些恒定。如果不是,那么总结的例程就出了问题。如果sumvalue是常数,那么你的RMS程序有问题。
答案 1 :(得分:0)
如果代码经常对数据进行采样,找到最小值,找到最大值,找到中位数=(最小+最大)/ 2,找到RMS =(最大中位数)* .707
如果代码没有经常对数据进行采样,则使用快速forier(拼写)变换来查找最小值/最大值。
答案 2 :(得分:0)
除了你不计算RMS(在哪里是sqrt?)并且你的计算RMS的算法看起来不正确之外,预计采样的RMS值会在一个范围内振荡由于抽样。您还没有指定正在采样的正弦波的频率,也没有证明20个值足以避免锯齿。如果您知道正弦波的周期并将其除以20,那么您的RMS值将不会振荡。
此外,您的代码非常不可扩展 - 想象一下当您意识到需要保留200个值(或2000)时,您的value1,value2,...,value20方法的痛苦!
以下是您可以使用的示例Python脚本:
i = 0
x = 0
values = []
sampleSize = 20
while True:
y = math.sin(x)
y = y*y/sampleSize
values.append(y)
if(len(values) > sampleSize):
values.pop(0)
val = sum(values)
print(math.sqrt(val))
x += 8*math.atan(1)/sampleSize
i += 1