DCT在MFCC中的方式

2026-02-08 14:37:50      公会联盟

下午好🌅🌅🌅本答案参考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表示。

崩坏3坚振天气关底BOSS卡莲详解 崩坏3坚振天气关底BOSS卡莲怎么打
时尚进阶必看!最值得收藏的时尚杂志推荐