如何用Python生成时变幅频正弦波并叠加?代码问题求解
解决方案
当然可行,你只需要在正弦函数中加入频率参数就能实现不同时间段的频率切换,原代码的问题在于没有对正弦波的频率进行控制——标准正弦波公式是 y = 幅度 * sin(2π * 频率 * 自变量),你之前的代码只调整了幅度,没处理频率项。
下面是修正后的完整代码,实现你描述的需求:
import matplotlib.pyplot as plt import math # 定义带幅度和频率参数的正弦函数 def sine_wave(x, amplitude, freq): return amplitude * math.sin(2 * math.pi * freq * x) # 生成波形1:分两个时间段 x_wave1 = [] y_wave1 = [] # 采样率,控制采样点的时间间隔,这里设为1000Hz(每秒1000个采样点) sample_rate = 1000 # 第一段:0-100采样点,幅度1,频率100 for i in range(100): x = i / sample_rate # 将采样点序号转换为时间值 x_wave1.append(x) y_wave1.append(sine_wave(x, amplitude=1, freq=100)) # 第二段:100-200采样点,幅度2,频率250 for i in range(100, 200): x = i / sample_rate x_wave1.append(x) y_wave1.append(sine_wave(x, amplitude=2, freq=250)) # 生成波形2:示例另一段不同参数的波形 x_wave2 = [] y_wave2 = [] # 第一段:0-100采样点,幅度0.5,频率150 for i in range(100): x = i / sample_rate x_wave2.append(x) y_wave2.append(sine_wave(x, amplitude=0.5, freq=150)) # 第二段:100-200采样点,幅度1.5,频率200 for i in range(100, 200): x = i / sample_rate x_wave2.append(x) y_wave2.append(sine_wave(x, amplitude=1.5, freq=200)) # 计算叠加后的波形 y_combined = [y1 + y2 for y1, y2 in zip(y_wave1, y_wave2)] # 绘制所有波形 plt.figure(figsize=(12, 8)) plt.plot(x_wave1, y_wave1, label='波形1', alpha=0.7) plt.plot(x_wave2, y_wave2, label='波形2', alpha=0.7) plt.plot(x_wave1, y_combined, label='叠加波形', linewidth=2) plt.title('不同时间段不同频率幅度的正弦波及叠加') plt.xlabel('时间(秒)') plt.ylabel('幅度') plt.legend() plt.grid(True) plt.show()
关键修正点:
- 把原固定的
y_func(x)改成带幅度和频率参数的sine_wave函数,用标准正弦波公式计算 - 引入采样率
sample_rate,将采样点序号转换为实际时间值,让频率参数更直观(比如100Hz代表每秒100个周期) - 分时间段分别设置幅度和频率,生成对应波形
- 最后通过列表推导式将两个波形的对应点相加,得到叠加波形
如果你想用原代码的while循环方式,也可以改成这样:
import matplotlib.pyplot as plt import math def sine_wave(x, amplitude, freq): return amplitude * math.sin(2 * math.pi * freq * x) x_values = [] y_values = [] x = 0 sample_step = 0.001 # 对应采样率1000Hz的时间步长 # 第一段:0到0.1秒(对应100个采样点),幅度1,频率100 amplitude = 1 freq = 100 while x < 0.1: x_values.append(x) y_values.append(sine_wave(x, amplitude, freq)) x += sample_step # 第二段:0.1到0.2秒(对应100个采样点),幅度2,频率250 amplitude = 2 freq = 250 while x < 0.2: x_values.append(x) y_values.append(sine_wave(x, amplitude, freq)) x += sample_step plt.plot(x_values, y_values) plt.title('单波形测试') plt.show()
内容的提问来源于stack exchange,提问作者yasinsulhan
相关产品推荐
相关产品推荐

