artais 2023-04-12 10:46 采纳率: 61.1%
浏览 105
已结题

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()

  • 写回答

3条回答 默认 最新

  • 「已注销」 2023-04-12 10:56
    关注

    引用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()
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 已采纳回答 4月12日
  • 修改了问题 4月12日
  • 创建了问题 4月12日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改