产生200ms的数字信号,其中[0,100]ms为f0=10.23KHz的正弦波,(100,200]ms为f1=12.23KHz的正弦波。设置不同的采样率(fs=50Ksps,fs=5Ksps),画出所生成的200ms数字信号时域波形图(可局部放大)和频谱图
时间: 2024-10-11 10:13:34 浏览: 30
为了生成200ms的数字信号,首先我们需要使用数值计算库如NumPy或Matplotlib在Python中进行模拟。这个过程包括以下几个步骤:
1. **信号生成**:
- 对于每个时间窗口(f0 和 f1 的部分),我们分别创建两个正弦波数组,频率为指定的值。
- 分别使用`numpy.sin()`函数,结合时间范围和对应的频率。
2. **分段叠加**:
- 将这两个正弦波数组合并到一起,形成200ms的信号,使用条件索引来表示两个频率区间的切换。
3. **采样**:
- 根据给定的采样率(fs = 50Ksps 或 fs = 5Ksps)对生成的信号进行等间距采样。可以使用`numpy.linspace()`来得到等间隔的时间点,然后应用上述合并后的信号。
4. **绘制波形图**:
- 使用`matplotlib.pyplot`库绘制时域波形图,通过`plt.plot()`展示采样点的位置及其对应的信号值。可以使用`ax.set_xlim()`和`ax.set_ylim()`局部放大关键区域。
5. **绘制频谱图**:
- 使用`matplotlib.pyplot`的`specgram()`函数或`scipy.signal.periodogram()`计算每个采样点的功率谱密度(PSD),然后绘制出来。同时可以在图上标注出各个频率成分。
以下是简化的代码示例(注意这只是一个伪代码,实际实现会涉及到更多细节):
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import periodogram
# 信号参数
t0 = 0
t1 = 100e-3
f0 = 10.23e3
f1 = 12.23e3
total_time = 200e-3
fs_list = [50e3, 5e3]
# 创建信号
signal_segments = np.zeros(int(total_time * max(fs_list)))
for i, fs in enumerate(fs_list):
time_range = (t0, t1) if i == 0 else (t1, total_time)
time_points = np.linspace(time_range[0], time_range[1], int((time_range[1] - time_range[0]) * fs), endpoint=False)
signal_segments[(time_points >= time_range[0]) & (time_points < time_range[1])] = np.sin(2 * np.pi * f0 * time_points)
signal_segments[(time_points >= time_range[1])] += np.sin(2 * np.pi * f1 * (time_points - time_range[1]) / (t1 - time_range[0]))
# 波形图和频谱图
fig, axs = plt.subplots(nrows=2)
axs[0].plot(np.arange(len(signal_segments)), signal_segments)
axs[0].set_title('时域波形图')
axs[0].grid(True)
for i, fs in enumerate(fs_list):
# 频谱图
freqs, psd = periodogram(signal_segments, fs, nfft=None)
ax_freq = axs[i+1]
ax_freq.psd(freqs, psd, Fs=fs)
ax_freq.set_title(f'采样率 {fs}kHz 频谱图')
ax_freq.set_xlabel('频率(KHz)')
ax_freq.set_ylabel('PSD(dB/Hz)')
ax_freq.grid(True)
plt.tight_layout()
plt.show()
阅读全文