请写一个S变换时频图数据集代码
时间: 2024-03-18 19:41:07 浏览: 6
以下是一个简单的Python代码示例,用于生成S变换时频图数据集:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成信号数据
t = np.linspace(0, 1, 1000, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)
# 定义S变换函数
def stft(signal, window_size, hop_size, sample_rate=1.0):
n_fft = int(window_size * sample_rate)
hop_size = int(hop_size * sample_rate)
window = np.hanning(n_fft)
spectrogram = np.zeros((int(n_fft / 2) + 1, int(len(signal) / hop_size)), dtype=np.complex128)
for i in range(0, len(signal) - n_fft, hop_size):
frame = signal[i:i + n_fft] * window
spectrum = np.fft.rfft(frame)
spectrogram[:, int(i / hop_size)] = spectrum
return spectrogram
# 生成S变换时频图数据集
window_sizes = [0.01, 0.025, 0.05, 0.1] # 窗口大小
hop_sizes = [0.005, 0.01, 0.025, 0.05] # 步长
sample_rate = 1000.0 # 采样率
dataset = []
for window_size in window_sizes:
for hop_size in hop_sizes:
spectrogram = stft(signal, window_size, hop_size, sample_rate)
dataset.append((spectrogram, window_size, hop_size))
# 可视化一个样本的S变换时频图
sample = dataset[0]
spectrogram, window_size, hop_size = sample
plt.figure(figsize=(10, 4))
plt.imshow(np.abs(spectrogram), origin='lower', aspect='auto', cmap='jet', extent=(0, 1, 0, sample_rate / 2))
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.title('STFT (window_size={}, hop_size={})'.format(window_size, hop_size))
plt.colorbar()
plt.show()
```
在这个示例中,我们使用numpy和matplotlib库生成了一个简单的正弦信号,然后定义了一个S变换函数来计算信号的时频图。我们使用不同的窗口大小和步长来生成不同的数据集,并可视化了其中一个样本的时频图。
请注意,这只是一个简单的示例,实际上,生成S变换时频图数据集的方法可能因应用场景而异,需要根据具体情况进行修改。