Прямая линия при представлении фильтра нижних частот в 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()

Другие вопросы по тегам