Я пытаюсь настроить фильтр на Python, и я застрял в базовых вещах.
Это функция, которую я должен реализовать:
y[n] = (1 − λ) · x[n] + λ · y[n − 1]
Я читаю m-файл и применяю фильтр.
Вот код:
import sys
import numpy as np
import matplotlib.pyplot as plt
y = np.loadtxt('acs712_192us.m')
size = len(y)
x = np.arange(0, size)
out = []
lamb = 0.9
for i in range(0, len(y)):
out.append(((1-lamb) * y[i]) + (lamb * out[i - 1]))
plt.plot(x, y)
plt.plot(x, out)
plt.show()
Когда я запускаю эту программу, получаю следующую ошибку:
File "main_LI.py", line 15, in out.append(((1-lamb) * y[i]) + (lamb * out[i - 1])) IndexError: list index out of range
Я знаю, что не могу получить доступ к позиции [-1] (в первом цикле), может быть, это проблема?
У кого-нибудь есть советы?
Спасибо вам, ребята!
Кажется, что ваша повторяющаяся связь не имеет отправной точки.
Я сомневаюсь, что для начала в out должно быть начальное значение.
Это файл .txt с 512 значениями (0–511). Я могу получить y [i]
Что сказал user2357112. Какой должен быть out[0]?
@MatheusBernardi, что такое out[0]?
out [0] = (1 - 0,9) * y [0] + 0,9 * out [-1] Мне нужно игнорировать этот первый цикл (я полагаю), потому что этот доступ выходит [-1]






Во-первых, вы можете использовать отрицательные показатели в Python. Проблема в том, что вы указываете несуществующий индекс.
out изначально представляет собой пустой список, поэтому проблема в том, что вы пытаетесь получить доступ к индексу, которого не существует на первой итерации:
import sys
import numpy as np
import matplotlib.pyplot as plt
y = np.loadtxt('acs712_192us.m')
size = len(y)
x = np.arange(0, size)
out = []
lamb = 0.9
for i in range(len(y)):
if i == 0:
out.append(value) # value is what you want out[0] to be
else:
out.append(((1-lamb) * y[i]) + (lamb * out[i - 1]))
plt.plot(x, y)
plt.plot(x, out)
plt.show()
Оно работает! Спасибо за помощь, извините, если вопрос был дурацким.
Для этого можно довольно легко использовать составление списков.
l = 0.9
x = np.arange(0, 10)
filtered = [x[i] if i == 0 else (1-l)*x[i] + l*x[i-1] for i in range(0,len(x))]
>>> print(filtered)
[0, 0.09999999999999998, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1000000000000005, 7.1, 8.1]
это тот результат, которого вы ожидаете?
Это тоже поможет! Спасибо
что содержит ваш м файл?