0

ハモンド ウィンドウを使用してローパス フィルターを実装しようとしています。カットオフ周波数は 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 2番目のプロットに示すように、ベースラインを介して接続された垂直線でドットを描画します. 点と接続された線分を描画するには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 に答える