0

我尝试使用 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 应该是什么样子:正确的情节

这是我的情节:我的错误情节

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

4

1 回答 1

0

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()

样本图

于 2020-03-29T20:40:38.257 回答