一、问题来源

飞控需要采集加速度计与陀螺仪数据进行低通滤波,一般以1kHz频率采集,即采样频率为1kHz。使用二阶巴特沃兹低通滤波器进行滤波,截至频率可设置为20Hz。

滤波器的输入参数一般是采样频率、截至频率及采样数据。在程序实际运行过程中,采样频率可能会变化,比如有时500Hz,有时1.5kHz,如果一致设置为采样频率与截至频率不变,采样频率变化时数据会怎样呢,是否有必要根据时间间隔实时调整采样频率?


二、实验与分析

设计以下三个实验分析,首先统一说明:

  1. 所有滤波器截至频率都是20Hz,不再说明;
  2. 有用信号为周期为 2π2\pi2π,幅度为 111 的正弦信号;
  3. 噪声为均匀分布在 [−0.1,0.1][-0.1, 0.1][−0.1,0.1] 之间的白噪声;

2.1 信号采样频率固定,滤波器采样频率变化

设计滤波器采样频率分别为 5kHz,1kHz和200Hz,这样根据采样频率和截至频率,可以设计出三个不同的滤波器。然而,信号的采样频率为1kHz,将信号分别通过这三个滤波器,比较其滤波效果。结果如下:

可见,使用采样率为5kHz设计的滤波器,直线很光滑,但是延迟较大,大约 60ms。使用采样率为200Hz设计的滤波器,延迟小,但噪声大。考虑到噪声的峰峰值为0.2,比如在0.3s附近,带噪声的信号范围为[0.2,0.4],按200Hz设计的滤波器还是有一定的滤波效果。使用1kHz设计的刚好和信号采样频率一致的滤波器,在噪声和延迟间取得了较好的平衡。

2.2 滤波器采用频率固定,信号采样频率变化

设计采样率为1kHz的滤波器,但是输入信号的采样率分别为 5kHz,1kHz和200Hz。将三种信号分别通过此滤波器,其滤波器效果。结果如下:

可见,信号采样频率为5kHz时,延迟小,但噪声大。信号采样频率为200Hz时,数据平滑但是延迟较大,接近60ms。信号采样率与滤波器采样频率匹配,为1kHz时,在噪声和延迟间取得了不错的平衡。

结论刚好和第一种情况相反,因此可以说:

  1. 如果信号采样率 > 滤波器采样率,则延迟小,但噪声大
  2. 如果滤波器采样率 > 信号采样率,则数据平滑,但延迟大
  3. 滤波器采样率 = 信号采样率,在噪声和延迟间取得不错的平衡

2.3 滤波器采样频率与信号频率匹配,采样率变化

上面分析了采样频率不匹配的影响,但是如果采样频率匹配,那么采样频率高低对滤波效果有什么影响呢?设计滤波器采样频率分别为 5kHz,1kHz和200Hz的滤波器,并且对应输入对应频率的信号,滤波效果如下:

可见,采样频率越高,滤波效果越好。单片机采集IMU数据滤波,一般使用1kHz,这也主要是受限于传感器数据输出速率(MPU6050最高为2kHz)和单片机处理能力,而且,1kHz时已经取得不错的效果。

2.4 信号采样率随机变化

回到最开头的问题,假设滤波器采样频率按照 1kHz 设计,信号采样频率在 [500, 1500] 之间变化,服从均匀分布,那么这个变化会影响滤波效果吗?仿真结果如下:

可见,滤波效果并没有明显变差,甚至还有一点变好的迹象。所以实际过程中,如果不能准确按照1kHz采集数据,只要在这附近,影响也不是很大。


三、总结

本文通过仿真,以二阶巴特沃兹低通滤波器为例,分析了信号采样率与滤波器采样率匹配和不匹配时对滤波效果的影响。

本文只是通过仿真直观分析,并没有提供严谨的证明,并不能保证结论完全正确,以后有机会再进行证明。

MATLAB仿真文件如下:

rng(0)                  % 随机数种子,保证每次测试效果相同fs1 = 5000;             % 信号/滤波器采样频率 5kHz
fs2 = 1000;             % 信号/滤波器采样频率 1kHz
fs3 = 200;              % 信号/滤波器采样频率 200Hzfc = 20;                % 滤波器截止频率20Hz%% 测试1,信号频率1kHz,滤波器采样频率分别为 5kHz,1kHz和200Hz
[x, s1, t1] = gene_single(fs2);       % 1kHz采样的信号xf1 = myfilter(fs1, 20, x);         % 5kHz采样率滤波器
xf2 = myfilter(fs2, 20, x);         % 1kHz采样率滤波器
xf3 = myfilter(fs3, 20, x);         % 200Hz采样率滤波器figure(1);
plot(t1, xf1, t1, xf2, t1, xf3, t1, s1, 'linewidth',1)
legend('$f_s=5\rm{kHz}$', '$f_s = 1\rm{kHz}$','$f_s = 200\rm{Hz}$', '理想值', 'Interpreter', 'latex');
title('信号频率1kHz, 滤波器采样频率变化'); xlabel('时间 t(s)'); ylabel('滤波器输出值');axis([0.3 0.8 0.2  0.8])%% 测试2,滤波器采样频率为1kHz,信号采样频率分别为 5kHz,1kHz和500Hz[x1, s1, t1] = gene_single(fs1);         % 5kHz采样的信号
[x2, s2, t2] = gene_single(fs2);         % 1kHz采样的信号
[x3, s3, t3] = gene_single(fs3);         % 200Hz采样的信号xf1 = myfilter(fs2, fc, x1);         % 1kHz采样率滤波器
xf2 = myfilter(fs2, fc, x2);         % 1kHz采样率滤波器
xf3 = myfilter(fs2, fc, x3);         % 1kHz采样率滤波器figure(2);
plot(t1, xf1, t2, xf2, t3, xf3, t1, s1, 'linewidth',1)
legend('$f_s=5\rm{kHz}$', '$f_s = 1\rm{kHz}$','$f_s = 200\rm{Hz}$', '理想值', 'Interpreter', 'latex');
title('滤波器采样率1kHz,信号频率变化');xlabel('时间 t(s)'); ylabel('滤波器输出值');axis([0.3 0.8 0.2  0.8])%% 测试3,信号频率与滤波器采样频率匹配,两者分别为 5kHz,1kHz和500Hz[x1, s1, t1] = gene_single(fs1);         % 5kHz采样的信号
[x2, s2, t2] = gene_single(fs2);         % 1kHz采样的信号
[x3, s3, t3] = gene_single(fs3);         % 200Hz采样的信号xf1 = myfilter(fs1, fc, x1);         % 5kHz采样率滤波器
xf2 = myfilter(fs2, fc, x2);         % 1kHz采样率滤波器
xf3 = myfilter(fs3, fc, x3);         % 200Hz采样率滤波器figure(3)
plot(t1, xf1, t2, xf2, t3, xf3, t1, s1, 'linewidth',1);
legend('$f_s = 5\rm{kHz}$', '$f_s = 1\rm{kHz}$','$f_s = 200\rm{Hz}$', '理想值', 'Interpreter', 'latex');
title('信号采样频率=滤波器采样率');xlabel('时间 t(s)'); ylabel('滤波器输出值');axis([0.3 0.8 0.2  0.8])%% 测试4,信号采样频率在不断变化N = length(0:0.001:2*pi);
fs = 1000 + 1000 * (rand(1, N) - 0.5);
t1 = cumsum(1./ fs);
s1 = sin(t1);
n1 = 0.2 * (rand(size(t1)) - 0.5);
x1 = s1 + n1;[x2,s2,t2] = gene_single(fs2);xf1 = myfilter(fs2, fc, x1);
xf2 = myfilter(fs2, fc, x2);figure(4)
plot(t1, xf1, t2, xf2, t2, s2, 'linewidth', 2)
legend('信号采样率 500-1500Hz', '信号采样率恒为1kHz','理想值');
title('信号采样频率变化分析');xlabel('时间 t(s)'); ylabel('滤波器输出值');axis([0.3 0.8 0.2  0.8])%% 产生指定频率的带噪声正弦信号
% 输入:信号采样频率 fs
% 输出:产生带噪声的信号x,无噪声时的信号s,采样时间序列t% 信号:正弦信号周期 2*pi,幅度 1
% 噪声:均匀分布 [-0.1, 0.1]function [x, s, t] = gene_single(fs)dt = 1 / fs;            % 时间间隔
t = 0:dt:2*pi;
s = sin(t);
n = 0.2 * (rand(size(t)) - 0.5);
x = s + n;end%% 二阶巴特沃兹滤波器
% 输入:采样频率fs,截止频率fc,滤波器信号x
% 输出:滤波后信号 xffunction xf = myfilter(fs, fc, x)[b, a] = butter(2, fc / (fs/2));xf = filter(b, a, x);
end

采样频率变化时,滤波器的性能会变差吗?相关推荐

  1. R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数、阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化、基于数据阳性样本比例选择合适的分类评估指标

    R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数.阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化.基于数据阳性样本比例选择合适的分类评估指标 目录

  2. angular生命周期钩子ngOnChanges-父组件使子组件输入属性值变化时触发

    触发条件: 父组件使子组件输入属性值变化时才会调用,子组件自己改变输入属性的值不会调用 @input属性(输入属性)发生变化时,会调用 当输入属性为对象时,当对象的属性值发生变化时,不会调用 当对象的 ...

  3. element el-popover 使用v-if 控制显示/隐藏,当条件变化时,里面有部分内容无法显示

    先上效果图: 贴上我的代码: <span v-if="!isBin" class="chat-btn"><el-popoverv-if=&qu ...

  4. [react-router] React-Router 4怎样在路由变化时重新渲染同一个组件?

    [react-router] React-Router 4怎样在路由变化时重新渲染同一个组件? 1.在同一个组件添加不同的key,以下重新封装了组件: export default function ...

  5. 解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题

    解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 参考文章: (1)解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 ...

  6. echarts图表自适应(窗口大小变化时echarts图表重新渲染)

    echarts图表自适应(窗口大小变化时echarts图表重新渲染) 用第一种写法会存在问题,当有多个echarts的时候,只有一个生效 是因为 JS 绑定事件的时候,通过 .on 方式 和 addE ...

  7. 1.16 利用Multisim 研究图P1.4所示电路在R的阻值变化时二极管的直流电压和交流电流的变化,并总结仿真结果。

    1.16 利用Multisim 研究图P1.4所示电路在R的阻值变化时二极管的直流电压和交流电流的变化,并总结仿真结果. 画出如图电路图,根据二极管特性利用直流电压和交流电流分析二极管特性 视频如下: ...

  8. Qt 实现窗口大小变化时动画过渡

    文章目录 前言 一.QPropertyAnimation 属性动画 二.QEventLoop 三.实现窗口变化时大小动画过渡 测试代码 前言 需掌握知识点: QPropertyAnimation (属 ...

  9. jsplumb当浏览器窗口大小变化时,自适应(重新绘制端点和连线)

    使用场景 最近有个需求是绘制一个ER图,将关系图上的节点或者边的属性与数据表中的字段进行映射配置. 可能是我的容器container的宽高不是px,而是百分比或者vw,vh之类的.当浏览器窗口大小变化 ...

  10. 预训练后性能反而变差,自训练要取代预训练了吗?

    2020-07-18 13:53:03 编译 | JocelynWang 编辑 | 丛 末 早在2018年底,FAIR的研究人员就发布了一篇名为<Rethinking ImageNet Pre- ...

最新文章

  1. 缓存穿透、并发和雪崩那些事
  2. 说说悲观锁、乐观锁、分布式锁
  3. java中创建两种线程的方式_java中创建线程的两种方式有什么区别?
  4. MyBatis Generator 详解
  5. kotlin 协程异常处理机制颠覆三观
  6. [转载]Android Layout标签之-viewStub,requestFocus,merge,include
  7. matlab工程计算及应用 课程名称,《 MATLAB 工程计算及应用》教学大纲课程名称MATLAB 工程计算及应用.pdf...
  8. 论文浅尝 | 基于知识图的问答变分推理
  9. RoI Pooling 系列方法介绍(文末附源码)
  10. 黑猿大叔-译文 | TensorFlow实现Batch Normalization
  11. 配置实体框架DbContext的可扩展方案
  12. [翻译]Review——How JavaScript works:The building blocks of Web Workers
  13. php168批量添加会员,ecshop快速批量添加会员
  14. 招行笔试java编程
  15. java过滤器Filter实现敏感词汇过滤
  16. Choerodon猪齿鱼诞生记
  17. java打印输出羞漫画
  18. [Android6.0][MTK6737] 修改默认允许位置来源第三方应用安装
  19. jav中什么是组织java程序_Javs ^运算符在Java中做什么?
  20. 魔百和CM311-1a_CH_S905L3A_安卓9.0_纯净线刷固件包

热门文章

  1. 通过谷歌Google轻松拥有自己的站内搜索代码
  2. 在ADF应用中,能够通过 oracle.adf.view.rich.security.FRAME_BUSTING 参数来使用framebusting功能。
  3. php如何验证银行卡号,PHP效验银行卡卡号
  4. 什么是云迁移?云迁移的四种模式分别是?
  5. 客户关系管理系统的三个不同阶段
  6. 视频编码c语言,MPEG4codec(c) MPEG4视频格式的编解码源码 C语言实现 - 下载 - 搜珍网...
  7. Mac显示桌面的快捷方式
  8. 如何查看IP地址是否被占用
  9. 阿正喜欢的演讲系列连载(一):大法官约翰·罗伯茨-我祝你不幸(I Wish You Bad Luck)
  10. FLV视频格式解码软件开发