Прямая линия при представлении фильтра нижних частот в Python
Я пытаюсь реализовать фильтр нижних частот с помощью окна Хаммонда. Частота среза - 0,3, а порядок фильтра - 21. Моя проблема в том, что у меня прямая линия, и она не пересекает представленные точки. Вот код:
from pylab import *
import scipy.signal as signal
import matplotlib.pyplot as plt
#Plot step and impulse response
def impz(b,a=1):
l = len(b)
impulse = repeat(0.,l); impulse[0] =1.
x = arange(0,l)
response = signal.lfilter(b,a,impulse)
subplot(211)
stem(x, response)
ylabel('Amplitude')
xlabel(r'Index')
title(r'Impulse response')
n = 21
a = signal.firwin(n, cutoff = 0.3, window = "hamming")
#Impulse and step response
figure(2)
impz(a)
show()
Я прикрепил вам, как должен выглядеть пиплот:
Почему на последней картинке красная линия не пересекает точки сюжета? Есть идеи, почему? Спасибо!
1 ответ
plt.stem
рисует точки с вертикальными линиями, соединенными базовой линией, как показано на втором графике. Для рисования точек и связанных отрезков линий есть plt.plot
со многими вариантами.
Обратите внимание, что обычно pyplot
импортируется как plt
. Таким образом, люди могут быстро увидеть, где происходит построение связанного кода, что упрощает понимание и поддержку.
По аналогии, numpy
импортируется как np
. Функции Numpy могут работать с полными массивами, аналогично работе с отдельными переменными ( "широковещательная передача"), которая работает нормально только тогда, когда все функции и массивы используют numpy. Префиксnp
помогает визуально это проверить.
Вот пример кода со стандартным способом импорта pyplot и numpy. И с призывом кplt.plot
получить участок, подобный желаемому. Переменная в основном коде переименована вb
позвонить в impz
за функцией легче следить.
import matplotlib.pyplot as plt
import numpy as np
import scipy.signal as signal
# Plot step and impulse response
def impz(b, a=1):
l = len(b)
impulse = np.repeat(0., l)
impulse[0] = 1.
x = np.arange(0, l)
response = signal.lfilter(b, a, impulse)
plt.subplot(211)
# plt.stem(x, response)
plt.plot(x, response, color='blueviolet', marker='o', markerfacecolor='none', markeredgecolor='dodgerblue')
plt.ylabel('Amplitude')
plt.xlabel('Index')
plt.title('Impulse response')
n = 21
b = signal.firwin(n, cutoff=0.3, window="hamming")
# Impulse and step response
plt.figure(2)
impz(b)
plt.show()