SciPy
前回、2次元ndarrayのそれぞれの行で条件を満たす最後の要素のインデックスを取得する方法を紹介しました。

今回はSciPyを使ってノコギリ波、三角波、矩形波、チャープ信号の生成方法を紹介します。
それでは始めていきましょう。
ノコギリ波と三角波
まずはノコギリ波と三角波です。
この二つは同じ関数「scipy.signal.sawtooth」を使って生成することができます。
基本的な使い方としては「sawtooth(X値のリスト)」です。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 100.01, 0.01)
y_list = signal.sawtooth(x_list)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

周期は「2π」で1周期なので、X値のリストを0から1、そしてそのリストに2π×5とすると5つの0から1の間に5つの山を持つノコギリ波を生成することができます。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 1.01, 0.01)
y_list = signal.sawtooth(2 * np.pi * 5 * x_list) #2pi = 1
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

「width=比率」のオプションを追加すると山の位置を指定することができます。
デフォルトでは「1」、つまり周期の一番最後になっていますが、「0」にすると一番最初にすることができます。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 1.01, 0.01)
y_list = signal.sawtooth(2 * np.pi * 5 * x_list, width=0)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

三角波はこの山の位置が真ん中に来ている波なので、「width=0.5」とすると生成することができます。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 1.01, 0.01)
y_list = signal.sawtooth(2 * np.pi * 5 * x_list, width=0.5)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

矩形波
矩形波を生成するには「scipy.signal.square」を使います。
使い方は「square(X値のリスト)」で、sawtoothと同じく2πで1周期です。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 1.01, 0.01)
y_list = signal.square(2 * np.pi * 5 * x_list)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

「duty=デューティ比」を追加すると矩形波の幅を変えることができます。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 1.01, 0.01)
y_list = signal.square(2 * np.pi * 5 * x_list, duty=0.7)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

チャープ信号
チャープ信号とは信号の周波数が連続的に変化する信号のことです。
「spicy.signal.chirp」を使って生成でき、使い方は「chirp(X値のリスト, 最初の周波数, 時間, 最後の周波数)」です。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 10.01, 0.01)
y_list = signal.chirp(x_list, 5, 10, 0.1)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

上はダウンチャープの例ですが、最初の周波数と最後の周波数を入れ替えるとアップチャープにすることもできます。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 10.01, 0.01)
y_list = signal.chirp(x_list, 0.1, 10, 5)
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()

周波数の変化のさせ方を「method」のオプション引数を与えることで変えることができます。
デフォルトは「linear」で、他に「quadratic」、「logarithmic」、「hyperbolic」があります。
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 10.01, 0.01)
y_list = signal.chirp(x_list, 5, 10, 0.1, method="quadratic")
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 10.01, 0.01)
y_list = signal.chirp(x_list, 5, 10, 0.1, method="logarithmic")
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
x_list = np.arange(0, 10.01, 0.01)
y_list = signal.chirp(x_list, 5, 10, 0.1, method="hyperbolic")
fig = plt.figure()
plt.clf()
plt.plot(x_list, y_list)
plt.show()
実行結果

次回はブラウザでArduinoやESP32、STM32、Raspberry Pi PicoをシミュレートできるWOKWiを紹介します。
ではでは今回はこんな感じで。
コメント