你对步骤 3 的说法表明你正在将一组短裤解释为一组浮点数?如果是这样,我们就找到了您遇到麻烦的原因。您可以将短值一一分配到浮点数组中吗?那应该解决它。
看起来像mData
is a void *
指着一排短裤。将此指针转换为float *
不会将底层数据更改为float
但您的音频处理功能会将它们视为它们。然而,float
and short
值以完全不同的方式存储,因此您在该函数中所做的数学运算将在非常不同的值上进行操作,这些值与您的真实输入信号无关。要通过实验对此进行研究,请尝试以下操作:
short data[4] = {-27158, 16825, 23024, 15};
void *pData = data;
The void
指针并不表明它指向什么类型的数据,因此错误地,人们可以错误地假设它指向float
价值观。请注意,一个short
是 2 字节宽,但是float
是4字节宽。巧合的是,您的代码没有因访问冲突而崩溃。解释为float
上面的数组只够容纳两个值。我们只看第一个值:
float *pfData = (float *)pData;
printf("%d == %f\n", data[0], pfData[0]);
其输出将是-27158 == 23.198200
说明如何而不是预期-27158.0f
你大致得到23.2f
。发生了两件有问题的事情。第一的,sizeof(float)
is not sizeof(short)
。其次,浮点数的“1 和 0”的存储方式与整数非常不同。看http://en.wikipedia.org/wiki/Single_ precision_floating-point_format http://en.wikipedia.org/wiki/Single_precision_floating-point_format.
如何解决问题?至少有两个简单的解决方案。首先,您可以在将数组的每个元素输入音频处理器之前对其进行转换:
int k;
float *pfBuf = (float *)malloc(n_data * sizeof(float));
short *psiBuf = (short *)buffers->mBuffers[0].mData[k];
for (k = 0; k < n_data; k ++)
{
pfBuf[k] = psiBuf[k];
}
[self granularizeWithData:pfBuf with:framesRead];
for (k = 0; k < n_data; k ++)
{
psiBuf[k] = pfBuf[k];
}
free(pfBuf);
您会发现您很可能必须将所有内容转换回short
在您致电后granularizeWithData: with:
。所以第二个解决方案是在中进行所有处理short
尽管从您所写的内容来看,我想您不会喜欢后一种方法。