用Python编写一个信号发生器软件 (1)可以产生正弦/三角波/方波波形 (2)有横纵坐标(坐标可自适应屏幕大小) (3)可预置波形、幅度、频率、直流偏置(相位可选作)
时间: 2024-02-02 21:05:18 浏览: 204
以下是一个简单的Python信号发生器软件代码,实现了正弦/三角波/方波波形,并可自适应屏幕大小,预置波形、幅度、频率、直流偏置等功能:
```python
import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt
class SignalGenerator:
def __init__(self, master):
self.master = master
self.master.title("Signal Generator")
self.master.geometry("500x500")
self.waveform_var = tk.StringVar(value="Sine")
self.amplitude_var = tk.DoubleVar(value=1.0)
self.frequency_var = tk.DoubleVar(value=1.0)
self.phase_var = tk.DoubleVar(value=0.0)
self.dc_offset_var = tk.DoubleVar(value=0.0)
self.fig = plt.Figure(figsize=(4, 4), dpi=100)
self.ax = self.fig.add_subplot(111)
self.ax.set_xlabel("Time")
self.ax.set_ylabel("Amplitude")
self.canvas = FigureCanvasTkAgg(self.fig, self.master)
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
self.toolbar = NavigationToolbar2Tk(self.canvas, self.master)
self.toolbar.update()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
self.waveform_label = tk.Label(self.master, text="Waveform:")
self.waveform_label.pack(side=tk.LEFT, padx=10, pady=10)
self.waveform_menu = tk.OptionMenu(self.master, self.waveform_var, "Sine", "Triangle", "Square", command=self.update_waveform)
self.waveform_menu.pack(side=tk.LEFT, padx=10, pady=10)
self.amplitude_label = tk.Label(self.master, text="Amplitude:")
self.amplitude_label.pack(side=tk.LEFT, padx=10, pady=10)
self.amplitude_scale = tk.Scale(self.master, variable=self.amplitude_var, from_=0.1, to=10.0, resolution=0.1, orient=tk.HORIZONTAL, command=self.update_signal)
self.amplitude_scale.pack(side=tk.LEFT, padx=10, pady=10)
self.frequency_label = tk.Label(self.master, text="Frequency:")
self.frequency_label.pack(side=tk.LEFT, padx=10, pady=10)
self.frequency_scale = tk.Scale(self.master, variable=self.frequency_var, from_=0.1, to=10.0, resolution=0.1, orient=tk.HORIZONTAL, command=self.update_signal)
self.frequency_scale.pack(side=tk.LEFT, padx=10, pady=10)
self.phase_label = tk.Label(self.master, text="Phase:")
self.phase_label.pack(side=tk.LEFT, padx=10, pady=10)
self.phase_scale = tk.Scale(self.master, variable=self.phase_var, from_=-np.pi, to=np.pi, resolution=0.1, orient=tk.HORIZONTAL, command=self.update_signal)
self.phase_scale.pack(side=tk.LEFT, padx=10, pady=10)
self.dc_offset_label = tk.Label(self.master, text="DC Offset:")
self.dc_offset_label.pack(side=tk.LEFT, padx=10, pady=10)
self.dc_offset_scale = tk.Scale(self.master, variable=self.dc_offset_var, from_=-5.0, to=5.0, resolution=0.1, orient=tk.HORIZONTAL, command=self.update_signal)
self.dc_offset_scale.pack(side=tk.LEFT, padx=10, pady=10)
self.quit_button = tk.Button(self.master, text="Quit", command=self.master.quit)
self.quit_button.pack(side=tk.BOTTOM, padx=10, pady=10)
self.update_signal()
def update_signal(self, *args):
t = np.linspace(0, 1, 1000)
amplitude = self.amplitude_var.get()
frequency = self.frequency_var.get()
phase = self.phase_var.get()
dc_offset = self.dc_offset_var.get()
waveform = self.waveform_var.get()
if waveform == "Sine":
y = amplitude * np.sin(2 * np.pi * frequency * t + phase) + dc_offset
elif waveform == "Triangle":
y = 2 * amplitude * (np.abs(2 * (t - np.floor(t + 0.5))) - 0.5) + dc_offset
elif waveform == "Square":
y = amplitude * np.sign(np.sin(2 * np.pi * frequency * t + phase)) + dc_offset
self.ax.clear()
self.ax.plot(t, y)
self.ax.set_xlim([0, 1])
self.ax.set_ylim([-10, 10])
self.canvas.draw()
def update_waveform(self, *args):
waveform = self.waveform_var.get()
if waveform == "Sine":
self.phase_scale.config(state=tk.NORMAL)
else:
self.phase_scale.config(state=tk.DISABLED)
root = tk.Tk()
app = SignalGenerator(root)
root.mainloop()
```
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)