flowers_mo 2024-10-07 16:33 采纳率: 11.1%
浏览 9

DCT在MFCC中的方式

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

img

  • 写回答

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的步骤如下:

    1. 初始化矩阵:c0,0MWOM,05),其中c0代表第一维,MWOM代表共模门控系数,05代表预过零阈值。这是为了使输出滤波器具有良好的动态范围。
    2. 对输入信号进行卷积操作:X[k] = X[k] * cos(wt + 2kπm/m) * c0。
    3. 使用LUT(局部线性变换)对输出进行缩放,以适应不同的频率分辨率需求。
    4. 对输出进行商变换:Y[k] = (1/L)exp(-jw2kn) * X[k]。
    5. 对每个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表示。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月7日