我正在使用 iPhone OS 中的音频,有点困惑。
我目前正在从我的音频缓冲区以 pcm 值的形式获取输入,范围从 -32767 到 32768。我希望使用公式 20LOG10(p/pref) 执行 dbSPL 转换。
我知道 pRef 是 .00002 帕斯卡,并且想将 pcm 值转换为帕斯卡。
我的问题是 a) 这些 pcm 值究竟代表什么。b)如何将这些值转换为帕斯卡。
非常感谢
我正在使用 iPhone OS 中的音频,有点困惑。
我目前正在从我的音频缓冲区以 pcm 值的形式获取输入,范围从 -32767 到 32768。我希望使用公式 20LOG10(p/pref) 执行 dbSPL 转换。
我知道 pRef 是 .00002 帕斯卡,并且想将 pcm 值转换为帕斯卡。
我的问题是 a) 这些 pcm 值究竟代表什么。b)如何将这些值转换为帕斯卡。
非常感谢
如果没有其他信息,您将无法进行此转换。PCM 值到压力物理单位(帕斯卡)的映射取决于音量设置、输出设备的特性(耳塞?PA 系统?),以及观察者相对于输出设备的位置(就在扬声器?100 米外?)。
要回答您问题的第一部分:如果您要绘制 1 kHz 正弦波音调的声压与时间的关系图,则采样时间的线性量化 PCM 值将与声压变化大致成比例那一刻的环境。(“大致”,因为输入和输出设备很少在整个音频范围内具有绝对平坦的响应曲线。)
您的问题既不是“iphone”、“objective-c”也不是“objective-c++”。但可以很简单地回答:http ://en.wikipedia.org/wiki/Pulse-code_modulation
问候
让我们对这个问题有一些直觉
这些 pcm 值究竟代表什么(范围从 -32767 到 32768)
音频只是一条在零线上下波动的曲线……如果曲线在零线处或太靠近零线足够长的时间,这将映射为静音……您的扬声器表面和耳膜都不会摆动...或者,如果音频曲线在一段时间内经常从最大值剧烈摆动到最小值,则您的音量最大,因此帕斯卡的值更大
您的耳朵听到的野外音频是模拟的……为了将音频数字化,这条模拟曲线必须转换为二进制数据……音频的基本数字格式是 PCM,它只是将连续不间断的模拟曲线映射到图表上的不同点... PCM 音频仍然显示为曲线,但是当您放大曲线上的不同点时...每个曲线点都有其 X 和 Y 值,其中 X 代表时间(从左到右),Y 代表幅度(去上和下)
每秒 X 测量的数量,我们称之为采样率(通常是每秒 44,100)......用于记录 Y 保真度的比特数,我们称之为比特深度......如果我们投入 3 比特,则可能的 Y 值的范围必须适合这些行之一
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 0
所以对于3 位,Y 的可能值的数量是 2^3 或 8 个不同的值,这听起来很失真,因为音频曲线远非连续,这就是 CD 质量音频使用两个字节(16 位)信息来记录值的原因曲线高度 Y 给它 2^16 个不同的 Y 值,这等于你给我们的比例(-32767 到 32768)...... 2^16 == 65536 个不同的 Y 值......原始连续不间断的模拟音频曲线现在被数字化为 2^16 个高度值选择,范围从音频曲线的顶部到底部,人耳与源音频曲线无法区分......当进行音频计算时,通常 Y 值被归一化......比如说-1 到 +1 的范围......而不是(-32767 到 32768)
So by now it should be clear the heart of your question concerning pascals ( unit of pressure ) is orthogonal to Y value range (bit depth) and is instead a function of the shape of the audio curve together with the sheer area of the speaker surface ... for a given choice of frequency(s) the degree to which the audio curve adheres to the canonical sine curve of that frequency while consuming the full range of possible Y values will maximize the amplitude ( volume ) thus driving the pascal value