"16位整数PCM数据"是指它是有符号还是无符号?

xia*_*aoy 9 audio signal-processing pcm fmod

我正在使用FMOD开发一个应用程序,当用户单击Next/Prev按钮时,该应用程序将立即从包含语音的MP3文件开始播放下一个/上一个句子的录音.我通过调用Sound :: lock获得了mp3文件的PCM数据,但是Sound :: getFormat只告诉我它是"16位整数PCM数据",不知道它是签名还是未签名.我怎么知道的?

互联网上的一些文章称,几乎所有16位整数PCM数据都已签名.如果我的PCM数据被签名,那么什么范围的值表示静默,那些值接近0(例如-10~10),或接近-32768(例如-32768~-32750)?如果它们是接近0的值,这是否意味着相对数字之间的含义没有区别,如-32767和32767?

我需要检测足够长的静音,例如长于500毫秒,以确定语音中每个句子的开始位置.

谁能给我任何关于如何检测句子之间的沉默的建议?

Tom*_*mmy 19

按照惯例,16位音频通常是签名的.

想一想PCM音频是什么:每个测量指的是扬声器在那个时刻在物理上休息的沿着轴的距离.因此,完美的沉默绝对是任何重复的价值 - 代表说话者不动.

那么0就是范围的中心,通常是麦克风没有输入的地方.-32768是扬声器尽可能接近其轴的一端,32767是另一端.

检测静音的最安全方法是在相关范围内进行频谱分析,并查找在任何可听频率范围内没有活动的时段.

如果您正在寻找语音之间的停顿那么最简单的事情很可能会去的地方像这样,插在一个可接受的频率范围内的语音(它被认为是大约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};
Run Code Online (Sandbox Code Playgroud)

如果是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)
Run Code Online (Sandbox Code Playgroud)

我得到的是带通滤波器.只有表示频率范围为300-3500Hz的声音的那部分信号应保留在输出值中.在现实生活中,这种过滤器并不完美; 增加系数的数量以提高过滤器的质量.

切断信号的不相关部分后,我可以寻找长时间的信号sampledValue = [close to] 0.0.