如何对ADC采集的正弦波做数值积分?梯形法结果偏移如何解决?
问题原因分析
你遇到的积分整体向上偏移的问题,核心来自两个常见原因:
- 原始采集信号自带直流偏置:大部分ADC为单极性输入,采集正弦波时会预先抬升1/2满量程的直流偏置(你提到的偏移1.0大概率就是这个预设偏置),直流分量做积分会得到随时间线性增长的项,最终表现为积分结果整体上漂。
- 积分初始值设置不当:梯形积分是累积运算,初始点的积分值会作为基底叠加到后续所有结果上。
首个测量点的积分值确定方法
你现在用的梯形法迭代逻辑是「用当前采样点+前一个采样点计算区间积分,再累加上前一时刻的积分结果」,所以初始化需要遵循以下步骤:
- 拿到第一个采样点(记为
y0)时,先不要调用积分函数,直接给结构体成员赋值:// 初始化阶段,采集到第一个点后执行 calka->prevMeasurement = y0; // 初始积分值按需求设置:如果是从t=0开始从零积分,就设为0;如果要让积分后的余弦波以x轴为中心,可以设为 -A/ω (A是正弦波幅值,ω是角频率,对应正弦波t=0时的积分理论值) // 不知道正弦波精确参数的话,也可以采集第一个完整周期的积分结果,计算其平均值,再把初始prevOut设为该平均值的负数,即可快速对齐到x轴中心 calka->prevOut = 0; - 从第二个采样点开始,再正常调用
calka_oblicz函数计算即可,此时第一个有效区间的积分就是[0, T]区间的梯形积分结果,不会出现初始值错误。
偏移修正方案
- 先消除原始信号直流偏置:提前采集足够多周期的正弦波,计算平均值作为直流偏移量
dc_offset,每次采样后先执行calka->currMeasurement = 采样值 - dc_offset,再送入积分逻辑,即可避免直流分量积分导致的整体上漂。 - 如果修正直流偏置后仍有固定偏移,可以直接调整初始化时的
prevOut数值,把固定偏移量抵消即可。
内容的提问来源于stack exchange,提问作者przemektw
相关产品推荐
相关产品推荐

