以下是一种可能的实现方式:

import numpy as np
import matplotlib.pyplot as plt

class SignalGenerator:
    def __init__(self, freq=100, vpp=1):
        self.freq = freq
        self.vpp = vpp
    
    def set_frequency(self, freq):
        self.freq = freq
    
    def set_vpp(self, vpp):
        self.vpp = vpp
    
    def generate_square_wave(self, t):
        return (np.sign(np.sin(2 * np.pi * self.freq * t)) + 1) / 2 * self.vpp
    
    def generate_triangle_wave(self, t):
        return (2 * self.vpp / np.pi) * np.arcsin(np.sin(2 * np.pi * self.freq * t))
    
    def generate_sine_wave(self, t):
        return self.vpp * np.sin(2 * np.pi * self.freq * t)
    
    def plot_wave(self, wave_func):
        t = np.linspace(0, 1, 1000)
        wave = wave_func(t)
        plt.plot(t, wave)
        plt.xlabel('Time (s)')
        plt.ylabel('Amplitude (V)')
    
    def switch_to_square_wave(self):
        self.plot_wave(self.generate_square_wave)
    
    def switch_to_triangle_wave(self):
        self.plot_wave(self.generate_triangle_wave)
    
    def switch_to_sine_wave(self):
        self.plot_wave(self.generate_sine_wave)

这个信号发生器类包含了三个波形的生成函数generate_square_wavegenerate_triangle_wavegenerate_sine_wave,以及一个绘制波形的函数plot_wave。通过调用类的方法switch_to_square_waveswitch_to_triangle_waveswitch_to_sine_wave,可以切换输出波形。这些方法都会调用plot_wave函数,传入相应的波形生成函数。同时,类的构造函数中还包含了频率和电压峰值的初始化参数,可以通过set_frequencyset_vpp方法进行修改。

在生成方波和三角波时,采用了一种比较巧妙的方式,即利用正弦波的符号函数(即np.sign)和反正弦函数(即np.arcsin)进行计算。这样可以避免使用分段函数或者条件判断语句,使得代码更加简洁和高效。另外,正弦波的生成则采用了numpy库自带的sin函数。

需要注意的是,生成的三角波的幅值是固定的,无法调节。如果需要实现可调节幅值的三角波,可以在生成函数中增加一个幅值参数进行计算。同时,生成的三角波可能在频率较低时出现一些不连续的现象,这是由于反正弦函数的性质导致的,可以通过适当调节频率或者采样点数来缓解这个问题。

Python实现可切换方波、三角波、正弦波的信号发生器

原文地址: https://www.cveoy.top/t/topic/oM1C 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录