wav 文件的短时傅里叶变换(STFT)时频图

from scipy import signal
import matplotlib.pyplot as plt
import scipy.io.wavfile
import numpy as np

sample_rate, s = scipy.io.wavfile.read("data/0_01_10.wav")
f, t, Zxx = signal.stft(s, fs=sample_rate,window='hann',nperseg=256,noverlap=None,nfft=None,
detrend=False,return_onesided=True,boundary='zeros',padded=True,axis=-1)

Z = np.log(np.abs(Zxx))

plt.figure(figsize=(20,10))
plt.subplot(2,1,1)
plt.plot(np.arange(len(s))/sample_rate, s)
plt.xlim([0, len(s)/sample_rate])
plt.subplot(2,1,2)
plt.pcolormesh(t, f, Z)
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

在这里插入图片描述

短时傅里叶变换STFT)得到的时频通常具有较高的分辨率,但也会存在较大的噪声和不平滑性。对于这种情况,可以采用平滑技术来降低噪声和提高可视化效果。 常用的平滑技术包括移动平均、高斯平滑和中值滤波等。下面是一个使用高斯平滑的Python示例代码: ```python import numpy as np from scipy.signal import gaussian def smooth_spectrogram(spectrogram, sigma): ''' 对给定的时频进行高斯平滑。 :param spectrogram: 待平滑的时频,形状为 (freq_bins, time_steps)。 :param sigma: 高斯函数的标准差。 :return: 平滑后的时频。 ''' freq_bins, time_steps = spectrogram.shape # 创建高斯窗口 window = gaussian(freq_bins, sigma) # 对每个时间步进行平滑 smoothed_spectrogram = np.zeros_like(spectrogram) for t in range(time_steps): smoothed_spectrogram[:, t] = np.convolve(window, spectrogram[:, t], mode='same') return smoothed_spectrogram ``` 在这段代码中,我们使用 `scipy` 库的 `gaussian` 函数来生成高斯窗口。然后,对于每个时间步长,我们使用 `numpy` 库中的 `convolve` 函数来对窗口和时频在频域上进行卷积,从而实现平滑。 使用示例: ```python import librosa import matplotlib.pyplot as plt # 加载音频文件 audio, sr = librosa.load('example.wav', sr=44100) # 计算STFT stft = librosa.stft(audio, n_fft=1024, hop_length=512) # 将幅度谱转换为分贝 spec_db = librosa.amplitude_to_db(np.abs(stft), ref=np.max) # 平滑时频 smoothed_spec_db = smooth_spectrogram(spec_db, sigma=2) # 可视化原始和平滑后的时频 plt.figure(figsize=(10, 6)) plt.subplot(2, 1, 1) librosa.display.specshow(spec_db, sr=sr, hop_length=512, x_axis='time', y_axis='log') plt.colorbar(format='%+2.0f dB') plt.title('Original Spectrogram') plt.subplot(2, 1, 2) librosa.display.specshow(smoothed_spec_db, sr=sr, hop_length=512, x_axis='time', y_axis='log') plt.colorbar(format='%+2.0f dB') plt.title('Smoothed Spectrogram') plt.tight_layout() plt.show() ``` 这里我们使用了 `librosa` 库来计算STFT并进行可视化。您可以根据自己的需求更改参数,例如 STFT 的窗口大小和跳跃长度以及高斯函数的标准差。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值