[英]How to plot a continuous sine wave in Python?
我试图模拟使用Python从示波器生成的正弦波的显示。 当我试图仅仅模拟它(而不是从示波器中提取数据)时,我想知道如何显示连续的正弦波。 我有设备的采样率(200MHz - 1GS / s),我的波的频率(1MHz)和幅度(1V)。 数据将以微秒为单位进行查看。 我已经在StackOverflow上阅读了各种答案,并且遇到了有不规则波形或其他类似情节的问题。 有没有办法让这些数据显示如下?
第二个问题是能够连续绘制这个波。 例如,当使用Matplotlib时,如果我缩小它并不显示持续超过我的间隔的波。 有没有办法让波浪不断代表? 我不想被束缚到Matplotlib,所以我正在寻找其他解决方案,这些解决方案在两个方向上不断创建(附加?)数据。 如果这是不可能的,是否可以在每个方向上建立某种数量的波长?
非常感谢!
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
Fs = 20E3
f = 1E6
sample = Fs/f
print(sample)
x = np.arange(sample)
y = 100*np.sin(2 * np.pi * f * x / Fs)
plt.plot(x, y)
plt.show()
您可以使用matplotlib.animation
来实现您的目标。
我采用了一个模拟示波器的现有示例,并根据您的需要进行调整(例如正弦波和连续绘图)。
关于连续绘图:我设置了一个continous
变量,您可以选择是否要连续绘制(无法缩放)或不绘制(能够缩放)。 我还没能在一个情节中结合两种功能。 因此,只需使用continous = True
运行一次代码,使用continous = False
运行一次,看看它是否符合您的需求。
但我认为这可能是绘制连续正弦波的良好开端。
import numpy as np
from matplotlib.lines import Line2D
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# Your Parameters
amp = 1 # 1V (Amplitude)
f = 1000 # 1kHz (Frequency)
fs = 200000 # 200kHz (Sample Rate)
T = 1/f
Ts = 1/fs
# Select if you want to display the sine as a continous wave
# True = Continous (not able to zoom in x-direction)
# False = Non-Continous (able to zoom)
continous = True
x = np.arange(fs)
y = [ amp*np.sin(2*np.pi*f * (i/fs)) for i in x]
class Scope(object):
def __init__(self, ax, maxt=2*T, dt=Ts):
self.ax = ax
self.dt = dt
self.maxt = maxt
self.tdata = [0]
self.ydata = [0]
self.line = Line2D(self.tdata, self.ydata)
self.ax.add_line(self.line)
self.ax.set_ylim(-amp, amp)
self.ax.set_xlim(0, self.maxt)
def update(self, y):
lastt = self.tdata[-1]
if continous :
if lastt > self.tdata[0] + self.maxt:
self.ax.set_xlim(lastt-self.maxt, lastt)
t = self.tdata[-1] + self.dt
self.tdata.append(t)
self.ydata.append(y)
self.line.set_data(self.tdata, self.ydata)
return self.line,
def sineEmitter():
for i in x:
yield y[i]
fig, ax = plt.subplots()
scope = Scope(ax)
# pass a generator in "sineEmitter" to produce data for the update func
ani = animation.FuncAnimation(fig, scope.update, sineEmitter, interval=10,
blit=True)
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.