首页 > 解决方案 > 如何使用角度包过滤数据?

问题描述

我有想要过滤的车辆的嘈杂航向数据。但是,车辆航向必须是 -180 到 +180 度之间的角度,因此数据中有几个 360 度“跳跃”(我需要保留),其中车辆的航向越过这个阈值(见图)。对数据使用基本的低通滤波器可以滤除噪声,但不会在出现这些角度缠绕的情况下给出所需的结果(见图)。有没有人对这个问题的良好解决方案有任何想法?在此处输入图像描述(蓝色是原始的,橙色是过滤的)

标签: pythonscipydata-analysislowpass-filter

解决方案


我最终解开数据,应用过滤器,并按照 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

推荐阅读