过滤器给出负值(SciPy过滤器)

时间:2018-06-07 13:47:51

标签: python numpy matplotlib scipy signals

使用scipy.signal.butter(或椭圆)过滤我的数据集(np数组)时遇到一个问题。我的数据只有正值,但在过滤后,输出数组中有负值。代码和图形如下所示。问题:为什么会出现负值以及如何解决?提前谢谢!

加载数据:

 data_s = pd.read_csv('C:/Users/HP/Desktop/Python and programming/Jupyter/Filter/320_Hz.dat', header=None, squeeze=True)
    data = data_s.values
    #"turn over" the negative parts
    for i in range(len(data)): 
        if data[i] < 0:
            data[i] = abs(data[i]) * 2

Filt员工:

F_rate = 320.0
sample_time = 1 / F_rate

low = 79.9
high = 80.1
low_d = low / (0.5 * F_rate)
high_d = high / (0.5 * F_rate)

Wn = [low_d,high_d] 
#b, a = signal.ellip(4, 3, 40, Wn, 'bandpass', analog=False) 
b,a = signal.butter(6, Wn, 'bandpass', analog=False)

output = signal.filtfilt(b, a, data) 
print(output)
plt.magnitude_spectrum(output, Fs=F_rate)

输出:

[  7.93572645e-12   1.82355646e-12  -8.99759647e-11 ...,  -5.01622276e+03
   1.18142432e+04   4.98038137e+03]

输出数据的频谱:

enter image description here

输入数据:

enter image description here

输出数据(负值):

enter image description here

1 个答案:

答案 0 :(得分:1)

  

为什么出现负值

通常,过滤可以产生输入范围之外的值。特别是,用带通滤波数据可以去除低频分量。可以想象的最低频率成分是平均值,它被完全去除。换句话说:带通滤波器将数据置于零。只有在数据包含正值和负值时才可以这样做。

  

我该如何解决?

这个很棘手。要告诉如何“修复”它,需要为什么数据被过滤为什么输出应该只是正面。没有什么可以解决的,因为过滤器正在完成它的支持。

以下是一些可用选项:

  • 确定您的期望并接受您获得的负面价值。
  • 也许你不需要带通?使用仅移除高频但不接触低频的高通滤波器。
  • np.min(output)或其他偏移添加到输出
  • 将相同的变换应用于输入上使用的输出:if data[i] < 0: data[i] = abs(data[i]) * 2(尽管从我的信号处理角度来看这感觉非常奇怪)