Python信号发生器编写

用Python编写一个信号发生器软件 (1)可以产生正弦/三角波/方波波形 (2)有横纵坐标(坐标可自适应屏幕大小) (3)可预置波形、幅度、频率、直流偏置(相位可选作)(4)运行结果有简单的用户软件界面
如下代码已经能实现信号发生,现在需要增加一个用户界面,并且实现坐标可自适应屏幕大小


import numpy as np
import matplotlib.pyplot as plt

# 生成正弦波信号
def generate_sine_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.sin(2*np.pi*frequency*time + phase) + dc_offset
    return time, signal

# 生成三角波信号
def generate_triangle_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.arcsin(np.sin(2*np.pi*frequency*time + phase)) * (2/np.pi) + dc_offset
    return time, signal

# 生成方波信号
def generate_square_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.sign(np.sin(2*np.pi*frequency*time + phase)) + dc_offset
    return time, signal

# 主程序
def main():
    # 获取输入
    waveform = input("请输入波形类型(正弦/三角/方波):")
    amplitude = float(input("请输入幅度:"))
    frequency = float(input("请输入频率(Hz):"))
    dc_offset = float(input("请输入直流偏置:"))
    duration = float(input("请输入持续时间(秒):"))
    phase = float(input("请输入相位:"))
    if waveform == '正弦':
        time, signal = generate_sine_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
    elif waveform == '三角':
        time, signal = generate_triangle_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
    elif waveform == '方波':
        time, signal = generate_square_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)

    # 绘制信号图形
    plt.plot(time, signal)
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.show()
   
if __name__ == '__main__':
    main()

引用new bing部分回答作答:
要增加一个用户界面,您可以使用Python的Tkinter模块,它是Python的内置GUI库。以下是一个简单的示例,展示如何使用Tkinter在窗口中放置控件,并获取用户输入。

import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt

# 生成正弦波信号
def generate_sine_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.sin(2*np.pi*frequency*time + phase) + dc_offset
    return time, signal

# 生成三角波信号
def generate_triangle_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.arcsin(np.sin(2*np.pi*frequency*time + phase)) * (2/np.pi) + dc_offset
    return time, signal

# 生成方波信号
def generate_square_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.sign(np.sin(2*np.pi*frequency*time + phase)) + dc_offset
    return time, signal

# 处理按钮点击事件
def handle_button_click():
    waveform = waveform_var.get()
    amplitude = amplitude_scale.get()
    frequency = frequency_scale.get()
    dc_offset = dc_offset_scale.get()
    duration = duration_scale.get()
    phase = phase_scale.get()
    if waveform == '正弦':
        time, signal = generate_sine_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
    elif waveform == '三角':
        time, signal = generate_triangle_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
    elif waveform == '方波':
        time, signal = generate_square_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
    plt.plot(time, signal)
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.show()

# 创建窗口
window = tk.Tk()
window.title('信号发生器')

# 创建控件
waveform_label = tk.Label(window, text='波形类型:')
waveform_label.grid(row=0, column=0, padx=10, pady=10)
waveform_var = tk.StringVar()
waveform_var.set('正弦')
waveform_optionmenu = tk.OptionMenu(window, waveform_var, '正弦', '三角', '方波')
waveform_optionmenu.grid(row=0, column=1, padx=10, pady=10)

amplitude_label = tk.Label(window, text='幅度:')
amplitude_label.grid(row=1, column=0, padx=10, pady=10)
amplitude_scale = tk.Scale(window, from_=0, to=10, resolution=0.1, orient=tk.HORIZONTAL)
amplitude_scale.set(1.0)
amplitude_scale.grid(row=1, column=1, padx=10, pady=10)

frequency_label = tk.Label(window, text='频率(Hz):')
frequency_label.grid(row=2, column=0, padx=10, pady=10)
frequency_scale = tk.Scale(window, from_=0, to=1000,
resolution=1, orient=tk.HORIZONTAL)
frequency_scale.set(440)
frequency_scale.grid(row=2, column=1, padx=10, pady=10)

phase_label = tk.Label(window, text='相位(°):')
phase_label.grid(row=3, column=0, padx=10, pady=10)
phase_scale = tk.Scale(window, from_=-180, to=180, resolution=1, orient=tk.HORIZONTAL)
phase_scale.set(0)
phase_scale.grid(row=3, column=1, padx=10, pady=10)

dc_offset_label = tk.Label(window, text='直流偏置:')
dc_offset_label.grid(row=4, column=0, padx=10, pady=10)
dc_offset_scale = tk.Scale(window, from_=-10, to=10, resolution=0.1, orient=tk.HORIZONTAL)
dc_offset_scale.set(0)
dc_offset_scale.grid(row=4, column=1, padx=10, pady=10)

duration_label = tk.Label(window, text='持续时间(s):')
duration_label.grid(row=5, column=0, padx=10, pady=10)
duration_scale = tk.Scale(window, from_=0, to=10, resolution=0.1, orient=tk.HORIZONTAL)
duration_scale.set(1.0)
duration_scale.grid(row=5, column=1, padx=10, pady=10)

generate_button = tk.Button(window, text='生成信号', command=handle_button_click)
generate_button.grid(row=6, column=0, columnspan=2, padx=10, pady=10)

#运行窗口
window.mainloop()


为了增加用户界面,我们可以考虑使用 Python 自带的 tkinter 模块。下面是一个简单的例子,你可以在此基础上进行相应的修改和扩展。

import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk

# 生成正弦波信号
def generate_sine_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.sin(2*np.pi*frequency*time + phase) + dc_offset
    return time, signal

# 生成三角波信号
def generate_triangle_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.arcsin(np.sin(2*np.pi*frequency*time + phase)) * (2/np.pi) + dc_offset
    return time, signal

# 生成方波信号
def generate_square_wave(frequency, amplitude, phase, dc_offset, sample_rate, duration):
    time = np.arange(0, duration, 1/sample_rate)
    signal = amplitude * np.sign(np.sin(2*np.pi*frequency*time + phase)) + dc_offset
    return time, signal

class SignalGeneratorApp:
    def __init__(self, master):
        self.master = master
        master.title("信号发生器")

        # 波形类型、幅度、频率、直流偏置、持续时间、相位
        self.waveform_var = tk.StringVar(master, value='正弦')
        self.amplitude_var = tk.DoubleVar(master, value=1)
        self.frequency_var = tk.DoubleVar(master, value=1000)
        self.dc_offset_var = tk.DoubleVar(master, value=0)
        self.duration_var = tk.DoubleVar(master, value=1)
        self.phase_var = tk.DoubleVar(master, value=0)

        # 波形类型
        waveform_label = tk.Label(master, text="波形类型")
        waveform_label.grid(row=0, column=0, padx=5, pady=5)
        waveform_entry = tk.Entry(master, textvariable=self.waveform_var)
        waveform_entry.grid(row=0, column=1, padx=5, pady=5)

        # 幅度
        amplitude_label = tk.Label(master, text="幅度")
        amplitude_label.grid(row=1, column=0, padx=5, pady=5)
        amplitude_entry = tk.Entry(master, textvariable=self.amplitude_var)
        amplitude_entry.grid(row=1, column=1, padx=5, pady=5)

        # 频率
        frequency_label = tk.Label(master, text="频率(Hz)")
        frequency_label.grid(row=2, column=0, padx=5, pady=5)
        frequency_entry = tk.Entry(master, textvariable=self.frequency_var)
        frequency_entry.grid(row=2, column=1, padx=5, pady=5)

        # 直流偏置
        dc_offset_label = tk.Label(master, text="直流偏置")
        dc_offset_label.grid(row=3, column=0, padx=5, pady=5)
        dc_offset_entry = tk.Entry(master, textvariable=self.dc_offset_var)
        dc_offset_entry.grid(row=3, column=1, padx=5, pady=5)

        # 持续时间
        duration_label = tk.Label(master, text="持续时间(秒)")
        duration_label.grid(row=4, column=0, padx=5, pady=5)
        duration_entry = tk.Entry(master, textvariable=self.duration_var)
        duration_entry.grid(row=4, column=1, padx=5, pady=5)

        # 相位
        phase_label = tk.Label(master, text="相位")
        phase_label.grid(row=5, column=0, padx=5, pady=5)
        phase_entry = tk.Entry(master, textvariable=self.phase_var)
        phase_entry.grid(row=5, column=1, padx=5, pady=5)

        # 开始按钮
        start_button = tk.Button(master, text="开始", command=self.generate_signal)
        start_button.grid(row=6, column=0, padx=5, pady=5)

        # 退出按钮
        quit_button = tk.Button(master, text="退出", command=master.quit)
        quit_button.grid(row=6, column=1, padx=5, pady=5)

    # 生成信号并绘制图形
    def generate_signal(self):
        waveform = self.waveform_var.get()
        amplitude = self.amplitude_var.get()
        frequency = self.frequency_var.get()
        dc_offset = self.dc_offset_var.get()
        duration = self.duration_var.get()
        phase = self.phase_var.get()

        if waveform == '正弦':
            time, signal = generate_sine_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
        elif waveform == '三角':
            time, signal = generate_triangle_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)
        elif waveform == '方波':
            time, signal = generate_square_wave(frequency, amplitude, phase, dc_offset, sample_rate=50000, duration=duration)

        # 绘制信号图形
        plt.plot(time, signal)
        plt.xlabel('Time (s)')
        plt.ylabel('Amplitude')
        plt.show()

def main():
    root = tk.Tk()
    app = SignalGeneratorApp(root)
    root.mainloop()

if __name__ == '__main__':
    main()

在这个例子中,我们创建了一个名为 SignalGeneratorApp 的信号发生器应用程序。该应用程序使用了 tkinter 模块来创建用户界面,并包含了一些输入框、标签和按钮。当用户单击“开始”按钮时,程序会根据用户输入来生成指定类型的信号,并绘制信号图形。

以下内容部分参考ChatGPT模型:


首先,可以使用Python中的Matplotlib库来绘制波形图,并结合NumPy库产生正弦/三角波/方波波形。可以使用Tkinter库来创建用户界面,并使用滑动条等控件来调整波形的幅度、频率、直流偏置等参数。以下是一个简单的示例代码:

import matplotlib.pyplot as plt
import numpy as np
import tkinter as tk
from tkinter import ttk

# 生成正弦波
def sine_wave(freq, amplitude, bias, phase, duration):
    time = np.arange(0, duration, 1 / 1000)
    return amplitude * np.sin(2 * np.pi * freq * time + phase) + bias

# 生成三角波
def triangle_wave(freq, amplitude, bias, phase, duration):
    time = np.arange(0, duration, 1 / 1000)
    return amplitude * np.arcsin(np.sin(2 * np.pi * freq * time + phase)) / (np.pi / 2) + bias

# 生成方波
def square_wave(freq, amplitude, bias, phase, duration):
    time = np.arange(0, duration, 1 / 1000)
    return amplitude * np.sign(np.sin(2 * np.pi * freq * time + phase)) + bias

# 绘制波形图
def plot_waveform(waveform, freq, amplitude, bias, phase, duration):
    time = np.arange(0, duration, 1 / 1000)
    y = waveform(freq, amplitude, bias, phase, duration)
    plt.plot(time, y)
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude')
    plt.show()

# 创建用户界面
root = tk.Tk()
root.geometry('300x200')

# 添加滑动条控件
freq_scale = ttk.Scale(root, from_=1, to=1000, orient='horizontal', length=200, label='Frequency (Hz)')
freq_scale.pack()
amp_scale = ttk.Scale(root, from_=0, to=10, orient='horizontal', length=200, label='Amplitude')
amp_scale.pack()
bias_scale = ttk.Scale(root, from_=-10, to=10, orient='horizontal', length=200, label='Bias')
bias_scale.pack()
phase_scale = ttk.Scale(root, from_=-np.pi, to=np.pi, orient='horizontal', length=200, label='Phase')
phase_scale.pack()

# 添加按钮控件
sine_button = ttk.Button(root, text='Sine Wave', command=lambda: plot_waveform(sine_wave, freq_scale.get(), amp_scale.get(), bias_scale.get(), phase_scale.get(), 1))
sine_button.pack()
triangle_button = ttk.Button(root, text='Triangle Wave', command=lambda: plot_waveform(triangle_wave, freq_scale.get(), amp_scale.get(), bias_scale.get(), phase_scale.get(), 1))
triangle_button.pack()
square_button = ttk.Button(root, text='Square Wave', command=lambda: plot_waveform(square_wave, freq_scale.get(), amp_scale.get(), bias_scale.get(), phase_scale.get(), 1))
square_button.pack()

root.mainloop()

这个程序使用Matplotlib库绘制波形图,使用Tkinter库创建用户界面。在用户界面中,使用滑动条控件来调整波形的幅度、频率、直流偏置和相位。通过点击按钮,可以产生不同类型的波形。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快