时域积分
公式如下:
由于实际应用时传感器采样得到的点都是离散的,因此我们常常需要用到的是离散时域积分算法,对离散点的积分就是求和。
matlab实现积分算法:
% 积分
clc;
t=0:1/1000:0.2; %时间向量,包含了10个周期
syms x
f=0.5*cos(100*pi*x); %测试函数定义
x1=0.5*cos(100*pi*t); %离散化处理
v=int(f); %一次积分
x2=subs(v, t); %用t置换表达式v中的自变量x后再赋给x2,此时x2即为保存了离散数据的数组
subplot(1, 2, 1);
plot(t, x1); %绘制原始数据波形
subplot(1, 2, 2);
plot(t, x2); %绘制一次积分后的波形
输出波形:
MCU实现积分算法:
float Data_In[1024];
float Data_Out[1024];
/**
* 说明 : 一次积分运算
* 参数 : in, 输入数据指针
* out, 输出数据指针
* len, 数据长度
* 返回 : 无
*/
void Integra_Handle(float* in, float* out, uint32_t len)
{
float sum=0.0f;
for(uint32_t i=0; i<len; i++)
{
sum += in[i];
out[i]=sum/1024.0f; /*!< 除以采样率 */
}
}
/**
* 说明 : 积分运算
* 参数 : 无
* 无
* 返回 : 无
*/
void Integral_App(void)
{
/** 数据生成函数:生成1024个点 */
for(uint32_t i=0; i<1024; i++)
{
Data_In[i]=0.5f*arm_cos_f32(PI*2*i*50.0f/1024.0f);
}
/** 积分算法 */
Integra_Handle(Data_In, Data_Out, 1024);
/** 打印原始波形和积分后的波形 */
for(uint32_t i=0; i<1024; i++)
{
printf("%f, %f\n", Data_In[i], Data_Out[i]);
}
}
输出波形:
原始波形:
积分后波形(采样率:1024):
积分后波形(采样率:3000):
结论:
从上面的波形可以看出离散积分算法得到的波形和理论的存在误差,采样率1024时的幅度0.001828和实际的0.001592差很多,相位差的不是很多,产生此现象的原因是离散化程度不够高导致的,要想减小此误差需要减小离散间隔,即增加采样率。