生成一包含频率为 20Hz、50Hz、120Hz 的正弦信号,并绘制其时域波 形和频谱;
时间: 2024-10-16 19:08:19 浏览: 60
在Python中,我们可以使用matplotlib库来绘制时域波形,numpy库来生成正弦信号,以及scipy库中的signal模块来进行快速傅立叶变换(FFT)来分析频谱。下面是一个简单的示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
# 定义信号参数
fs = 1000 # 采样率,每秒1000点
t = np.linspace(0, 1, fs, endpoint=False) # 时间轴
# 生成信号
freqs = [20, 50, 120] # 频率列表
signals = [np.sin(2 * np.pi * freq * t) for freq in freqs]
# 绘制时域波形
fig1, ax1 = plt.subplots()
for i, signal in enumerate(signals):
ax1.plot(t, signal, label=f'Frequency {freqs[i]} Hz')
ax1.set_xlabel('Time (s)')
ax1.set_ylabel('Amplitude')
ax1.legend()
# 计算并绘制频谱
frequencies, psds = [], []
for signal in signals:
_, psd = welch(signal, fs=fs, nperseg=int(fs / 4), noverlap=int(fs / 8)) # 使用Welch's method
frequencies.append(frequencies[frequencies > 0]) # 提取大于零的频率
psds.append(psd)
fig2, axs = plt.subplots(len(freqs), 1, sharex=True)
for i, (freq, psd) in enumerate(zip(freqs, psds)):
axs[i].plot(frequencies, psd, label=f'Frequency {freq} Hz')
axs[i].set_ylabel('PSD', fontsize='smaller')
axs[i].set_title(f'{freqs[i]} Hz Signal Spectrum')
axs[-1].set_xlabel('Frequency (Hz)')
plt.tight_layout()
plt.show()
```
这个代码首先生成了三个不同频率的正弦信号,然后分别绘制了它们的时域波形,并计算了每个信号的功率谱密度(PSD)。注意,`welch`函数用于计算平稳信号的频谱估计。
阅读全文