找回密码
 -注册-
楼主: testguru
打印 上一主题 下一主题

32Bit浮点ADC系统的构成及特点---ZOOM UAC-232评测

[复制链接]
21
发表于 2023-10-23 23:50 来自手机 | 只看该作者 来自 上海
我都是用double 64比特浮点来处理音频数据
回复

使用道具 举报

22
 楼主| 发表于 2023-10-24 00:12 | 只看该作者 来自 新加坡
内部处理32位浮点够用,64位浮点当然更好。这里主要指多ADC系统输出的原始采样数据。
回复

使用道具 举报

23
 楼主| 发表于 2023-10-24 00:34 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-24 00:40 编辑
交响无际 发表于 2023-10-22 22:02
赞!

还有一个疑问,想请教一下,麦克风上面的-10dB,-20dB的灵敏度切换开关,大概是做什么用的呢?一 ...
最大声压级139/149/159dBSPL (0/10/20 dB衰减开关)

这个应该是指话筒内部电路削顶失真时的声压级,按照该话筒的灵敏度25mV/Pa计算,其输出电压峰值为:

声压级139dB:0.025*1.414*power(10,(139-94)/20)=6.29 Vp
声压级149dB:0.025*1.414*power(10,(149-94)/20)=19.9 Vp
声压级159dB:0.025*1.414*power(10,(159-94)/20)=62.9 Vp


也可能是预估超过6.29Vp的输出电压应该会造成后续的放大器削顶来指定的。无论如何,如果不衰减,那么62.9Vp的电压不可能在幻像电源48V下输出。同时,后续的放大器也应该会削顶。其实,即使在139dB的声压级下,UAC-232也会削顶,因为其最大不失真输入电压为2.35V,而未衰减的话筒输出电压为6.29Vp,这时也得用衰减开关。

回复

使用道具 举报

24
 楼主| 发表于 2023-10-24 00:49 | 只看该作者 来自 新加坡
chaos_xie 发表于 2023-10-22 22:44
很有道理,学习了。声音处理上分辨率变化不是缺点,是优点:)
注:稍微纠正一下,IEEE754标准里float里 ...
IEEE754标准里float里还有1个bit表示符号位,所有只有23个bit表示有效数字。

你说得对,不过二进制的符号位也可算为一位二进制的有效位数。例如:8位PCM格式的WAV文件是按8位无符号数保存的,而16位、24位和32位PCM格式的WAV文件则是按有符号数保存的。这并不影响它们所提供的动态范围的计算,都是20*log10(power(2, n)),其中n为位数。这些计算都没争议,但到了计算32位浮点数的动态范围时,Sound Devices的计算如下(可参考:https://www.sounddevices.com/32-bit-float-files-explained/):


二者相减得1528dB。而我的计算则是1535dB,如下:
=1535 dB


本质上就是这个符号位是否要计算在动态范围内的问题。显然在计算前面的整数格式的动态范围时,符号位是计算了的,如果要保持计算方法的一致性,Sound Devices的计算就是错的。TASCAM则说32位浮点数的动态范围是1680 dB(可参考:https://tascam.com/us/feature/32-bit_float),好像有点要取“一路发”的谐音的意思,怎么计算出来的就不知道了。


回复

使用道具 举报

25
 楼主| 发表于 2023-10-24 00:58 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-24 01:01 编辑
交响无际 发表于 2023-10-22 23:24
请教一下,32位浮点录音的,除了zoom、sound device、tascam x8,还有什么可选的吗?

搜到这个SoundDe ...

还有个NT1 5th Generation mic from Rode, 好像是今年才出的。SoundDevice貌似是真正的最早。估计其它厂家都会跟进。
回复

使用道具 举报

26
发表于 2023-10-24 03:05 | 只看该作者 来自 法国
testguru 发表于 2023-10-24 00:49
你说得对,不过二进制的符号位也可算为一位二进制的有效位数。例如:8位PCM格式的WAV文件是按8位无符号 ...

核心问题是有用数值范围。整数计算一般用unsigned,从0开始,所以要算。
对于声音,sounddevices的计算的值域范围不含0和负数。
用负数的话,也失去了你之前说的在0(最低音量)附近需要的高分辨率的优势。
回复

使用道具 举报

27
 楼主| 发表于 2023-10-24 03:17 | 只看该作者 来自 新加坡
chaos_xie 发表于 2023-10-24 03:05
核心问题是有用数值范围。整数计算一般用unsigned,从0开始,所以要算。
对于声音,sounddevices的计算 ...

这次就完全不理解你说的了
回复

使用道具 举报

28
发表于 2023-10-24 03:32 | 只看该作者 来自 法国
testguru 发表于 2023-10-24 03:17
这次就完全不理解你说的了

The minimum positive normal value is 2^-126≈1.18×10^−38,符合公式里的数据。2^-126是可以表达的最小音量,(浮点数无法直接表示0)。
可以看到使用的值域范围是正数。所以符号位在此数据格式中是没有用的。
回复

使用道具 举报

29
 楼主| 发表于 2023-10-24 03:41 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-24 03:44 编辑
chaos_xie 发表于 2023-10-24 03:32
The minimum positive normal value is 2^-126≈1.18×10^−38,符合公式里的数据。2^-126是可以表 ...

我在前面早已埋下伏笔, 那按你说的,16位,24位,32位都是按有符号数表示的,动态范围就只有:
16位:=20*LOG10(POWER(2,15)) = 90.3 dB
24位:=20*LOG10(POWER(2,23)) = 138.5 dB
32位:=20*LOG10(POWER(2,31)) = 186.6 dB




回复

使用道具 举报

30
发表于 2023-10-24 05:06 | 只看该作者 来自 法国
本帖最后由 chaos_xie 于 2023-10-24 05:16 编辑
testguru 发表于 2023-10-24 03:41
我在前面早已埋下伏笔, 那按你说的,16位,24位,32位都是按有符号数表示的,动态范围就只有:
16位:= ...

不是这样,如果是整形,用uint32,那么最小音量是0,最大是2^32 - 1。如果你用有符号数,int32,为了使用所有的bit,你不会用0表示静音(或者说底噪)的,而会用int32_min。
浮点你不会用float32_min来表示静音,因为这个时候量化误差非常大,而会用0.0f,此时误差非常小(你前面的或者你引用的观点静音区的信息量丰富,需要更多的精度。)

和浮点比,对于整形而言,每个bit的分辨率是完全一样的。值域的范围因此受到限制。而浮点值域范围很大,但是需要仔细考虑高精度的值域对应哪个范围。

回复

使用道具 举报

31
 楼主| 发表于 2023-10-24 14:49 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-24 14:55 编辑
chaos_xie 发表于 2023-10-24 05:06
不是这样,如果是整形,用uint32,那么最小音量是0,最大是2^32 - 1。如果你用有符号数,int32,为了使用 ...
不是这样,如果是整形,用uint32,那么最小音量是0,最大是2^32 - 1。如果你用有符号数,int32,为了使用所有的bit,你不会用0表示静音(或者说底噪)的,而会用int32_min。

不明白你说的东西,比如int32_min是什么。Uint32和int32的动态范围是完全一样的,静音都是0,静音不是底噪,底噪都是1bit或者说最细幅度分辨率。更通用地说,动态范围=20*log[(最大值-最小值)/(最细幅度分辨率)],跟有符号或无符号无关。 我们用8bit整数来讲容易点,32bit数值太大。8bit的无符号数整数范围为0~255,有符号整数数范围为:-128~127。二者的静音皆为0,最细幅度分辨率皆为1,动态范围皆为48dB,不会有人说有符号的8bit整数的动态范围就变为42dB,少了6dB。

浮点你不会用float32_min来表示静音,因为这个时候量化误差非常大,而会用0.0f,此时误差非常小
32位浮点数的静音仍然是0,最细幅度分辨率为float32_min (1.17549435×10^-38),这里讨论的是32位浮点数提供的理论上的动态范围。Sound Devices计算的明显是错误的,少了6dB。
回复

使用道具 举报

32
发表于 2023-10-25 02:33 | 只看该作者 来自 法国
testguru 发表于 2023-10-24 14:49
不明白你说的东西,比如int32_min是什么。Uint32和int32的动态范围是完全一样的,静音都是0,静音不是 ...

Uint32和int32的动态范围是完全一样的,静音都是0--------------------------
动态范围是一样的,但是静音的数值uint32是0,int32的话,需要偏移到最小值,否则平白损失了一半值域,那动态范围就少了。这种偏移是数值计算和存储的一些基本操作。(有时甚至要做几个bit内的压缩)。矛盾的核心是用整形表达音量是值域范围不够,而不是分辨率不够,所以需要尽力扩大值域范围。

32位浮点数的静音仍然是0,最细幅度分辨率为float32_min (1.17549435×10^-38),这里讨论的是32位浮点数提供的理论上的动态范围。Sound Devices计算的明显是错误的,少了6dB。
-------------------------
问题就在这里,因为你不能有比静音更低的声音,因此用0做静音的时候,损失了所有负数范围的值域。你的有效值域是0.f到float32的最大值,损失了float32的最小值到-0.f值域。所以sound devices的计算是正确的。如果你用float32的最小值作为静音,那么动态范围就扩大了。但是你面临静音附近分辨率极低的恶果。




回到为啥要用float32来记录音量?32bit整数的动态范围远远超过人的听力上限,高了很多数量级。因此我认为唯一的好处就是整个数值处理流水线上不再需要整形到浮点转化,方便了很多。


回复

使用道具 举报

33
 楼主| 发表于 2023-10-25 15:57 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-25 16:12 编辑
chaos_xie 发表于 2023-10-25 02:33
Uint32和int32的动态范围是完全一样的,静音都是0--------------------------
动态范围是一 ...

完全不明白你在说什么,例如:
int32的话,需要偏移到最小值,否则平白损失了一半值域,那动态范围就少了。
因为你不能有比静音更低的声音,因此用0做静音的时候,损失了所有负数范围的值域。你的有效值域是0.f到float32的最大值,损失了float32的最小值到-0.f值域。

貌似你误认为负数范围不可用,哎....


或许你只需要帮忙解释一下这样一个简单的问题:
(1)8位无符号整数:0~255 的动态范围是多少?
(2)8位有符号整数:-128~127 的动态范围是多少?

-128~0不可用吗?

回复

使用道具 举报

34
 楼主| 发表于 2023-10-25 17:04 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-25 17:10 编辑
chaos_xie 发表于 2023-10-24 05:06
不是这样,如果是整形,用uint32,那么最小音量是0,最大是2^32 - 1。如果你用有符号数,int32,为了使用 ...
如果是整形,用uint32,那么最小音量是0,最大是2^32 - 1。如果你用有符号数,int32,为了使用所有的bit,你不会用0表示静音(或者说底噪)的,而会用int32_min。

I am starting to understand what you were thinking.  正确的说法应该是:无符号整数uint32的静音为2147483648 (即:0x80000000) 而非0; 有符号整数int32的静音才是0。以此类推其它位数,比如无符号整数uint8的静音为128 (即:0x80) ,有符号整数int8的静音为0。对于有符号数,正负数范围都全部可用。编写过WAV文件的读写的码农就知道,标准的8位WAV文件是按无符号整数保存的,而标准的16位、24位和32位WAV文件是按有符号整数保存的。如果不明白有符号数和无符号数的静音点的不同,就无法还原真实的音频数据。
回复

使用道具 举报

35
发表于 2023-10-26 08:49 | 只看该作者 来自 加拿大
testguru 发表于 2023-10-25 17:04
I am starting to understand what you were thinking.  正确的说法应该是:无符号整数uint32的静音为2 ...

对于声音,这种波动信号,计算dac输出的dynamic range,需要用RMS Voltage(Root Mean Square)。这个值是非负的。负值平方后并不单独贡献最终结果。所以动态和最小绝对值和最大绝对值相关。
回复

使用道具 举报

36
 楼主| 发表于 2023-10-27 01:33 | 只看该作者 来自 新加坡
chaos_xie 发表于 2023-10-26 08:49
对于声音,这种波动信号,计算dac输出的dynamic range,需要用RMS Voltage(Root Mean Square)。这个值 ...

算了,你别误导别人了.....
回复

使用道具 举报

37
 楼主| 发表于 2023-10-27 01:51 | 只看该作者 来自 新加坡
本帖最后由 testguru 于 2023-10-27 01:53 编辑

2.8THD、THD+N、底噪电平随输入RMS幅度(经校准)的变化
此测试通过Multi-Instrument的设备检测计划模块实现。测试信号为1kHz正弦波,其幅度经过300步从5μVrms步进到1.66Vrms (2.35Vp,即:0dBFS,见前面的校准结果)。这里采用的是音频分析仪RTX6001的信号发生器,它具有三个输出电压范围:0.1Vrms、1Vrms、10Vrms。当输出电平达到0dBFS后,软件会自动切换到更高的输出范围上。测试结果如下。

XLR话筒输入的底噪电平随输入RMS幅度(经校准)的变化(数字增益= 0dB)
再次重申,在上图中信号幅度的低端测得的底噪电平比前面测得的134.3dBFS略高是因为所用的信号发生器的输出底噪电平相对较高的缘故。从上图可见,在大约信号电平0.03Vrms(等于-34.9dBFS)处,底噪电平突然升高,由于此处仍然处于信号发生器输出的最小量程范围内,不涉及信号发生器的输出范围切换,因此底噪电平的陡升明显是从高增益ADC切换到低增益ADC造成的。

XLR话筒输入的THD随输入RMS幅度(经校准)的变化(数字增益 = 0dB)

上图表明,高增益ADC的THD起初是随着输入信号幅度的增加而降低,直到信号幅度达到大约0.01Vrms。然后THD开始升高,直到信号幅度达到大约0.03Vrms。此后,低增益ADC切入,其THD开始随信号幅度的增加而降低,直到信号幅度达到其大约0.7Vrms的转折点后,THD又重新开始上升。 从图可见,这两个ADC能达到的最低的THD为大约0.0006%。

XLR话筒输入的THD+N随输入RMS幅度(经校准)的变化(数字增益 = 0dB)

上图是更前面的两图的效果叠加,在信号幅度0.03Vrms处,更明显地显示了两个ADC之间的切换。


2.9输入输出线性图
此测试通过Multi-Instrument的设备检测计划模块实现。测试信号为1kHz正弦波,其幅度经过300步从指定的幅度起点步进到幅度终点。横轴代表由信号发生器输出的信号的RMS值,而纵轴代表测得的峰值频率处RMS值。两者都是经校准后的值。采用从频域获得的峰值频率的RMS值而非从时域获得的总的RMS值,有效地消除了噪声的影响,这在信号微弱时是非常关键的。下图显示的是从3.535 μVrms 到1.661 Vrms步进扫幅的测量结果。在对数-对数图上看,几乎是一条完美的直线。

XLR话筒输入的总体输入输出线性图(数字增益= 0dB

为了详细查看这种线性图是否在ADC切换时受影响,需要缩小步进扫幅范围,下图显示的是分300步从0.0141Vrms步进到0.0424Vrms的测量结果。图中可看到在0.03Vrms处有一个小的跳变。这正是前面测试所发现的ADC切换发生的地方。

ADC切换处附近的XLR话筒输入的输入输出线性图(数字增益 = 0dB

为了进一步探究上图中由于ADC的切换导致的小的“非线性”跳变,需要再次缩小扫幅范围,这次是分300步从0.028Vrms步进到0.032Vrms。 测试结果如下。由图可见,跳变的高度大约为0.0003V。

特写ADC切换处的XLR话筒输入的输入输出线性图(数字增益 = 0dB

回复

使用道具 举报

38
发表于 2023-10-27 09:33 | 只看该作者 来自 法国
testguru 发表于 2023-10-27 01:33
算了,你别误导别人了.....

你似乎认为最小信号是负数中绝对值最大的那个?
回复

使用道具 举报

39
 楼主| 发表于 2023-10-28 01:33 | 只看该作者 来自 新加坡
chaos_xie 发表于 2023-10-27 09:33
你似乎认为最小信号是负数中绝对值最大的那个?

在第31楼,我写的动态范围=20*log[(最大值-最小值)/(最细幅度分辨率)]这个公式中,最小值的确是指数学上的最小值,例如:-128 < -127。数学上的最小值不是音频数据的静音点,实际上在负向上它离静音点最远。同理,在正向上,最大值离静音点最远。或者这样描述也许更明确,动态范围=20*log[(最大幅度跨度)/(最细幅度分辨率)]
回复

使用道具 举报

40
发表于 2023-10-28 07:30 | 只看该作者 来自 法国
testguru 发表于 2023-10-28 01:33
在第31楼,我写的动态范围=20*log[(最大值-最小值)/(最细幅度分辨率)]这个公式中,最小值的确是指数学上 ...

问题就在这里,负数的最大值实际上是信号的接近最大值。
如果你看采样的振幅,大的正数和大的负数都是强信号。接近0的才是小信号。如果考虑正弦波,正值最大和负值最大其实是一回事,振幅总是正的,但是位移是有符号的。
按照动态范围的定义,是最大信号和最小信号(噪声)的比值。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | -注册-

本版积分规则

Archiver|手机版|粤icp备09046054号|耳机网-耳机大家坛

粤公网安备 44030602000598号 耳机大家坛、www.erji.net、网站LOGO图形均为注册商标

GMT+8, 2025-8-26 21:18

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表