基于Python walch算法的音频数据频谱分析实例解析
一 概念
Welch算法是由P.D. Welch于1967年提出的一种改进的周期图法。其核心思想是将信号分成多个重叠的段,对每段信号进行加窗处理,然后计算每段的周期图,最后取平均以减少估计的方差。具体步骤如下:
- 分段:将原始信号分成N段,每段长度为L,段与段之间可以有重叠。
- 加窗:对每段信号应用窗函数,以减少边界效应。
- 计算周期图:对每段加窗后的信号进行快速傅里叶变换(FFT),计算其功率谱。
- 平均:将所有段的功率谱取平均,得到最终的功率谱密度估计。
在python的库里面集成了这个算法。充分利用这个算法来进行频谱分析,使用起来非常的便捷。
二 实例解析
1.在Python中,我们可以使用numpy
和scipy
库来实现Welch算法。以下是一个详细的实现示例:
import numpy as np
from scipy.signal import welch
import matplotlib.pyplot as plt
# 生成示例信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False)
signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 80 * t) + np.random.normal(0, 0.1, fs)
# 应用Welch算法
f, Pxx = welch(signal, fs, nperseg=256, noverlap=128)
2.以下是一个把音频数据解析频域图的代码实例:
import scipy.signal as signal
import matplotlib.pyplot as plt
from scipy.io import wavfile
file_path = '18_21_51.wav'
fs,data = wavfile.read(file_path)
print(fs)
f,Pxx = signal.welch(data,fs,nperseg=1024,noverlap=512)
#plat audio data power
plt.figure(figsize=(10,6))
plt.semilogy(f,Pxx)
plt.title('Audio Signal Power Sperctral Density')
plt.xlabel('Frequency(Hz)')
plt.ylabel('PSD(db/Hz)')
plt.grid(True)
plt.show()
3.下面是结果展示: