如何在csv文件上执行高通过滤?

时间:2015-02-14 11:12:11

标签: csv highpass-filter

我有一个包含加速计数据的csv文件,我会通过对数据应用高通滤波器来分析它。不幸的是,我似乎无法弄清楚如何在Excel中执行此操作,也无法找到允许我这样做的简单免费软件。

有什么想法吗?

以下是我想分析的两个数据集的图表(如果您认为这有帮助,我可以提供csv)。这些基本上是从电话获得的3D线性加速度幅度,相对于时间以毫秒为单位绘制。我正试图检测快速,急剧的变化/峰值。

Dataset 1 Dataset 2

我可以看到这里有一些真正的低频成分(大约几赫兹),但我无法告诉你我的频率截止是什么,但我想我会在发现之后发现我能够看到输出后进行一些实验 - 这就是为什么我需要一种快速而肮脏的方法来测试HPF中这些数据的几个截止频率。

2 个答案:

答案 0 :(得分:1)

您可以使用Excel VBA并实现n阶FIR / IIR滤波器。我建议使用更强大的语言,如Python或C ++,它可以读取文件并解析它的值。你也应该使用FIR滤波器,因为它们可以保证稳定并且更简单。在此处查看有关数字滤波器的信息 - http://www-sigproc.eng.cam.ac.uk/foswiki/pub/Main/3F3/3F3__Digital_Signal_Processing_(DSP)_2015_Section_2.pdf

这将解释实现IIR和FIR滤波器时需要了解的所有内容。基本上,您可以根据采样率在复杂平面中选择您想要的特定频率响应的极点和零点。例如,如果您以500 Hz的频率进行采样,并且您希望仅保留400 Hz以上的所有值,则可以在相位4 * pi / 5之下放置一些零,并且幅度可能大约为0.1。也许杆(总是在单位圆内)可能是4.5 * pi / 5。然后,您可以使用算法实现这些极点和零点,如讲义中所示,有不同的方法,有些方法比其他方法更有效(但要理解起来更复杂)。但是你必须自己阅读理论或者去信号处理堆栈交换网站。

此外,如果您可以访问MATLAB,它将在几行中为您完成所有这些操作。但是你仍然需要理解这个理论,这样你就可以放置你的极点和零点。如果您没有访问权限或MATLAB所需的£,请使用Octave代替。请参阅此Octave包:http://cran.r-project.org/web/packages/signal/signal.pdf。它将为您提供一个可以实现多种类型过滤器的衬垫,例如:巴特沃思或切比雪夫。

这里没有人会为您提供完整的解决方案,我们可以回答您在途中遇到的小技术问题。

底线:了解过滤的基础知识,然后使用MATLAB / Octave

编辑:我做了一些研究,发现你可以在Python中使用scipyhttp://docs.scipy.org/doc/scipy/reference/signal.html

设计FIR滤波器: http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html#scipy.signal.firwin

实施IIR / FIR滤波器: http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html#scipy.signal.lfilter

import scipy.signal
fir = scipy.signal.firwin2(11, [0, 0.2, 0.4, 0.6, 0.8, 1], [0, 0, 0, 1, 1, 1]) #Design FIR Highpass filter, 11 is the filter order (higher = better quality but more computation, the first array is a sampling of frequency points (0 being 0 Hz and 1 being the Nyquist frequency) and the second array is the corresponding gain values at those points
x = [6, 3]*10
output = scipy.signal.lfilter(fir, [1], x)
print output

警告:虽然上述方法确实有效,但很难让它从任意增益规格产生实际所需的频率响应。这是因为信号处理很复杂!如果您只是将幅度响应指定为砖墙,则会在阻带中产生明显的波纹。我似乎无法使用scipy得到合理的结果,因为我没有任何经验。使用firwin方法(如果您不知道任何信号处理,这是一个更好的主意),我无法弄清楚如何使其工作,因为高通和低通FIR似乎产生相同的输出

我建议使用Octave,fir1(40,0.7,'high')会产生漂亮的频率响应(尝试freqz(fir1(400, 0.7, 'high')))。

然后,您可以使用fftfilt(fir1(400, 0.7, 'high'), x),其中x是您的输入。

答案 1 :(得分:1)

用于消除低频噪声的简单IIR高通滤波器很容易直接在Excel电子表格中实现。你不需要使用Matlab,Octave甚至VBA,对于这样一个要求不高的应用程序,你几乎肯定不需要学习FIR滤波器设计的复杂性。

new_hpf =(prev_hpf + new_sample - prev_sample)/(1 + time_constant / sample_period)

该方法在http://excelunusual.com/basic-filters-2/

的示例电子表格中进行了演示

如果您想要更清晰地切断,可以尝试级联另一个过滤器。请注意,简单递归滤波器的相位响应不是线性的,但如果您只对数据的大小感兴趣并且只想删除低频漂移,那么这应该可以正常工作。