这段代码的作用是获取一个音频文件的时频图,即根据输入的音频文件,采用汉明窗加傅里叶变换的方法,将其分解成一系列时间窗口内的频率特征数据,并返回这些数据构成的二维数组。具体地,函数中首先读取输入的音频文件,然后用汉明窗来加窗,再进行傅里叶变换,得到一段时间内的频率特征数据。最后,对这些数据进行对数变换,并将其存储在一个二维数组中返回。

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

这段代码主要包括以下几个步骤:

  1. 读取音频文件: 使用 wav.read(file) 函数读取输入的音频文件,获得音频采样率 fs 和音频信号 wavsignal
  2. 加汉明窗: 使用 np.linspacenp.cos 函数生成一个汉明窗,并将其乘以音频信号,以抑制信号的边界效应。
  3. 进行傅里叶变换: 使用 fft 函数对加窗后的音频信号进行傅里叶变换,得到信号的频谱信息。
  4. 提取频谱特征: 由于傅里叶变换的结果是对称的,代码只取前半部分数据,并将其存储在一个二维数组 data_input 中,该数组的每一行代表一个时间窗口的频谱特征。
  5. 对数变换: 使用 np.log 函数对 data_input 进行对数变换,将频谱特征压缩到一个更小的范围内,方便后续处理。

最终,该函数返回一个二维数组 data_input,其包含了音频文件的所有时间窗口的频率特征数据,可以用来生成音频文件的时频图。

音频文件时频图提取 Python 代码解析

原文地址: https://www.cveoy.top/t/topic/nBpB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录