音频特征提取算法

音频特征提取算法是从音频信号中提取出一系列数值特征,用于描述音频的不同方面和属性。这些特征可以用于音频识别、分类、检索、情感分析等任务。下面介绍一些常用的音频特征提取算法,实际应用中还有其他一些算法和特征可以用于不同的音频分析任务。

  1. 短时傅里叶变换(Short-time Fourier Transform, STFT):将音频信号分成若干小段,并对每一小段进行傅里叶变换,得到频谱信息。STFT可以揭示音频的频率成分和时域变化。

  2. 梅尔频率倒谱系数(Mel-frequency Cepstral Coefficients, MFCC):MFCC是一种常用的音频特征表示方法。它首先将音频信号进行STFT得到频谱图,然后对频谱图进行梅尔滤波器组的处理,再取对数并进行离散余弦变换(DCT)得到MFCC系数。MFCC主要捕捉音频的频谱特征,并且对人耳的感知更为接近。

  3. 线性预测编码系数(Linear Predictive Coding, LPC):LPC是一种基于线性预测模型的音频特征提取方法。它假设音频信号是通过一个线性滤波器生成的,通过估计滤波器的系数来捕捉音频的特征。LPC常用于语音信号处理和音频编码。

  4. 频谱质心(Spectral Centroid):频谱质心表示音频信号频谱的中心位置,可以反映音频的音调和亮度。它计算频谱中每个频率的加权平均值,权重由频谱幅度决定。

  5. 过零率(Zero Crossing Rate):过零率表示音频信号波形穿过零轴的次数,可以反映音频的快慢变化和噪声成分。过零率较高的音频通常包含较多的高频噪声。

  6. 能量(Energy):能量表示音频信号在每个时间窗口内的能量大小。它可以用于检测音频的活动程度和强度。

  7. 色度特征(Chroma Features):色度特征是一种用于描述音频音调和和谐性的特征。它将音频信号映射到音乐的调式空间,表示每个调式中不同音高的分布情况。

短时傅里叶变换

短时傅里叶变换(Short-time Fourier Transform, STFT)算法的代码示例(使用Python和NumPy库):

import numpy as np
import scipy.signal as sps

def stft(signal, window_size, hop_size):
    """
    计算短时傅里叶变换(STFT)。
    
    参数:
    signal:输入音频信号(一维数组)
    window_size:窗口大小(整数)
    hop_size:帧移大小(整数)
    
    返回:
    stft_matrix:STFT矩阵(二维数组)
    freq_bins:频率轴上的频率值列表(一维数组)
    time_frames:时间轴上的时间值列表(一维数组)
    """
    # 计算窗口函数
    window = np.hanning(window_size)
    
    # 计算频率轴上的频率值
    freq_bins = np.fft.rfftfreq(window_size)
    
    # 计算时间轴上的时间值
    num_frames = 1 + (len(signal) - window_size) // hop_size
    time_frames = np.arange(num_frames) * hop_size / len(signal)
    
    # 初始化STFT矩阵
    stft_matrix = np.zeros((len(freq_bins), num_frames), dtype=np.complex128)
    
    # 应用窗口函数并计算FFT
    for i in range(num_frames):
        start = i * hop_size
        frame = signal[start : start + window_size] * window
        stft_matrix[:, i] = np.fft.rfft(frame)
    
    return stft_matrix, freq_bins, time_frames

这段代码定义了一个名为stft的函数,用于计算音频信号的STFT。函数接受输入信号、窗口大小和帧移大小作为参数,并返回STFT矩阵、频率轴上的频率值列表和时间轴上的时间值列表。

在函数内部,首先定义了一个Hanning窗口函数,并计算频率轴上的频率值。然后,根据窗口大小、帧移大小和输入信号的长度计算出所需的时间帧数量。接下来,初始化STFT矩阵,大小为频率轴上的频率值数量乘以时间帧数量。然后,利用循环遍历每个时间帧,在每个时间帧上应用窗口函数,并计算该帧上的FFT(快速傅里叶变换),将结果存储在STFT矩阵中。

最后,函数返回STFT矩阵、频率轴上的频率值列表和时间轴上的时间值列表。

要使用这个函数,你可以传入你的音频信号、所需的窗口大小和帧移大小,然后获取STFT矩阵以及相关的频率和时间信息。

请注意,以上代码示例仅提供了STFT算法的基本实现。在实际应用中,可能需要根据具体需求进行参数调整、处理音频预处理和后处理等操作。

梅尔频率倒谱系数

梅尔频率倒谱系数(Mel-frequency Cepstral Coefficients, MFCC)算法的代码示例(使用Python和NumPy库):

import numpy as np
import scipy.fftpack as fft
from scipy.signal import mel

def mfcc(signal, sample_rate, num_mfcc, frame_length, hop_length, num_filters):
    """
    计算梅尔频率倒谱系数(MFCC)。
    
    参数:
    signal:输入音频信号(一维数组)
    sample_rate:采样率(整数)
    num_mfcc:MFCC系数的数量(整数)
    frame_length:帧长度(整数)
    hop_length:帧移长度(整数)
    num_filters:梅尔滤波器的数量(整数)
    
    返回:
    mfcc_coefficients:MFCC系数矩阵(二维数组)
    """
    # 计算MFCC的步骤:
    # 1. 将音频信号分成重叠的帧
    # 2. 对每个帧应用加窗函数
    # 3. 计算每个帧的功率谱
    # 4. 应用梅尔滤波器组
    # 5. 取对数
    # 6. 应用离散余弦变换(DCT)
    # 7. 取前num_mfcc个系数作为MFCC特征
    
    # 计算频谱图
    spectrogram = np.abs(fft.fft(signal, frame_length)[:frame_length//2+1])
    
    # 应用梅尔滤波器组
    mel_filters = mel(sample_rate, frame_length, num_filters)
    mel_spectrum = np.dot(mel_filters, spectrogram)
    
    # 取对数
    mel_spectrum = np.log(mel_spectrum)
    
    # 应用离散余弦变换(DCT)
    mfcc_coefficients = fft.dct(mel_spectrum, type=2, axis=0, norm='ortho')[:num_mfcc]
    
    return mfcc_coefficients

这段代码定义了一个名为mfcc的函数,用于计算音频信号的梅尔频率倒谱系数(MFCC)。函数接受输入信号、采样率、MFCC系数的数量、帧长度、帧移长度和梅尔滤波器的数量作为参数,并返回MFCC系数矩阵。

在函数内部,首先计算音频信号的频谱图,通过应用FFT(快速傅里叶变换)将信号从时域转换到频域。然后,利用scipy.signal.mel函数计算梅尔滤波器组,将频谱图与滤波器组相乘得到梅尔频谱。接下来,取梅尔频谱的对数,这样可以将幅度值转换为对数刻度,更符合人耳的感知。然后,应用离散余弦变换(DCT)将梅尔频谱转换为倒谱系数,仅保留前num_mfcc个系数作为MFCC特征。

最后,函数返回MFCC系数矩阵。

要使用这个函数,你可以传入你的音频信号、采样率、所需的MFCC系数数量、帧长度、帧移长度和梅尔滤波器的数量,然后获取MFCC系数矩阵作为音频的特征表示。

请注意,以上代码示例仅提供了MFCC算法的基本实现。在实际应用中,可能需要根据具体需求进行参数调整、音频预处理和后处理等操作。此外,还可能需要对MFCC特征进行归一化或其他额外的处理步骤。

猜你喜欢

转载自blog.csdn.net/weixin_44008788/article/details/131427396