“16 位整数 PCM 数据”意味着它是有符号的还是无符号的?
Does "16bit integer PCM data" mean it's signed or unsigned?
我正在使用 FMOD 开发一个应用程序,当用户单击 Next/Prev 按钮。我通过调用 Sound::lock 获得了一个 mp3 文件的 PCM 数据,但是 Sound::getFormat 只告诉我它是“16 位整数 PCM data”,没有说明它是 signed 还是 unsigned。我怎么知道?
网上有些文章说几乎所有的16位整数PCM数据都是有符号。如果我的 PCM 数据是 signed,什么范围的值表示静音,那些值接近 0(例如 -10 ~ 10),或接近 -32768 的值(例如 -32768 ~ - 32750)?如果它们是接近于0的值,这是否意味着-32767和32767这样的相反数字之间没有意义差异?
我需要检测足够长的静音,例如超过 500 毫秒,以确定演讲中每个句子的开始位置。
谁能给我一些关于如何检测句子之间的沉默的建议?
按照惯例,16 位音频通常是有符号的。
想一想 PCM 音频是什么:每个度量值是扬声器在那个时刻物理上应该沿其轴移动多远。因此,完美的静音绝对是任何重复值——代表说话者不动。
0 然后是范围的中心,通常麦克风应该在没有输入的地方。 -32768 是扬声器尽可能靠近其轴的一端,32767 是在另一端。
检测静音的最安全方法是 运行 在相关范围内进行频谱分析,并寻找在任何可听频率范围内没有 activity 的时段。
如果您正在寻找语音之间的停顿,那么最简单的方法可能是转到 this 之类的地方,插入一个可接受的语音频率范围(它被认为是大约 300Hz 到大约 3500Hz在电话中),您的采样率以及您认为可以承受的乘法次数。复制提供的系数。例如。我假设您将使用 44100Hz 输入在语音范围内进行 37 次抽头,然后转换为 C 数组,我得到:
double coefficients[] = {
-0.000560, -0.001290, -0.002332, -0.003606, -0.004911, -0.005921, -0.006201,
-0.005256, -0.002610, 0.002106, 0.009059, 0.018139, 0.028924, 0.040691, 0.052479,
0.063203, 0.071794, 0.077351, 0.079274, 0.077351, 0.071794, 0.063203, 0.052479,
0.040691, 0.028924, 0.018139, 0.009059, 0.002106, -0.002610, -0.005256, -0.006201,
-0.005921, -0.004911, -0.003606, -0.002332, -0.001290, -0.000560};
如果它是 double
输入,对于每个输入样本 c
然后我会计算一个采样值:
double *inputWave = ... input, an infinite array for the purposes of the example ...
double sampledValue = 0.0;
for(size_t coeff = 0; coeff < numberOfTaps; coeff++) {
sampledValue += coefficients[coeff] * inputWave[c + coeff];
}
// (where numberOfTaps = sizeof(coefficients) / sizeof(coefficients[0]),
// i.e. the number of coefficients: 37 with the array given above)
然后我得到的是一个带通滤波器。只有代表 300–3500Hz 频率范围内声音的信号部分应保留在输出值中。在现实生活中,没有这样的过滤器是完美的。增加系数的数量以提高滤波器的质量。
切断信号的不相关部分后,我可以寻找 sampledValue = [close to] 0.0
.
的延长周期
令人惊讶的是,如果我创建 8 位格式的 directsound 声音缓冲区,directsound 期望样本在我的机器上是 8Bit SIGNED (-127 - 127),而当我创建 16Bit 缓冲区时,directsound 期望它们是 16Bit UNSIGNED (0 - 65535) ).所以至少在我的机器上,标准似乎与汤米的回答相反。
我正在使用 FMOD 开发一个应用程序,当用户单击 Next/Prev 按钮。我通过调用 Sound::lock 获得了一个 mp3 文件的 PCM 数据,但是 Sound::getFormat 只告诉我它是“16 位整数 PCM data”,没有说明它是 signed 还是 unsigned。我怎么知道?
网上有些文章说几乎所有的16位整数PCM数据都是有符号。如果我的 PCM 数据是 signed,什么范围的值表示静音,那些值接近 0(例如 -10 ~ 10),或接近 -32768 的值(例如 -32768 ~ - 32750)?如果它们是接近于0的值,这是否意味着-32767和32767这样的相反数字之间没有意义差异?
我需要检测足够长的静音,例如超过 500 毫秒,以确定演讲中每个句子的开始位置。
谁能给我一些关于如何检测句子之间的沉默的建议?
按照惯例,16 位音频通常是有符号的。
想一想 PCM 音频是什么:每个度量值是扬声器在那个时刻物理上应该沿其轴移动多远。因此,完美的静音绝对是任何重复值——代表说话者不动。
0 然后是范围的中心,通常麦克风应该在没有输入的地方。 -32768 是扬声器尽可能靠近其轴的一端,32767 是在另一端。
检测静音的最安全方法是 运行 在相关范围内进行频谱分析,并寻找在任何可听频率范围内没有 activity 的时段。
如果您正在寻找语音之间的停顿,那么最简单的方法可能是转到 this 之类的地方,插入一个可接受的语音频率范围(它被认为是大约 300Hz 到大约 3500Hz在电话中),您的采样率以及您认为可以承受的乘法次数。复制提供的系数。例如。我假设您将使用 44100Hz 输入在语音范围内进行 37 次抽头,然后转换为 C 数组,我得到:
double coefficients[] = {
-0.000560, -0.001290, -0.002332, -0.003606, -0.004911, -0.005921, -0.006201,
-0.005256, -0.002610, 0.002106, 0.009059, 0.018139, 0.028924, 0.040691, 0.052479,
0.063203, 0.071794, 0.077351, 0.079274, 0.077351, 0.071794, 0.063203, 0.052479,
0.040691, 0.028924, 0.018139, 0.009059, 0.002106, -0.002610, -0.005256, -0.006201,
-0.005921, -0.004911, -0.003606, -0.002332, -0.001290, -0.000560};
如果它是 double
输入,对于每个输入样本 c
然后我会计算一个采样值:
double *inputWave = ... input, an infinite array for the purposes of the example ...
double sampledValue = 0.0;
for(size_t coeff = 0; coeff < numberOfTaps; coeff++) {
sampledValue += coefficients[coeff] * inputWave[c + coeff];
}
// (where numberOfTaps = sizeof(coefficients) / sizeof(coefficients[0]),
// i.e. the number of coefficients: 37 with the array given above)
然后我得到的是一个带通滤波器。只有代表 300–3500Hz 频率范围内声音的信号部分应保留在输出值中。在现实生活中,没有这样的过滤器是完美的。增加系数的数量以提高滤波器的质量。
切断信号的不相关部分后,我可以寻找 sampledValue = [close to] 0.0
.
令人惊讶的是,如果我创建 8 位格式的 directsound 声音缓冲区,directsound 期望样本在我的机器上是 8Bit SIGNED (-127 - 127),而当我创建 16Bit 缓冲区时,directsound 期望它们是 16Bit UNSIGNED (0 - 65535) ).所以至少在我的机器上,标准似乎与汤米的回答相反。