加速度频域积分的实现及其局限性分析

article/2025/9/28 11:00:57

首先,相信大家都尝试过直接在时域中通过加速度传感器积分得到位移。在加速度精度不高或者加速度数据不经处理的情况下,积分得到的位移量会一直有一个累计误差,而且会越来越大,这时有人就会把目光移到频域中,在频域中对加速度进行积分会怎样呢?会不会有出乎意料的效果呢?

什么是频域积分

单片机或者传感器采样得到的点都是离散的,在时域中,对于离散点的积分就是求和。

而频域积分需要先把时域的数组通过快速傅里叶变换(FFT)转到频域,再通过傅里叶变换的积分性质,在频域中实现积分与滤波0后,通过IFFT傅里叶逆变换返回时域,此时得到的数组即为时域数组的积分结果。傅里叶变换的原理此处不再赘述,大概的作用就是把一个时域上的信号波形分解成若干个单一频率信号的叠加,通俗点讲就是通过无穷多个幅度、频率不同的正弦波的叠加去近似原信号的波形,而傅里叶变换得到的频谱就是这些不同频率正弦波形对应的幅值。这里丢两张动图方便理解。

而频域的积分需要用到傅里叶变换的积分性质:

一次积分

二次积分

这两个公式将时域积分放到了到频域做,去掉了积分符号,看起来比较复杂,其实如果以不变量一个变量地看都比较简单。

如何实现频域积分

用程序语言描述傅里叶变换的积分性质,看似复杂,其实只需要把这个公式每一项单独求出即可。

下面步骤是参考了《matlab在振动信号处理中的应用》(王济 著)中第五章频域积分。

1. 获得时域数组

 假设加速度的采样频率sf为1kHz,则需要先采集一段时间的数据得到时域数组,为FFT计算方便起见,nfft取2的幂次个采样点如1024个点;

2. 计算FFT 

对这1024个点做FFT快速傅里叶变换得到频谱,即上面公式中的F(ω),将F(ω)取模长后我们会发现该图形是个关于500Hz对称的图形(第一个点为F(0),不对称),如图:  

3.  计算ω数组

 要获得ω数组首先需要算出频率间隔df,因为采样频sf率是1000Hz,而整个数组长度为1024,所以df=sf/nff,单位(Hz/s),通过计算df把时域中采样的时间点和频域中的频率点一一对应起来,再说直白点就是时域中采样点的时间间隔是1/1000Hz=1ms,而频域中的的频率间隔是1000/1024=0.977Hz,我们FFT得到的频谱每个值之间间隔0.977Hz,1024个点对应0~1000Hz。 ω数组也是对称的(或中心对称),分为正离散圆频率向量和负离散圆频率向量。先将刚才得到的频率间隔df转换为角频率间隔dω,dω=2π*df。ω数组计算公式如下,其中n为积分次数:

 

 一次积分的ω数组的与二次积分的ω数组如图所示:

 

4.  虚数 j

得到 ω数组后就是处理 j 了,j 是单位虚数,j的平方为-1。积分公式中F(ω)除了一个 j,而 j 在频域中表示相移,每乘一个 j 就逆时针旋转了90度,每除一个j,顺时针旋转90度。也就是说,时域的一次积分转到频域后需要顺时针旋转90度,而二次积分需要顺时针旋转180度。

5. 进行积分的频域变换 

 频域变换就是第二步中FFT的结果(即1024个复数)依次除以 ω数组。

6. 进行积分的相位变换 

 第4步中提到一次积分顺时针旋转90度,而二次积分顺时针旋转180度。相位变换就是把第5步得到的复数数组每个复数都旋转,假设实部为real,虚部为imag,一次积分时虚部等于实部imag=real,实部等于负虚部real=-imag;二次积分时实部等于负实部real=-real,虚部等于负虚部imag=-imag(更正:图中二次积分的虚部应为“-”不是“+”,感谢评论区小伙伴指正)

7.  滤波

 此时如果不进行滤波直接跳到第8步就能得到时域的二次积分结果。如果想把其中的低频和高频部分滤除,则可以将第6步得到的复数数组中的开头几个复数和最后几个复数直接置零,假设需要滤除Fmin=10Hz以下的部分,先计算出10Hz大概是哪个点ni=Fim/df+1,10/0.977+1≈11,即把第6步得到的复数数组前11个复数都置位0,滤高频同理。

补充:以上方法其实就是用了矩形窗函数,如果想要达到不同的滤波效果,可以考虑其他窗函数如汉宁窗、海明窗、高斯窗等等。

8.  IFFT返回时域

 最后通过IFFT将处理完的复数数组转回时域,得到积分结果。

 

附上MATLAB代码,C语言代码点击下面链接

基于STM32F4的加速度频域二次积分振动位移C语言算法 

基于STM32F407与JY901模块的加速度频域积分实现(完整工程)

clear;
clc;
close all hidden;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fno = 'output.txt';
fid = fopen('1.txt','r');
x = fscanf(fid,'%f',[1,inf]);
status = fclose(fid);sf = 1000;            %采样频率
fmin = 1;           %最小截止频率
fmax = 200;           %最大截止频率
c = 9810.5;           %单位变换系数
it = 2;               %积分次数sx = '时间';          %横坐标标注
sy1 = 'y1';           %纵坐标标注
sy2 = 'y2';           %纵坐标标注n=length(x);                    %待分析数组长度
t=0:1/sf:(n-1)/sf;              %建立时间向量
nfft=2^nextpow2(n);             %大于并接近n的2的幂次方的FFT长度
y=fft(x,nfft);                  %FFT变换df=sf/nfft;                     %计算频率间隔(Hz/s)
ni=round(fmin/df+0.5);          %高通频率截止点=最小截止频率/时间步长t+1
na=round(fmax/df+0.5);          %低通频率截止点=最大截止频率/时间步长t+1
dw=2*pi*df;                     %圆频率间隔(rad/s)
w1=0:dw:2*pi*(0.5*sf-df);       %正离散圆频率向量
w2=-2*pi*(0.5*sf-df):dw:-dw;    %负离散圆频率向量
w=[w1,w2];                      %连接w1,w2
w=w.^it;                        %以积分次数为指数,建立圆频率变量向量
subplot(2,2,2);
plot(abs(y));a=zeros(1,nfft);                %进行积分的频域变换
a(2:nfft-1)=y(2:nfft-1)./w(2:nfft-1);
subplot(2,2,4);                 %绘制积分前的时程曲线图形
plot(abs(a));if it==2y=-a;                       %进行二次积分的相位变换
elsey = imag(a) - 1i*real(a);   %进行一次积分的相位变换
enda=zeros(1,na);                  
a(ni:na)=y(ni:na);              %消除指定正频带外的频率成分
a(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);%消除指定负频带外的频率成分y=ifft(a,nfft);                 %IFFT变换
y=real(y(1:n))*c;               %取逆变换的实部n个元素并乘以单位变换系数为积分结果
subplot(2,2,1);                 %绘制积分前的时程曲线图形
plot(t,x);
xlabel('时间(s)');
ylabel('加速度(g)');
grid on;
subplot(2,2,3);                 %绘制积分前的时程曲线图形
plot(t,y);
xlabel('时间(s)');
if it==2ylabel('距离(m)');
elseylabel('速度(m/s)');
end
grid on;
fid=fopen(fno,'w');             %输出积分后的数据
for k=1:nfprintf(fid,'%f/n',y(k));
end
status=fclose(fid);

局限性

但是上面的计算思路仅局限于振动的位移计算,也就是说总位移为0,当总位移不为0时,我们的积分结果最终还是会等于0,下面看一下仿真结果

图一是原始数据,图三为图一的积分,积分结果不为0,图二为FFT后去除最低频信号(即直流部分)后再IFFT的波形,可以看到整个图形都向下偏移了一段距离,图四为图二的积分结果,最终为0,这与实际积分结果严重不符。因为根据傅里叶变换公式F(\omega )=\int_{-\propto }^{+\propto }f(t)e^{-i\omega t}dt当ω=0时,F(0)=\int_{-\propto }^{+\propto }f(t)dt,可见F(0)本身就等于时域图形的积分,而滤低频时将其直接置为0,最后的积分结果当然为0,也就是说上述频域积分仅适用于总积分为0的情况。

若滤除直流部分,最终积分为0,若不滤除直流分量部分,又无法消除加速度积分后的累计误差,因此互相矛盾。所以频域积分不适用于总位移不为0的加速度积分。

非零位移

关于非零位移的问题,首先我们要清楚加速度计累积误差的来源,加速度计都带有一定的线性偏移,即需要通过kx+b的方法进行校正,而其中的b正是引起加速度积分累积误差的罪魁祸首,因此需要对加速度进行线性补偿,可通过Matlab中的lsqcurvefit,非线性拟合文中提到的方法确定k和b,如果在要求不是很严格的场合,只需要对b进行补偿即可,方法是在确定系统处于静止状态时(通过其他方式确定的系统状态),首先令速度为零,然后将一段时间内的加速度取平均即可作为补偿值b,每隔适当时间校正一次b这样就能保证速度基本无累积误差,然后用同样的方法计算位移。

但是上述方法仍然有比较大的误差存在,仅加速度计显然无法精确求得位移,因此需要增加其他传感器。对于在平面上运动的系统,建议增加GPS,如果是在垂直方向上运动的系统则可以增加气压计,然后通过卡尔曼滤波对两组数据进行数据融合,能得到比较准确的位移、速度和加速的。具体方法可以参考这篇博文:二阶卡尔曼滤波计算加速度、速度及高度


http://chatgpt.dhexx.cn/article/EuxnBkYY.shtml

相关文章

雷达篇(十) dB和dBm的意义,功率W和dBm之间的换算

1、dB 分贝(dB)是一个对数单位,原先发明它是为了表示功率的比值,但是现在用来表示多种比值: dB表示的功率:;以电压表示的功率比: 。 2、dBm 尽管分贝最初是用来表示功率比&#xf…

dBm、dBW和W转换

2019独角兽企业重金招聘Python工程师标准>>> dBw是一个表示功率绝对值的单位(以1W功率为基准); dBm同样是一个表示功率绝对值的单位(以1mW功率为基准); dBw的计算公式为: 同理,dBm的…

DBM计算-DBM和W之间的计算

DBM计算-DBM和W之间的计算 图中1mw 0dbm,10mw10dbm 然后11mw拆分成10mw1mw根据:1mw 0dbm,10mw10dbm,我们得到的值应该是10dbm。但实际上是10.4dbm。 为什么我们会算出10dbm这个错误的值呢? 因为理解错了。分贝是一个比值。直接拿分贝相加是没…

北斗导航 | dBW/dBm/W快速换算方法

================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 ================================================ 小记 dBW与dBm一样,都是一个表示功率绝对值的单位(以1W功率为基准,dB…

dBm和W计算技巧

目录 口算规则(1个基准,2个规则):例题 口算规则(1个基准,2个规则): 1个基准:30dBm 1w 分贝毫瓦dBm(decibel relative to one milliwatt)的定义&…

射频功率dbm-w换算表

二、无线通信距离的计算 这里给出自由空间传播时的无线通信距离的计算方法:所谓自由空间传播系指天线周围为无限大真空时的电波传播,它是理想传播条件。电波在自由空间传播时,其能量既不会被障碍物所吸收,也不会产生反射或散射。 …

W dBm功率换算公式

W/mw 转dBm: dBm 10 lg (P / 1mw) //P为被转换的W/mw 值 dBm转W/mw: W 10^((P - 30)/ 10) //P为被转换的dBm值

dBm 功率与多少瓦(W)有什么关系

一、做功耗拆解时,PA的总输入功耗可以实测出来,再通过PA输出功率dBm换算到mW,根据Pin-Pout可以计算出PA的热耗。 二、dBm 与 W 的换算公式: dBm 10 x log[ 功率 mW] 以下数据是算出的结果,我们可以发现:…

黑盒测试、白盒测试、灰盒测试区别与详细功能描述

一、黑盒测试、灰盒测试、白盒测试概念 黑盒测试:黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检验每个功能都是否能够正常使用。 白盒测试:白盒测试也称结构测试或逻辑驱动测试,是一…

实验6、灰盒测试实验

1.实验目的: 1)理解灰盒测试原理 2)学习使用灰盒测试构想软件/系统内部开发结构并针对性的进行测试 2.实验方法: 1)灰盒测试法 2)错误推测法 3实验内容: 1.推断软件的开发架构、语言 2.针对性地设计测试用例并测试软件 3.指出软件的缺…

软件测试:黑盒测试、白盒测试和灰盒测试

1. 黑盒测试和白盒测试的直观图 从图中可以直接看出来,黑盒测试就当整个程序是个黑盒子,我们看不到它里面做了些什么事情,只能通过输入输出看是否能得到我们所需的来测试。而白盒测试可以当盒子是透明的,里面的一切我们都看的清楚…

黑盒测试,白盒测试与灰盒测试的比较和区别

定义 黑盒测试 黑盒测试是一种软件测试技术,它可以检查软件的功能,而不会窥视其内部结构或编码。黑盒测试的主要来源是客户声明的要求规范。 在此方法中,测试人员选择一个函数并提供输入值以检查它的功能,并检查该函数是否给出…

【测试方法】黑盒测试、灰盒测试、白盒测试这些你确定都会了吗?

根据利用的被测对象信息的不同,可以将软件测试方法分为:黑盒测试、灰盒测试、白盒测试。 1、白盒测试 1)概念:是依据被测软件分析程序内部构造,并根据内部构造分析用例,来对内部控制流程进行测试&#xff…

黑盒测试、白盒测试、灰盒测试的区别

1. 黑盒测试 黑盒测试也称功能测试、数据驱动测试或基于规格说明书的测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测…

黑盒测试、白盒测试与灰盒测试方法

测试奇谭,BUG不见。 大家好,我是谭叔。 对于黑盒、白盒与灰盒测试方法的理解,几年前我在某乎做过一个概念性的回答,当时提问者询问:如何跟非技术人员解释黑盒、白盒、灰盒测试的区别? 我的回答原文如下&…

白盒测试、黑盒测试、灰盒测试

根据被测对象的不同,软件测试可以分为白盒测试、黑盒测试、灰盒测试三种方式。那么,这三种测试测试方式具体是如何运行的?各有什么特点?下面,跟着小厚一起了解一下吧! 01 白盒测试 ●概念: ➢…

一直没搞懂灰盒测试的我,收藏了这篇文章

在本文中,我们将了解什么是灰盒测试以及为什么要使用它,以及它的优缺点。 在软件测试中,灰盒测试是一种有用的技术,可以确保发布的软件是高性能的、安全的并满足预期用户的需求。这是一种从外部测试应用程序同时跟踪其内部操作的…

拉普拉斯变换学习笔记

目录 1.为什么引入拉普拉斯变换? 2.双边拉普拉斯的定义 3.双边拉普拉斯变换的收敛域 4.单边拉普拉斯变换的定义 5.单边拉普拉斯变换和傅立叶变换的关系 6.常见信号的拉式变换 7.拉普拉斯变换的性质 7.1.线性、尺度变换性质 7.2.时移、复频移特性 7.3.时域、…

MATLAB之拉氏变换

一、复数和复变函数 1、复数的三种表现形式: 坐标形式: 三角形式: 指数形式: 2、复变函数: 复数集E内的每一个复数zab*i,都有(唯一确定的/无穷多个/有限个)复数与之对应,可以确定(单…