音频文件时频图提取 Python 代码解析
这段代码的作用是获取一个音频文件的时频图,即根据输入的音频文件,采用汉明窗加傅里叶变换的方法,将其分解成一系列时间窗口内的频率特征数据,并返回这些数据构成的二维数组。具体地,函数中首先读取输入的音频文件,然后用汉明窗来加窗,再进行傅里叶变换,得到一段时间内的频率特征数据。最后,对这些数据进行对数变换,并将其存储在一个二维数组中返回。
def compute_fbank(file):
x = np.linspace(0, 400 - 1, 400, dtype=np.int64)
w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1)) # 汉明窗
fs, wavsignal = wav.read(file)
# wav波形 加时间窗以及时移10ms
time_window = 25 # 单位ms
wav_arr = np.array(wavsignal)
range0_end = int(len(wavsignal) / fs * 1000 - time_window) // 10 + 1 # 计算循环终止的位置,也就是最终生成的窗数
data_input = np.zeros((range0_end, 200), dtype=np.float) # 用于存放最终的频率特征数据
data_line = np.zeros((1, 400), dtype=np.float)
for i in range(0, range0_end):
p_start = i * 160
p_end = p_start + 400
data_line = wav_arr[p_start:p_end]
data_line = data_line * w # 加窗
data_line = np.abs(fft(data_line))
data_input[i] = data_line[0:200] # 设置为400除以2的值(即200)是取一半数据,因为是对称的
data_input = np.log(data_input + 1)
# data_input = data_input[::]
return data_input
这段代码主要包括以下几个步骤:
- 读取音频文件: 使用
wav.read(file)函数读取输入的音频文件,获得音频采样率fs和音频信号wavsignal。 - 加汉明窗: 使用
np.linspace和np.cos函数生成一个汉明窗,并将其乘以音频信号,以抑制信号的边界效应。 - 进行傅里叶变换: 使用
fft函数对加窗后的音频信号进行傅里叶变换,得到信号的频谱信息。 - 提取频谱特征: 由于傅里叶变换的结果是对称的,代码只取前半部分数据,并将其存储在一个二维数组
data_input中,该数组的每一行代表一个时间窗口的频谱特征。 - 对数变换: 使用
np.log函数对data_input进行对数变换,将频谱特征压缩到一个更小的范围内,方便后续处理。
最终,该函数返回一个二维数组 data_input,其包含了音频文件的所有时间窗口的频率特征数据,可以用来生成音频文件的时频图。
原文地址: https://www.cveoy.top/t/topic/nBpB 著作权归作者所有。请勿转载和采集!