如果样本被标准化为相同的级别,并以签名格式存储,使得"零级别"为0或0.0,则答案非常简单:
S_C = (S_A / 2) - (S_B / 2);
Run Code Online (Sandbox Code Playgroud)
对于每个样品S_A以及S_B在A和B中
如果您对样本使用无符号值,那么您将需要做更多工作:首先,您需要将它们转换为零中心的带符号值(例如,如果您有16位无符号样本,则从每个减去32768),然后应用公式,然后将它们转换回无符号格式.注意溢出 - 这是一个如何对上述16位样本进行转换的示例:
#define PCM_16U_ZERO 32768
short pcm_16u_to_16s(unsigned short u)
{
/* Ensure that we never overflow a signed integer value */
return (u < PCM_16U_ZERO) ? (short)u - PCM_16U_ZERO : (short)(u - PCM_16U_ZERO);
}
unsigned short pcm_16s_to_16u(short s)
{
/* As long as we convert to unsigned before the addition, unsigned arithmetic
does the right thing */
return (unsigned short)s + PCM_16U_ZERO;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |