Прямая линия при отображении фильтра нижних частот в Python - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь реализовать фильтр нижних частот, используя окно Хаммонда. Частота среза равна 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()

Я прикрепил вас, как должен выглядеть пиплот: correct plot

И вот мой сюжет: my wrong plot

Почему красная линия на последнем снимке не пересекает точки графика? Есть идеи почему? Спасибо!

1 Ответ

0 голосов
/ 29 марта 2020

plt.stem dr aws точек с вертикальными линиями, соединенными через базовую линию, как показано на втором графике. Чтобы нарисовать точки и соединенные отрезки, есть 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()

sample plot

...