Фильтр дает отрицательные значения (фильтр SciPy) - PullRequest
0 голосов
/ 07 июня 2018

У меня есть одна проблема с фильтрацией моего набора данных (массив np) с scipy.signal.butter (или эллипсом).Мои данные имеют только положительные значения, но после фильтрации в выходном массиве есть отрицательные значения.Код и графика показаны ниже.Вопрос: почему появляются отрицательные значения и как я могу это исправить? Заранее спасибо!

Загрузить данные:

 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)

Out:

[  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 голосов
/ 07 июня 2018

почему появляются отрицательные значения

Как правило, фильтрация может давать значения вне диапазона ввода.В частности, фильтрация данных с полосой пропускания удаляет низкочастотные компоненты.Наиболее низкочастотный компонент, который можно себе представить, - это среднее значение, которое полностью удалено.Другими словами: полосовой фильтр центрирует данные на нуле .Это возможно только в том случае, если данные содержат как положительные, так и отрицательные значения.

как это исправить?

Это хитро.Чтобы сказать, как его «исправить», нужно , почему данные фильтруются и , почему выходные данные должны быть только положительными .На самом деле ничего не нужно исправлять, потому что фильтр делает именно то, что должен делать.

Вот некоторые из доступных опций:

  • Исправьте свои ожидания и примите этоВы получаете отрицательные значения.
  • Может быть, вам не нужен пропуск?Используйте фильтр верхних частот, который удаляет только высокие частоты, но не затрагивает низкие частоты.
  • Добавьте np.min(output) или другое смещение к выходу
  • Примените то же преобразование к выходу, который былиспользуется на входе: if data[i] < 0: data[i] = abs(data[i]) * 2 (хотя с моей точки зрения на обработку сигналов это выглядит очень странно)
...