在做一个项目,输入信号是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附近的波动比较大,只用低通会好很多,然后又加大采样周期数就更平稳了
|