【问题标题】:Converting 16Bit PCM Values into -1 to 1 values将 16 位 PCM 值转换为 -1 到 1 值
【发布时间】:2011-07-10 11:21:33
【问题描述】:

这是我的第一篇文章,所以希望有人能提供帮助!

我正在使用 AudioFileReadPackets 函数读取音频数据(在 CoreAudio 中),此代码工作正常并将 16 位 PCM 值加载到缓冲区中。

第一个样本值是:“65491”(此音频开头无声)。我知道这是一个无符号整数,所以我的问题是,如何将此值转换为 -1 到 1 的范围。

目前我将样本值除以 32768.0 成一个浮点变量,就像这样......

    for (UInt32 i = 0; i < packetCount; i++){ 
            
            sample = *(audioData + i);
    
            
            //turn it into the range -1.0 - 1.0
            monoFloatDataLeft[i] = (float)sample / 32768.0;
            
        }

但是,对于上面给出的示例(作为示例),这会导致输出“1.998626709”不为零(因为它应该是静音)?

说到这一点,当我稍后在文件中查看样本时,我知道它的值在“0.3”标记附近,算法的结果出现在“0.311584473”,我相信这是对吗?

那么为什么第一个样本没有被读取为零,正如我所知道的那样?

【问题讨论】:

  • 一般来说 +1.0 不是浮点的有效样本值。这允许通过简单的乘法或除法进行与浮点数的无损转换。
  • 嗨 sbooth,谢谢,是的,我还有一个子程序可以在进一步处理之前将任何 +1.0 值更改为 +0.999...!

标签: objective-c audio core-audio pcm


【解决方案1】:

你需要先从你的无符号数据中减去 32768,所以它是 0 居中的。

【讨论】:

  • 我不确定我所做的是否达到了相同的效果,但它似乎正在添加一个用于将值从样本传递到的 SInt16 变量“sampleS”。 ..(对不起,我无法计算出迷你 Markdown 格式来添加代码)
  • 也可以从除法结果中分轨0.5
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2020-08-08
相关资源
最近更新 更多