如何使用角度换行过滤数据?

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