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

2023-05-16


一、问题来源

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

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


二、实验与分析

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

  1. 所有滤波器截至频率都是20Hz,不再说明;
  2. 有用信号为周期为 2 π 2\pi 2π,幅度为 1 1 1 的正弦信号;
  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;              % 信号/滤波器采样频率 200Hz

fc = 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
% 输出:滤波后信号 xf

function xf = myfilter(fs, fc, x)
    [b, a] = butter(2, fc / (fs/2));
    xf = filter(b, a, x);
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 十七、基于软核和CAN搭建FPGA在线升级系统设计

    1 系统搭建 系统主要包含 xff1a MicroBlaze软核处理器 xff0c Axi Can控制器 xff0c Axi lite user用户通信接口 xff0c MIG DDR3控制器 xff0c 中断控制器等 设计使用Can接收上
  • 【OpenCV】cv::Mat位深和通道,CV_8UC1等

    位深 每个像素由多少位来存储 是一个精度问题 xff0c 一般图片是8bit xff08 位 xff09 的 xff0c 则深度是8 通道 每个像素点能存放多少个数 类似于RGB彩色图中的每个像素点有三个值 xff0c 即三通道 一个图像的
  • darknet_ros编译报错以及在RVIZ中显示乱码

    最近在arm平台上部署 darknet ros 出现了一些错误 xff0c 这里记录一下 首先在ARM平台上部署和在AMD平台上部署是不同的 xff0c 首先应该考虑算力问题 xff0c 在ARM下 xff0c 加载yolov3 weigh
  • 萌新改代码系列(一)--VINS+GPS

    VINS与GPS组合 距离上次写博客过去了快一年了 xff0c 这一年来我一直忙于与SLAM方向几乎没有关系的科研工作 xff0c 说来惭愧 xff0c 最终也没研究出个啥 最近得空 xff0c 就把我之前开源的代码整理了一下 xff0c
  • GVINS论文阅读(VINS-MONO + gnss 紧耦合)

    原文 x1f517 https arxiv org pdf 2103 07899 pdf github x1f517 https github com HKUST Aerial Robotics GVINS 港科大 沈老师团队 在vins
  • 萌新学VINS-Fusion(一)------特征跟踪

    VINS FUSION代码心得 新人小白 xff0c 第一次写博客 xff0c 主要相当于自己做一个关于学习VINS的笔记 xff0c 不喜勿喷 xff0c 转载请注明出处 其实我之前也尝试着在VINS MONO基础上改写双目的 xff0c
  • 萌新学VINS-Fusion(二)------初始化

    最近在忙别的事情 xff0c 博客迟迟没更新 xff0c 现在终于放假了 xff0c 今天把初始化部分来分析一下 源码 xff1a https github com HKUST Aerial Robotics VINS Fusion pro
  • c 语言中 %d,%lu等区别

    转载至 xff1a http blog sina com cn s blog 7d94c35c01019f96 html d 有符号10进制整数 ld 长整型 hd短整型 hu 无符号短整形 u无符号整形 lu无符号长整形 i 有符号10进
  • 萌新学VINS-Fusion(三)------双目和GPS融合

    虽然要过年了 xff0c 而且每天还要在家里小店打工 xff0c 但是网红之路不能停对吧 xff0c 这篇博客写关于VINS Fusion和GPS的融合 其实我之前改出过一个加了GPS的VIO xff0c 并且也开源了 xff0c 之前没有
  • nuxt cookie-universal-nuxt 搭配 vuex-persistedstate 做数据持久化

    前言 因为服务端不存在 Local Storage 和 Session Storage 所以 便使用了 cookie universal nuxt 这个插件 在做Nuxt项目的时候 发现Vuex 在刷新页面后 储存的数据丢失 用 vuex
  • ROS学习(一):Navigation中GNSS与IMU数据融合定位

    1 参考博客 主要参考以下博客 感谢各位博主的分享 link https blog csdn net qinqinxiansheng article details 107108475 utm medium 61 distribute pc
  • msOS学习之路(1)

    msOS学习之路 xff08 1 xff09 1 msOS的初步认识 刚刚拿到msOS开发板的时候 xff0c 看了一下开发板 xff0c 感觉非常高端 xff0c 再看一下芯片 xff0c 用的是stm32 当时我就觉得我得先学习stm3
  • msOS学习之路(2)

    基于msOS自动回火机的实现 1 简介 1 1 背景 基于msOS自动回火机的实现的实例是学习msOS比较好的入门实例 xff0c 它包括msOS界面的设计 数据库的使用 系统节拍的使用 按键的使用 系统节拍使用等 xff0c 通过这个例子
  • msOS学习之路(4)

    设备层简单理解 1 设备层相关定义 设备层的相关定义是在device h文件中定义的 xff0c 包括按键 模拟量输入 数字量输入 输出枚举或者类型定义等 xff0c 对于一些结构体的理解 xff0c 例如 xff1a ADC结构体 xff
  • 【STM32】STM32CubeIDE HAL库Ring-buffer例程

    板子G474RE STM32HAL库Ring buffer使用 注意 xff1a HAL库中 xff0c 中断每执行一次 xff0c 就关闭 xff0c 所以需要重新开启中断 第一次开启在main函数中 HAL UART Receive I
  • 【ROS】多机协同ROS安装使用

    目录 通信框架ROS 安装ROS 测试ROS 控制协同 协同感知 通信框架ROS ROS是一种分布式软件框架 xff0c 节点之间通过松耦合的方式进行组合 xff0c 在很多应用场景下 xff0c 节点可以运行在不同的计算平台上 xff0c
  • 【无人机】PX4,ROS,Ubuntu20仿真运行

    参考 xff1a https docs px4 io master en ros mavros installation html https docs px4 io master en dev setup dev env linux ub
  • 【无人机】PX4,源码简要分析

    看看源码目的很单纯 xff0c 就是想有没有控制方面的代码可以移植到其它地方 无人机 PX4 xff0c ubuntu18仿真运行 从官网可能下载代码不全 xff0c 这是编译完成的源码 xff0c 有点大 xff01 xff01 xff0
  • 内核层读写应用层文件,使用filp_open函数。

    转载 xff1a http soft chinabyte com os 421 11398421 shtml 有时候需要在Linux kernel 大多是在需要调试的驱动程序 中读写文件数据 在kernel中操作文件没有标准库可用 xff0

随机推荐