Я хотел отфильтровать (низкочастотный) сигнал, который у меня есть, и когда он не работал, я начал исследовать, почему он не работает.
Я сделал несколько тестов, и я несколько удивлен поведением фильтра Баттерворта.
я определил это как в этот пост
def apply_filter(data, cutoff, fs, order=6, filter_type="low", analog=False):
nyq = 0.5 * fs
normalized_cutoff = cutoff / nyq
b,a = butter(order, normalized_cutoff, btype=filter_type, analog=analog, output="ba")
they = lfilter(b, a, data)
return(they)
если я возьму образец длиной 1000 элементов, например,
x = np.linspace(0, 2*np.pi, 1000)
y = np.sin(x) + 0.3* np.sin(10*x)
sampling_frequency = 1/ (x[-1] * 1e-3)
sampling_frequency
>> 159.15494309189532
# because i have 1000 thousand points for a "time" going up to 2 pi
plt.plot(x, y, x, apply_filter(y, cutoff=1, fs= sampling_frequency)
на который я получаю
с другой стороны, если я делаю то же самое, но с другим количеством очков, скажем, 10000, я получаю неправильный результат, и я не совсем понимаю, почему:
x = np.linspace(0, 2*np.pi, 10000)
y = np.sin(x) + 0.3* np.sin(10*x)
sampling_frequency = 1/ (x[-1] * 1e-4)
sampling_frequency
>> 1591.5494309189535
# because i have 10000 thousand points for a "time" going up to 2 pi
plt.plot(x, y, x, apply_filter(y, cutoff=1, fs= sampling_frequency)
и на этот раз я получаю
что явно не так.
Может кто-нибудь объяснить, почему это произошло? кажется, что все работает нормально на 1000 очков или меньше ...
EDIT:
Я составил график частотного отклика фильтра, и проблема появляется на этих графиках, хотя я тоже не знаю, почему он это делает.
sampling rate
>> 159.1549430918953
b, a = butter(6, 1/(sampling_rate/2))
w, h = freqz(b, a, 8000)
plt.subplot(2,1,1)
plt.xlim(0, 15)
plt.plot(0.5*sampling_rate*w/np.pi, np.abs(h))
на который я получаю
тогда как, если я сделаю
sampling_frequency *= 10
sampling_frequency
>> 1591.5494309189535
b, a = butter(6, 1/(sampling_rate/2))
w, h = freqz(b, a, 8000)
plt.subplot(2,1,1)
plt.xlim(0, 15)
plt.plot(0.5*sampling_rate*w/np.pi, np.abs(h))
тогда я получу
Мне кажется, что у функции Баттерворта есть какие-то проблемы с большим количеством баллов по какой-то причине?
спасибо за вашу помощь!