パルス幅一定なら,それっぽいのが出力できます。
リアルタイム描画など,基本的なところは「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]?"))