MP3每个帧中有多少个QMDCT系数?

MP3每个帧中有多少个MDCT系数?
我知道了每个帧有1152个采样点,并分为两个颗粒,那么最后封帧的时候,每个帧里面有多少个QMDCT(量化的MDCT)系数呢,是1152个还是576个?

在MP3编码中,每个帧的长度为1152个采样点(对应于2.4 ms的音频信号)。在进行短时傅里叶变换(Short Time Fourier Transform, STFT)处理之后,每个帧将被分为32个子带(subband),其中18个是非常粗糙的低频子带,14个是较细的高频子带。

接下来,每个子带内的频谱系数将通过一组预定义的正弦和余弦基函数进行调制,形成时域的MDCT系数。在MP3中,使用36个预定义基函数对每个子带内的频域数据进行调制。这意味着,在一个MP3帧内总共会有1152/32=36个样本点组成一个子带,并且在每个子带内部使用36个基函数调制产生36个MDCT系数。因此,在一个MP3帧中总共会有32×36=1152个MDCT系数。

需要注意的是,这里提到的仅仅是MPEG-1 Layer III(也称为MP3)格式中使用的MDCT系数数量。不同类型、不同版本或不同压缩率的音频编码格式均可能具有不同数量和特征的系数。
在AAC音频编码中,每个帧在经过短时傅里叶变换(Short Time Fourier Transform, STFT)处理之后,将得到一组复数频域数据。这些数据被分成若干个频带进行量化和编码,并通过多种技术进行压缩,最终形成AAC音频流。

在STFT的过程中,每个帧通常会被分为1024或2048个样本点。对于一个长度为1024或2048的样本点序列,经过STFT处理后会得到相应数量的频域数据。因此,在一个AAC音频帧中的QMDCT(量化的MDCT)系数数量取决于使用的STFT长度和所选用的编码方案。

对于使用1024长度STFT和AAC-LC编码格式的情况来说,在封帧前,每个通道内会获得1024个采样点STFT变换后的576个QMDCT系数(由1152个复数FFT系数减半后得到)。在接下来的量化、编码等过程中这些系数会被进一步压缩和编码以实现更高的压缩比例。

总之,在不同的AAC编码方案中,每个帧内包含的QMDCT系数数量不同。但可以肯定的是,在一个具体使用1024长度STFT实现AAC-LC编码格式中,每个通道内最终会有576个QMDCT系数。

在MP3中,每个帧的所有采样点被分为32个子带,每个子带都被分为18个MDCT系数。因此,每个帧中总共有32 x 18 = 576个未量化的MDCT系数。

然后,这些MDCT系数会被量化为相应的QMDCT系数。每个子带上的MDCT系数会被量化为一个QMDCT系数,因此每个帧中有32个QMDCT系数。每个QMDCT系数由18个MDCT系数共同贡献。

因此,每个帧中总共有32 x 1 = 32个量化的QMDCT系数,每个QMDCT系数由18个MDCT系数共同贡献,因此每个帧总共有32 x 18 = 576个MDCT系数参与量化,并产生相应的576个QMDCT系数。

讲的挺详细的,可以借鉴下
https://www.doc88.com/p-0724857041480.html

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在MP3中,QMDCT是通过在MDCT输出之后对其进行量化转换而得到的。每个帧中包含了多个MDCT系数和QMDCT系数,具体取决于所使用的子带过滤器,子带过滤器的数量及每个子带过滤器的长度可以根据比特率进行调整。以下是通常情况下的计算方法:

  1. 对于每个帧,其采样点数为1152,根据双声道和单声道的不同,分为2或1个颗粒(每个颗粒包含576个采样点)。

  2. 对于每个颗粒,先计算出其所使用的子带过滤器数量和每个子带过滤器的长度。

  3. 根据子带过滤器的数量和每个子带过滤器的长度,将每个颗粒的1152个采样点分为多个子带,每个子带内有若干个采样点。

  4. 使用MDCT将每个子带内的采样点转换为MDCT系数。

  5. 根据量化标准,对所有MDCT系数进行量化处理,并得到对应的QMDCT系数。

  6. 将所有QMDCT系数按照重新排序的顺序打包,发送给接收端进行解码。

因此,每个帧中QMDCT系数的数量取决于颗粒的数量、子带过滤器的数量和每个子带过滤器的长度等多个因素,通常情况下,对于每个颗粒和每个子带过滤器,QMDCT系数的数量与MDCT系数相同。

以下是伪代码示例:

import numpy as np

# 采样参数
N = 1152 # 每个帧的采样点数
npart = 2 # 颗粒的数量
nband = 32 # 子带过滤器的数量
nbandsizes = [36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 51] # 每个子带过滤器的长度

# MDCT和QMDCT系数的数量
mdctsize = 0
qmdctsize = 0
for i in range(nband):
    mdctsize += nbandsizes[i]
    qmdctsize += nbandsizes[i]

# 打印结果
print(f"MDCT系数数量:{mdctsize}")
print(f"QMDCT系数数量:{qmdctsize}")

根据以上示例参数,每个帧中MDCT系数和QMDCT系数的数量都为1152,与原始采样点数相同。
如果我的回答解决了您的问题,请采纳!

在MP3中,每个帧的长度为1152个采样点。每个帧由两个短颗粒(scale factor bands)组成,每个短颗粒有18个频带,因此一个帧共有36个频带。MDCT变换在每个频带内进行,每个频带产生的输出向量长度为18个值,这些值被重新排序并进行量化,以得到最终的QMDCT系数。

在MPEG-1 Layer III标准中,每个短颗粒的长度为12个频带,因此每个频带产生的输出向量长度为6个值。在MPEG-2和MPEG-2.5中,每个短颗粒的长度为6个频带,因此每频带产生的输出向量长度为3个值。经过量化后,MPEG-1 Layer III中每个颗粒包含了576个QMDCT系数,而MPEG-2和MPEG-2.5中每个颗粒包含了288个QMDCT系数。

因此,一个帧中的QMDCT系数的数量取决于具体的MPEG版本和比特率。对于MPEG-1 Layer III,一个帧包含了1152个QMDCT系数,而对于MPEG-2和MPEG-2.5,一个帧包含了576个QMDCT系数。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

MP3(MPEG-1 Audio Layer III)编码的每个帧中,包含了若干个子带,每个子带又包含了若干个MDCT系数。具体地,一个MP3帧通常包含576个时域采样点,这些采样点被划分为32个子带,每个子带包含18个频域采样点,这些采样点经过MDCT(Modulated Discrete Cosine Transform,调制离散余弦变换)变换后得到了相应的MDCT系数。因此,一个MP3帧中包含的MDCT系数总数为32 * 18 = 576个。

引用chatGPT作答,每个MP3帧包含576个QMDCT系数。这是因为在压缩MP3音频时,使用的是一种叫做MDCT的变换技术,将每个帧的1152个采样点分成两个长度为576的子帧,并对它们进行MDCT变换。然后,对这些变换系数进行量化,并进行其他编码步骤,以生成压缩后的音频文件。因此,每个MP3帧最终包含576个QMDCT系数

该回答引用ChatGPT
一个MP3帧中有576个QMDCT系数。下面是详细分析:

MP3编码过程中,首先进行STFT分析将时间域信号分解为频域信号,得到的谱在经过非均匀量化和数据重排处理之后再进行MDCT变换生成频域系数。MDCT变换处理后每一帧的系数取自前一帧的一半系数和当前窗口内产生的新系数。这些频域系数被压缩并且通过压缩后的比特流进行传输。

在进行量化处理之前,每个频域系数先经过一个实数量化处理,使得它们能够被更精细地编码成为二进制码,并将没有用到的系数剪除以减小码率。这个实数量化包括对每个频率子带的振幅进行分析以及对不同子带的振幅进行分配。于是,对于每个音频帧,经过这些处理后,将生成一个包含576个QMDCT系数的向量。这是因为生成的576个系数需要被量化和编码,使得输出的MP3流具有所需的比特率。实际上,这个576个系数的向量被分为32个子带,每个子带含有18个系数,布置在长方形的网格里。因此,一个MP3帧中的QMDCT系数的数量总共为576。下面是一个包含生成QMDCT系数的简单Python代码。


import numpy as np
import scipy.fftpack as fft

# 假设audio是一个MP3帧中包含1152个采样点的音频信号
# 将audio分帧为两个颗粒,每个颗粒包含576个采样点
grain1 = audio[:576]
grain2 = audio[576: 1152]

# 进行MDCT变换
mdct1 = fft.dct(grain1, type=2)
mdct2 = fft.dct(grain2, type=2)

# 计算量化的QMDCT系数
qmdct1 = quantize(mdct1)
qmdct2 = quantize(mdct2)

# 将两个颗粒的系数合并为一个帧
qmdct_frame = np.concatenate([qmdct1, qmdct2])

回答引用ChatGPT:在MP3中,一个帧通常包含576个QMDCT系数。这是因为,在将每个帧的采样点转换为频域表示之后,经过长时间(通常为18个帧)的帧重叠和加窗处理,然后使用MDCT算法进行频域压缩。然后使用量化算法对压缩的频域表示进行量化,从而生成576个量化系数,这些系数被编码并存储在MP3文件中。

因此,每个帧中有576个QMDCT系数。