音频文件中的样本如何对齐?

Posted

技术标签:

【中文标题】音频文件中的样本如何对齐?【英文标题】:How samples are aligned in the audio file? 【发布时间】:2020-11-26 15:36:23 【问题描述】:

我试图更好地了解音频文件中的样本是如何对齐的。

假设我们有一个带有sampling rate = 32s 音频文件。 我认为有三种可能的方法来对齐这些样本。看看下图,你能告诉我哪个是正确的吗?

另外,这是所有音频文件的标准还是不同格式有不同的规则?

干杯!

【问题讨论】:

【参考方案1】:

音频中的采样率通常会告诉您一秒钟内有多少个样本,一个称为赫兹的单位。严格来说,正确答案是 (1),因为您在一秒钟内有 3 个样本。假设没有延迟,PCM 和其他格式规定音频从0 开始。下一个“周期”(下一秒)也从零开始,原理与时钟相同。

要获得音频的总长度(评论中的以下问题),您只需使用number of samples / rate。使用 soxi 的 30 年代 WAV 示例,这是社区中用于声音处理的规范工具之一:

Input File     : 'book_00396_chp_0024_reader_11416_5_door_Freesound_validated_380721_0-door_Freesound_validated_381380_0-9IfN8dUgGaQ_snr10_fileid_1138.wav'
Channels       : 1
Sample Rate    : 16000
Precision      : 16-bit
Duration       : 00:00:30.00 = 480000 samples ~ 2250 CDDA sectors
File Size      : 960k
Bit Rate       : 256k
Sample Encoding: 16-bit Signed Integer PCM

480000 samples / (16000 samples / seconds) = 30 seconds 完全正确。引用手册,持续时间是“相当于样本数除以采样率。”

【讨论】:

谢谢卢卡斯。这确实有道理,但如果 #1 是正确的,那么我该如何测量音频的持续时间?是number_of_samples / rate吗?如果是这样,这意味着最后一个样本不在音频的确切末尾。它是否正确?那么计算样本时间的公式是什么?这是正确的吗:time = sample_idx / (rate + 1)(样本从 0 开始索引)。 @msmialko 公式number_of_samples / rate 是正确的,单位为samples / (samples / seconds) = seconds,假设速率为Hz。根据定义,最后一个样本是音频的结尾 - 为什么不是? 如果持续时间的公式如您所说,那么示例#3不是样本的正确对齐方式吗?在示例 #1 中,最后一个样本实际上在 2 秒标记之前。总共有 6 个样本,以 3Hz 频率记录。这不应该意味着最后一个样本正好是 2s 吗? 2s 标记是新周期的开始,同样0s 是开始。如果在示例 #1 中有一个位于 2s 的样本,则意味着 who 样本的长度超过 2 秒。三者的正式长度是相同的。请记住,在此推理中,您尝试将连续测量框架(时间以秒为单位)应用于离散测量,这可能会导致解释问题(由于不连续性)。 我想考虑每个样本的“持续时间”是准确的,可以定义为1 / frequency。在我们的示例中,它是1/3 sec,它是样本之间的时间。因此总的音频时长可以定义为last_sample_timestamp + sample_duration。我的直觉是它是正确的,因为在最后一个样本之后波被内插到0,并且也需要时间。

以上是关于音频文件中的样本如何对齐?的主要内容,如果未能解决你的问题,请参考以下文章

您将如何测量一个音频样本中的低音量?

fft 在 matlab 中的音频文件样本上

原始音频文件中的样本字节是啥意思?

如何使用 Java Sound 中的音频样本数据?

将音频样本转换为可听文件格式

C++ 中的音频操作