tuneR包readWave()函数返回通道的单位及转换后单位咨询
关于tuneR包readWave()输出声道数值的单位说明
我来帮你搞清楚这个问题!当你用tuneR包的readWave()函数读取WAV文件后,返回的Wave对象里的声道数值(比如左声道的wave_obj@left),转换前后的单位是完全不同的:
转换前(原始采样值)
readWave()返回的原始整数数值,是量化电平的整数表示,没有直接的物理单位,它是模拟音频信号经过模数转换器(ADC)量化后的结果。这个数值的范围由WAV文件的位深度决定:
- 16位WAV的数值范围是
-2^15到2^15 - 1(也就是-32768到32767) - 24位WAV的数值范围是
-2^23到2^23 - 1
这些数值对应原始模拟信号电压的量化刻度,数值的绝对值越大,代表对应的模拟电压幅值越高。
转换后(归一化幅值)
教程里对左声道数值做的转换(通常是将原始整数除以 2^(bitDepth - 1),比如16位就除以32768),转换后的数值是归一化的相对电压值,范围在-1到1之间。这个单位可以理解为「相对于最大量化电平的比例」,比如数值0.5就代表该采样点的信号幅值是设备能捕捉到的最大电压的50%。
举个实际例子:
如果你的WAV是16位,原始左声道有一个数值是32767,除以32768后得到约0.99997,这个值就代表该采样点的信号幅值接近设备能捕捉到的最大正向电压;如果是-32768,除以32768后得到-1,就是最大的负向电压幅值。
另外,你可以通过wave_obj@bit获取当前Wave对象的位深度,这样就能动态计算转换因子,不用硬写固定数值:
normalized_left <- wave_obj@left / 2^(wave_obj@bit - 1)
内容的提问来源于stack exchange,提问作者hglanz
相关产品推荐
相关产品推荐

