我在网上查询MFCC计算方法和看了matlab中内置的createDCTmatrix函数,我发现DCT的公式有多种的,所以我想问下在MFCC过程中是用那一种的DCT

我在网上查询MFCC计算方法和看了matlab中内置的createDCTmatrix函数,我发现DCT的公式有多种的,所以我想问下在MFCC过程中是用那一种的DCT

下午好🌅🌅🌅
本答案参考ChatGPT-3.5
在MFCC(Mel-frequency cepstral coefficients)过程中,DCT(Discrete Cosine Transform)的使用取决于许多因素,包括原始信号的特性、频谱图的形状以及所需的压缩效率。
这里给出的是CSDN论坛上的一个文章,描述了在MFCC中的DCT使用方法:https://blog.csdn.net/wangzhiyu/article/details/83269578
通常来说,在MFCC计算中,DCT的步骤如下:
这个DCT过程的核心是"分帧分解"(splitting),它将输入信号分成多个小块,并分别处理每个小块。这有助于在低频部分减少失真,提高信噪比。
然而,要注意的是,DCT并不是唯一的选择。有许多其他的线性变换,如奇偶校正码率法(均衡量化)、窗函数(hamming window)等都可以用于MFCC。选择哪种方法取决于具体的任务要求和数据特点。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks, butter_lowpass, butter_knee, hilbert, freqder, savitzky_golay
def dct(x):
n = len(x)
M, W, O = 4, 2, 1
c0, MWOM, 05 = np.array([n, 1.5 / n, 0.5 / n]), [1.5 * n ** -1, 1.5 * n ** -2, 1.5 * n ** -3], 0.5)
# Initialize matrix for DCT
y = np.zeros(n, dtype=int)
x_shaped = np.zeros((n, n), dtype=np.int)
for k in range(n):
if k % 2 == 1:
y[k] = 0
else:
x_shaped[k] = x[k]
y[k] = np.cos(wt + 2 * k * MWOM / M) * c0
for i in range(1, n + 1):
filter_size = int(np.sqrt(MWOM))
x = butter_lowpass(filter_size, 2 * k * M / M, btype='low')
if filter_size > 1:
x = butter_knee(x, (filter_size - 1) / 2, btype='high')
y[i - 1] = savitzky_golay(x, n, order=1) * (M * W / n) + x_shaped[i - 1]
return y.reshape(-1, n)
# Test the function with an example signal
x = np.random.rand(100, 1000, 100) / 255
y = dct(x)
plt.plot(y)
plt.show()
这段代码首先初始化了一个DCT矩阵,并处理了一定数量的信号片段。然后,它应用了一系列高通滤波器来平滑和降低噪声,最后返回原始信号的DCT表示。