在matlab中使用低通滤波器获得数据的相同端点
这是我上一个问题的延伸: 我正在用偷听到的摄像机记录人们。我用一些软件记录了每个人的头部轨迹。我想从轨道周期性由于头部摆动 我采用低通巴特沃斯滤波器。我希望已过滤轨迹的起点和终点与未过滤轨迹相同在matlab中使用低通滤波器获得数据的相同端点,matlab,filter,Matlab,Filter,这是我上一个问题的延伸: 我正在用偷听到的摄像机记录人们。我用一些软件记录了每个人的头部轨迹。我想从轨道周期性由于头部摆动 我采用低通巴特沃斯滤波器。我希望已过滤轨迹的起点和终点与未过滤轨迹相同 Data: K>> [xcor_i,ycor_i ] ans = -101.7000 -77.4040 -102.4200 -77.4040 -103.6600 -77.4040 -103.9300 -76.6720 -103.990
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
代码(由@SleuthEye回答):
输出:
在上面的示例中,已过滤轨迹和未过滤轨迹的端点(左侧)不同。我怎样才能保证它是一样的?你的问题很含糊,没有具体的问题。我假设您希望筛选数据与测量数据在同一点开始,但不确定为什么还没有发生,以及如何做到这一点 低通滤波器是一种降低快速变化影响的滤波器。这样做的一种方法,以及这里使用的方法,是使用滚动平均值。滚动平均值只是先前数据点的平均值。看起来您使用的是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
为了解决这个问题,您可以将第一个数据点附加到数据集中四次,因为这意味着过滤器将产生相同数量的点。然而,这是一个相当粗糙的解决方案,因为您正在创建新数据。这可以非常简单地实现,例如,如果您的数据集被称为myArray
:
firstEntry = myArray(1,:);
myNewArray = [firstEntry; firstEntry; firstEntry; firstEntry; myArray];
这将创建四个与第一个数据点相等的数据点,这将允许您对数据应用低通滤波器,并使其在同一点启动
希望这能有所帮助,尽管值得记住的是,过滤总是会导致数据丢失
因为您不想实施它,但希望其他人:
上述理论是正确的,但需要在向量末尾添加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];
这就产生了以下结果:
正如你所看到的,现在的结局几乎是一样的。你的问题很模糊,没有具体的问题。我假设您希望筛选数据与测量数据在同一点开始,但不确定为什么还没有发生,以及如何做到这一点 低通滤波器是一种降低快速变化影响的滤波器。这样做的一种方法,以及这里使用的方法,是使用滚动平均值。滚动平均值只是先前数据点的平均值。看起来您使用的是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
为了解决这个问题,您可以将第一个数据点附加到数据集中四次,因为这意味着过滤器将产生相同数量的点。然而,这是一个相当粗糙的解决方案,因为您正在创建新数据。这可以非常简单地实现,例如,如果您的数据集被称为myArray
:
firstEntry = myArray(1,:);
myNewArray = [firstEntry; firstEntry; firstEntry; firstEntry; myArray];
这将创建四个与第一个数据点相等的数据点,这将允许您对数据应用低通滤波器,并使其在同一点启动
希望这能有所帮助,尽管值得记住的是,过滤总是会导致数据丢失
因为您不想实施它,但希望其他人:
上述理论是正确的,但需要在向量末尾添加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];
这就产生了以下结果:
正如您所看到的,现在的结尾非常接近相同。在我的代码中,起点(最右边)是相同的。终点不同(最左边的点)。那么你的问题是什么?您的问题是如何使过滤结果的左端点与原始数据相同吗?如果是这样的话,试试我在回答中提出的答案。我不明白你的方法。如果您使用提供的数据并显示一个图来比较您的方法,这将是非常有用的。您的数据的格式非常不利于方便使用,而且您没有说明参数
a
和b
是什么,因此无法重新创建您所做的操作。只需将第一点重复五次,我就成功地获取了您的数据并弄清楚了您在做什么,将来您真的应该包含所有用于获取当前结果的代码。看看我编辑的答案,它看起来像我认为你想要得到的。我的代码中的起点(最右边)是相同的。终点不同(最左边的点)。那么你的问题是什么?您的问题是如何使过滤结果的左端点与原始数据相同吗?如果是这样的话,试试我在回答中提出的答案。我不明白你的方法。如果您使用提供的数据并显示一个图来比较您的方法,这将是非常有用的。您的数据的格式非常不利于方便使用,而且您没有说明参数a
和b
是什么,因此无法重新创建您所做的操作。只需将第一点重复五次,我就成功地获取了您的数据并弄清楚了您在做什么,将来您真的应该包含所有用于获取当前结果的代码。看看我编辑的答案,它看起来像是我认为你想要得到的。