如何使用角度换行过滤数据?
How to filter data with angle wraps?
我想要过滤掉车辆的嘈杂航向数据。但是,车辆航向的角度必须介于 -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
我想要过滤掉车辆的嘈杂航向数据。但是,车辆航向的角度必须介于 -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