这是我上一个问题的扩展:https://dsp.stackexchange.com/questions/28095/choosing-low-pass-filter-parameters 我正在从窃听的相机录制人物.我使用一些软件跟踪每个人的头部.由于头部摇晃,我想从轨道周期性.
我使用低通butterworth过滤器.我希望过滤的起点和终点与未过滤的轨道相同.
Data:
K>> [xcor_i,ycor_i ]
ans =
-101.7000 -77.4040
-102.4200 -77.4040
-103.6600 -77.4040
-103.9300 -76.6720
-103.9900 -76.5130
-104.0000 -76.4780
-105.0800 -76.4710
-106.0400 -77.5660
-106.2500 -77.8050
-106.2900 -77.8570
-106.3000 -77.8680
-106.3000 -77.8710
-107.7500 -78.9680
-108.0600 -79.2070
-108.1200 -79.2590
-109.9500 -80.3680
-111.4200 -80.6090
-112.8200 -81.7590
-113.8500 -82.3750
-115.1500 -83.2410
-116.1500 -83.4290
-116.3700 -83.8360
-117.5000 -84.2910
-117.7400 -84.3890
-118.8800 -84.7770
-119.8400 -85.2270
-121.1400 -85.3250
-123.2200 -84.9800
-125.4700 -85.2710
-127.0400 -85.7000
-128.8200 -85.7930
-130.6500 -85.8130
-132.4900 -85.8180
-134.3300 -86.5500
-136.1700 -87.0760
-137.6500 -86.0920
-138.6900 -86.9760
-140.3600 -87.9000
-142.1600 -88.4660
-144.7200 -89.3210
Run Code Online (Sandbox Code Playgroud)
代码(由@SleuthEye回答):
dataOut_x = xcor_i(1)+filter(b,a,xcor_i-xcor_i(1));
dataOut_y = ycor_i(1)+filter(b,a,ycor_i-ycor_i(1));
Run Code Online (Sandbox Code Playgroud)
输出:
在上面的示例中,端点(左侧)对于已过滤和未过滤的轨道是不同的.我怎样才能确保它是一样的?
你的问题很模糊,并没有真正的具体问题.我假设您希望过滤后的数据与测量数据在同一点开始,但不确定为什么这种情况不会发生,以及如何进行.
低通滤波器是一种降低快速变化影响的滤波器.这样做的一种方法和这里似乎使用的方法是使用滚动平均值.滚动平均值只是先前数据点的平均值(平均值).看起来您正在使用5个数据点的滚动平均值.因此,在过滤器为您提供单个数据点之前,您需要五个原始数据点.
-101.7000 -77.4040 }
-102.4200 -77.4040 } }
-103.6600 -77.4040 } }
-103.9300 -76.6720 } }
-103.9900 -76.5130 } Filter point 1. }
-104.0000 -76.4780 } Filter point 2.
-105.0800 -76.4710
-106.0400 -77.5660
-106.2500 -77.8050
-106.2900 -77.8570
-106.3000 -77.8680
-106.3000 -77.8710
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,您可以将第一个数据点附加到数据集四次,因为这意味着过滤器将产生相同数量的点.然而,这是一个非常粗略的解决方案,因为您正在创建新数据.这可以非常简单地实现,例如,如果调用您的数据集myArray
:
firstEntry = myArray(1,:);
myNewArray = [firstEntry; firstEntry; firstEntry; firstEntry; myArray];
Run Code Online (Sandbox Code Playgroud)
这将创建四个等于第一个数据点的数据点,然后允许您将低通滤波器应用于数据,并使其从同一点开始.
希望这会有所帮助,但值得注意的是,过滤始终会导致数据丢失.
因为您不想实现它但希望其他人:上述理论是正确的,但您需要在向量的末尾添加2个值:
x_last = xcor_i(end);
y_last = ycor_i(end);
xcor_i = [xcor_i;x_last;x_last];
ycor_i = [ycor_i;y_last;y_last];
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,目前的结局非常接近.