您现在的位置: 爱51代码网 >> 范文 >> 文章正文
低频信号采样后如何计算RMS值

在做一个项目,输入信号是150HZ-1KHZ的低频信号,我现在用20k的采样频率去采样(实验用的是标准正弦信号),5ms得到100个数据,但是由于每次采样的起始点不确定,造成RMS值有起伏,当我用501HZ的正弦信号输入后,观察计算得到的RMS值也是有规律的起伏(类似正弦信号),当我把200个这样的RMS值做个平均就很平稳了,但是这样几百个Ms才更新个值就太慢了,所以我想请问有什么方法解决这样的问题吗?还是我用的这样的方法是错的?请大神帮忙分析解决,谢谢了
因为是标准正弦信号,所以我设想的是得到比较平稳的RMS值,结果除了加大平均样本的方法外,它的RMS值并不平稳。所以有没有什么方法得到平稳的RMS值?
static uint16_t RMS(int16_t *in,uint16_t lenth,uint8_t flag)
{
uint32_t i;
long long int m=0;
if(flag ==0)
{
for(i=1;i<=lenth;i++)
  m+= ((( long long int)(*(in+i)))*(( long long int)(*(in+i))));
}
else
{
for(i=0;i<lenth;i++)
   m +=((long long int)(*(in+i)))*((long long int)(*(in+i)));
}

return sqrt(m/lenth);
}
公式应该是有效值的算法,但对于150Hz情况,周期为6.67ms,而你只使用1ms采样,那么只采样了1/6.67个周期,数值不准是自然的,最好能有10-30个周期的采样量,才能最大可能的消除相位的影响
使用 “滑窗” 平均, 即加进减出。

窗口满后(如 200个),就快了。
可以使用一个大数组,比如A[2000]来保存每次的数据,用一个SUM变量保存累计和,新的数据为n,那么
每次新
SUM=SUM-A[i]+n
A[i]=n;//A[i]旧的数据被抛弃
i++;下一个数据变成旧数据,i==2000时,让i=0
,波动大的原因是前级电路的问题,用了两个滤波器,一个150hz高通加一个1k hz低通,会使500hz附近的波动比较大,只用低通会好很多,然后又加大采样周期数就更平稳了

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    SharePoint 2013 Search REST AP
    SharePoint如何搜索指定的爬网内
    weblogic Servlet: "action" fai
    webdav 与exchange通信失败未找到
    SharePoint2013文档库可以直接存
    Unable to write data to the tr
    asp.net中listbox的items.count属
    C#不是每次查询数据是不是被缓存
    ASP.NET发布后能加载引用的js文件
    Hadoop2.2.0在eclipse控制台没有
    SharePoint 2013 Search REST AP
    SharePoint如何搜索指定的爬网内
    weblogic Servlet: "action" fai
    webdav 与exchange通信失败未找到
    SharePoint2013文档库可以直接存
    Unable to write data to the tr
    asp.net中listbox的items.count属
    C#不是每次查询数据是不是被缓存
    ASP.NET发布后能加载引用的js文件
    Hadoop2.2.0在eclipse控制台没有
    received invalid  response
    Altium Designer的原理图库如
    占用式和非占用式程序结构分
    如何测量锂电池剩余电量
    WINCE6.0对话框右上角没有OK
    使用getlasterror返回值一直
    AD14如何输出DWG文件
    Keil-v5开发STM32F103RCT6的
    BKP_DR寄存器中的值RESET之后
    arm板自启动运行应用程序时为
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |