python - 如何使用角度包过滤数据?
问题描述
我有想要过滤的车辆的嘈杂航向数据。但是,车辆航向必须是 -180 到 +180 度之间的角度,因此数据中有几个 360 度“跳跃”(我需要保留),其中车辆的航向越过这个阈值(见图)。对数据使用基本的低通滤波器可以滤除噪声,但不会在出现这些角度缠绕的情况下给出所需的结果(见图)。有没有人对这个问题的良好解决方案有任何想法?(蓝色是原始的,橙色是过滤的)
解决方案
我最终解开数据,应用过滤器,并按照 Warren 的建议重新包装数据。附件是我为完成此任务而创建的函数。对于此代码中的任何不良 python 做法,我深表歉意。我是 python 新手。
from scipy.signal import filtfilt
def wrap_filter(filt_num, filt_denom, data, wrap_threshold=3):
"""
Parameters
----------
filt_num : Filter numerator (designed from scipy.signal.butter)
filt_denom : Filter denominator (designed from scipy.signal.butter)
data : data series to be filtered
wrap_threshold: delta in consecutive datapoints that will be considered a wrap
Returns
-------
Filtered data accounting for angle wraps.
"""
#initialize
key = 0
data_dict = {}
data_list = []
filt_data_list = []
prev_data=data[0]
filter_pad_length = 500
#break data into dictionary at wrap points
for data_point in data:
if abs(prev_data - data_point) > wrap_threshold:
data_dict[key] = data_list
data_list = [data_point]
key += 1
else:
data_list.append(data_point)
prev_data = data_point
#add last section of data
data_dict[key] = data_list
#filter each section of data and append to final data list
for data_section in data_dict:
if len(data_dict[data_section]) > filter_pad_length: #filter padlen
filt_data_section = list(filtfilt(filt_num, filt_denom, data_dict[data_section], padlen=filter_pad_length))
#filt_data_list.append(filt_data_section)
filt_data_list += filt_data_section
else:
filt_data_list += data_dict[data_section]
return filt_data_list
推荐阅读
- regex - 简单的正则表达式未捕获捕获组
- java - 试图从类别等于字符串的firebase中检索数据
- python - Python:分配变量路径的文件不打印或编辑
- vue.js - Vue3 范围类不适用于模板中未声明的元素
- python - 如何在调用视图函数的模板中编写 urlpattern
- javascript - 在循环之间引入一个div来添加flex
- linux - 如何使用终端重命名 linux 中的目录?
- delphi - Delphi 菜单问题
- python - 如何解构 pandas dataframes.loc 结果?
- python - 将诸如 31.1 M 之类的字符串数字转换为数字/浮点数?