【问题标题】:Convert SIint16 to float on iPhone4将 Uint16 转换为在 iPhone 4 上浮动
【发布时间】:2015-03-03 11:57:31
【问题描述】:

我正在开发一个使用简单音高感知的应用程序,它在 Xcode 模拟器中运行良好。该应用程序在 iPhone 4 中加载,我可以浏览该应用程序,但没有显示输出。我已经开始调试,发现当我将 Sint16 转换为 float 时出现溢出错误。 我试过 vDSP 和一个简单的循环。

简化代码 n=1536

sampleBuffer = (SInt16*) malloc(n);
floatSamples = (float*) malloc(sizeof(float)*n);
    // Convert SInt 16 to float
for(int i = 0; i<n; i++) {
    floatSamples[i] = (float)samples[i];

}

//vDSP_vflt16(samples,1,floatSamples,1,n);

这会导致

-0.000000 -0.000000 -0.000000 964957789008661674961361960960.000000 -5629971079108504200413184.000000 -inf 35116851871418647838720.000000 -inf 0.000000 0.000000 0.000000 -1233.760620 288987875649316726325339192557568.000000 -0.000000 -0.000000 -0.000000 -7508525217561044282816045485425426432.000000 -656399043038732589927376093184.000000 0.000000 -0.000053 9470091451011432448.000000 -24555002

vDSP 的类似结果
在 iPhone 4s 上的模拟器中一切正常,所有 vDSP 计算工作正常。
iPhone 在 MacBook pro 上运行 ios7.1.2 和 xCode 6。
真的只是在寻找线索。

【问题讨论】:

    标签: iphone xcode core-audio vdsp


    【解决方案1】:

    代码
    sampleBuffer = (SInt16*) malloc(n);
    分配 n 个字节,而不是 n 个 SInt16 值。

    您需要:
    sampleBuffer = (SInt16*) malloc(sizeof(SInt16)*n);

    【讨论】:

    • 感谢您的快速回复。这是我的退休爱好之一,所以我可以打瞌睡。你是对的,这是一个内存分配问题。我使用其他人的代码作为基础,当我为我正在实现的 vDSP 的向量分配内存时没有正确执行该过程。模拟器是否在更大的块中分配内存,这样它就不会被覆盖?这或许可以解释为什么模拟器没有给出虚假结果。
    • 内存分配在系统级别以大块为单位,并尽可能细分/分配、分配、回收和组合。所以最后可能有未分配的空间。如果您想要内存保护,方案中有一些选项,但它们有性能副作用。
    • 感谢 Zaph 提供的信息
    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2021-06-29
    • 2019-10-13
    • 1970-01-01
    • 2020-06-27
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多