当前位置:  开发笔记 > 程序员 > 正文

在matlab中使用低通滤波器来获得相同的数据端点

如何解决《在matlab中使用低通滤波器来获得相同的数据端点》经验,为你挑选了1个好方法。

这是我上一个问题的扩展: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

代码(由@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));

输出:

在此输入图像描述

在上面的示例中,端点(左侧)对于已过滤和未过滤的轨道是不同的.我怎样才能确保它是一样的?



1> Lui..:

你的问题很模糊,并没有真正的具体问题.我假设您希望过滤后的数据与测量数据在同一点开始,但不确定为什么这种情况不会发生,以及如何进行.

低通滤波器是一种降低快速变化影响的滤波器.这样做的一种方法和这里似乎使用的方法是使用滚动平均值.滚动平均值只是先前数据点的平均值(平均值).看起来您正在使用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];

这给出了以下内容: 过滤的数据有重复的结尾.

正如你所看到的那样,目前的结局非常接近.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有