在 Python 中表示低通滤波器时的直线

Straight Line when representing Lowpass filter in Python

我尝试使用 Hammond Window 实现低通滤波器。截止频率是 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()

我附上了你的pyplot应该是什么样子:

这是我的情节:

为什么最后一张图中的红线没有穿过剧情点?任何想法为什么?谢谢!

plt.stem draws dots with vertical lines connected via a baseline, as shown in your second plot. To draw dots and connected line segments, there is plt.plot 有很多选项。

请注意,通常 pyplot 被导入为 plt。这样,人们可以快速看到绘图相关代码发生在哪里,从而更容易理解和维护。

同样,numpy 被导入为 np。 Numpy 函数可以处理完整的数组,类似于处理单个变量 ("broadcasting"),这仅在所有函数和数组都使用 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()