簡體   English   中英

如何在Python中繪制連續的正弦波?

[英]How to plot a continuous sine wave in Python?

我試圖模擬使用Python從示波器生成的正弦波的顯示。 當我試圖僅僅模擬它(而不是從示波器中提取數據)時,我想知道如何顯示連續的正弦波。 我有設備的采樣率(200MHz - 1GS / s),我的波的頻率(1MHz)和幅度(1V)。 數據將以微秒為單位進行查看。 我已經在StackOverflow上閱讀了各種答案,並且遇到了有不規則波形或其他類似情節的問題。 有沒有辦法讓這些數據顯示如下? 我希望模擬示波器數據輸出,對於1MHz頻率,100MS / s采樣率,幅度為1V。

第二個問題是能夠連續繪制這個波。 例如,當使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM