パルス幅一定なら,それっぽいのが出力できます。
リアルタイム描画など,基本的なところは「Matplotlibで正弦波をリアルタイム描画する」の内容と同じです。
取り敢えずプログラムを…
# Python3
# N=160辺りで落ち着いてくる
import math
import numpy as np
import matplotlib.pyplot as plt
def square(n, f): # n:重み,f:周波数
pi = math.pi
plt.title("square-wave")
plt.ylabel("VoltageRatio")
plt.xlabel("Range:0-1[s]")
x = np.linspace(0, 2*pi, 2000)
plt.ylim(-1, 1)
plt.xlim(0, 2000)
# 初期値
N = 1
y = 0
y1 = 0
for N in range(1, n):
# 矩形波を作る式。Σで積んでくと矩形波に近づく。
y = (1/(2*N-1)) * np.sin((2*N - 1)*x * f)
y1 += y
N += 1
plt.plot(y1, color='red')
plt.pause(0.1)
print("周波数:",f ,"[Hz]・", "重み:N=", n)
plt.cla()
f = float(input("周波数は何[Hz]?"))
if f > 0 :
n = 0
while n < 200 :
n += 1
square(n, f)
else:
f = float(input("周波数は何[Hz]?"))
今回は矩形波の生成過程が見たかったので,周波数fではなく重みNを変化させてループさせています。
矩形波を作る式は以下の通り。
Nは重み,fは周波数で,Nを増やすと矩形波に近づいていきます。
おまけ(ってほどでもないか)
数式を少し弄って y > 0 だけで表示するようにしてみました。
# Python3
import math
import numpy as np
import matplotlib.pyplot as plt
def square(n, f): # n:重み,f:周波数
pi = math.pi
plt.title("square-wave")
plt.ylabel("VoltageRatio")
plt.xlabel("Range:0-1[s]")
x = np.linspace(0, 2*pi, 2000)
plt.ylim(0, 1)
plt.xlim(0, 2000)
# 初期値
N = 1
y = 0
y1 = 0
for N in range(1, n):
# 矩形波を作る式。Σで積んでくと矩形波に近づく。
y = (1/(2*N-1)) * np.sin((2*N - 1)*x * f)
y1 += y
N += 1
bias = 0.39
plt.plot((y1 * 0.5)+bias, color='red')
plt.pause(0.1)
print("周波数:",f ,"[Hz]・", "重み:N=", n)
plt.cla()
f = float(input("周波数は何[Hz]?"))
if f > 0 :
n = 0
while n < 200 :
n += 1
square(n, f)
else:
f = float(input("周波数は何[Hz]?"))