【问题标题】:Get amplitude range from input device using PortAudio / PyAudio使用 PortAudio / PyAudio 从输入设备获取幅度范围
【发布时间】:2016-03-05 22:00:30
【问题描述】:

我正在使用PyAudio(它只是PortAudio 的Python 包装器)来注册用户的听觉响应;我想创建一个小校准动画,其中包含一个点,该点在给定采样周期内响应峰值幅度而动态增长和收缩。

问题在于,在我知道任何给定设备的最大幅度可能是多少之前,我无法将幅度有意义地转换为像素(PortAudio 的 API 只是将其描述为无符号长整数,据我所知,这只是未修改的幅度由输入设备测量,其值的范围基本上会根据齿轮的质量而变化。

有没有办法让 PortAudio 从输入设备报告可能的最大幅度值(大概在流初始化后)?

【问题讨论】:

    标签: python portaudio pyaudio


    【解决方案1】:

    您可能从输入设备接收到的最小值和最大值取决于所使用的样本格式,通常是有符号整数。例如,如果您使用 pyaudio.paInt16 格式,则样本是 16 位整数,因此它们的范围是 -32,768 到 32,767。没有“无符号长”示例格式。

    实际范围输入值将取决于任何音频 API 无法控制的许多因素。诸如您正在使用的麦克风、人们说话的音量以及可能位于麦克风和将模拟音频转换为数字的 ADC 之间的任何放大器或其他设备。您可能需要校准您的设置,以便它使用数字采样范围的有用部分。

    【讨论】:

    • 所以这是有道理的(而且,在仔细检查 PortAudio API 时,当我报告 unsigned long 时,我确实误读了),但是,它也不符合我迄今为止的经验,并且我希望你能澄清一下;直观地说,波形应该用有符号值来描述,但我的测试返回值为零(表面上是静音?)或更多。要遵循的第二个问题(如果我可以强加的话!)。
    • Re:值的范围取决于硬件,这也是有道理的。但是如何“校准”这个(即建立最大值)而不使本地上下文受到足够大的声音以导致 DAC 削波(既不可行也不可取)?向流写入越来越大的值最终会引发错误或以其他方式发出已达到本地设备上限的信号吗?还是我应该期望输出和输入具有独立的幅度范围?另外,我在这里超出了我的深度,所以请原谅任何 hcore nubbing。
    • PyAudio 的Stream.read 方法将样本作为字节字符串返回。要正确解释示例,您需要将字符串转换为与示例相同类型的数组。 (例如,对于paInt16,您将使用samples = array.array(strm.read(...), 'h') 之类的东西如果您将其转换为错误的类型(或根本不转换),“样本”将在转换后的类型范围内,但它们'将是错误的值。
    • 您不能写入太大的样本值。最小和最大输出值也由样本格式决定。如果您使用paInt16,则无法输出值大于 32,767 的样本。这个值的响度取决于 DAC 和您的耳朵之间存在的一切。输出设备的音量控制、放大器的音量控制、您正在使用的扬声器、您与扬声器的距离等。此外,无论样本格式如何,输出最大值都会产生相同的最大输出数模转换器。位越多,精度越高。
    猜你喜欢
    • 2011-06-05
    • 2018-10-19
    • 2014-01-12
    • 2021-09-03
    • 2016-07-24
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多