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

DCT在MFCC中的方式
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 檀越@新空间 2024-10-07 16:36关注
下午好🌅🌅🌅
本答案参考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的步骤如下:
- 初始化矩阵:c0,0MWOM,05),其中c0代表第一维,MWOM代表共模门控系数,05代表预过零阈值。这是为了使输出滤波器具有良好的动态范围。
- 对输入信号进行卷积操作:X[k] = X[k] * cos(wt + 2kπm/m) * c0。
- 使用LUT(局部线性变换)对输出进行缩放,以适应不同的频率分辨率需求。
- 对输出进行商变换:Y[k] = (1/L)exp(-jw2kn) * X[k]。
- 对每个K维度的子空间的Y值进行降噪处理:Z[k] = Y[k] * sign(W)。
这个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表示。
解决 无用评论 打赏 举报