8+ 高质量输入用于波束成形和“...初学者友好...”是相互竞争的要求。
很快就会有附加在 Raspberry Pi 上的音频注入器,对于您提到的内容来说,这将是一个相对无痛的选择。您可以通过多种不同的方式对 Raspberry 进行编程,包括“低级”C 到高级 Python 或其他方式。
另一种选择是寻找对 Linux 友好的多通道 USB 声卡,并将其再次连接到 Raspberry Pi(或小型 PC)。这个版本的旧版本非常适合这个目的。您还可以获得低噪声放大器、麦克风幻象电源和用于基本预处理的内部 DSP 引擎(尽管至少几年前 linux 驱动程序无法访问这些引擎)。此选项再次使您能够通过已建立的硬件和软件接口对多通道方面进行编程。此外,您可能想看看Jack和Portaudio。
希望这可以帮助。
编辑:
我很欣赏额外的信息。由于它是叙述形式,我将尝试取消选择要求。你说(重点是我的):
...一位教授和他的一位博士生要求我们构建一个可以戴在人身上的大型 (8+) 麦克风阵列。该阵列将收集数据并将其存储在我们的赞助商以后可以访问和运行算法的一些数据存储设备中。我们如何实现这一点是开放的。阵列越大越好,我们的预算未知,但可能在 100-200 美元范围内。
对于我们的课程,我们必须添加额外的要求,因此我们决定尝试使用收集到的数据并在其上运行波束成形算法,以放大与佩戴设备的人相关的特定方向的噪声。从本质上讲,我们的演示将是某人佩戴该设备并将其指向不同的声源并通过耳机听到放大的音频。
你没有提到预算中最重要的元素:时间。
我强烈建议团队阅读有关波束成形和相控阵的信息。这些概念在确定系统规格方面起着重要作用。反过来,系统的规格将确定它在给定资源(时间、金钱、专业知识等)内是否可行。
该系统的一个重要方面是计时。如果您仔细研究相控阵概念,您会注意到到达方向取决于波前到达每个接收器(麦克风)的时间。因此,这意味着阵列上的两件事必须是固定的:采样频率和位置。
如果采样频率存在抖动,则相控阵在两个相邻方向之间分辨的能力会降低。同样,如果麦克风没有固定(佩戴在身上),最终结果将是相同的。
因此,要问自己的一个关键问题是:“我们希望相控阵能够解决什么样的角分辨率?” . 从它的声音来看,你必须从两个维度来考虑这个问题:一是围绕身体纵轴的旋转,二是围绕身体横轴的高度。角分辨率会告诉你:
- 您需要多少个麦克风;
- 运行它们的采样频率。
让我们把它停在这里一分钟,然后从另一边接近它:
您要购买 MEMS I2S 麦克风,这不是一个坏主意(就其本身而言)。Adafruit 的库以 32 位精度读取麦克风(第 11 页),但SPH0645的制造商表示它具有 18 位精度,并且以 24 位帧读取(第 3 页)。此外,I2S总线规定每条数据线可以“承载”两个通道。事实上,Adafruit 的网站提到,可以将这些麦克风中的两个插入同一 I2S 总线但在不同的“通道”上进行立体声操作。
因此,在硬件方面,您需要考虑以下事项:
你将如何同时触发采样Nmic≥8麦克风是否位于至少4 个不同的 I2S 通道上?
你将如何传输/处理带宽Nmic×wordLength×Fs比特/秒到 CPU 并处理它?(其中 wordLength 以位为单位,例如 24 位)
由于上面提到的抖动,第 1 点非常重要。Adafruit 的代码适用于polling。换句话说,您设置了一个触发中断服务程序的计数器,并在该程序中触发 I2S 总线上的读取。如果您在第一条 I2S 总线(通道 1,2)上触发读取,并且在您完成它们之后,在第二条 I2S 总线(通道 3,4)上触发读取,则您从第二条总线读取的值已经在未来,关于第一的价值观。
所以呢?!?
假设您以 4MHz 运行 I2S。忽略总线控制信号,24位样本大约需要14000000Hz×24≈0.000006sec(传输两个通道的时间)。这意味着,如果您以Fs的16kHz那么,在一个时期内你最多可以阅读 1160000.000006≈10渠道。但这仍在推动它,因为最后两个通道将与前两个通道异相大约 1 个周期Fs. 这很重要吗?这取决于您的角分辨率和您想要测量的相位差类型。
现在轮到第 2 点开始咬人了。我们只需花费大约一段时间的采样频率从连接到麦克风的 I2S 总线中读取数据。谁来做处理?当 ISR 正在执行时,CPU 没有做任何其他事情(这里当然假设一旦您处于采样 ISR 中,您就关闭了所有其他中断触发器)。
所以,不知何故,我们必须为处理弥补时间。多少时间?我不知道,这取决于您要做什么(波束成形!)。相控阵的最简单形式将来自麦克风的信号的延迟版本相加。这并不昂贵,但是如果您想实时执行此操作,则必须从用户那里读取两个角度。这意味着现在,您必须让 CPU 在某些模拟输入上读取(至少)两个电位器,以确定用户周围的主瓣指向的位置。因此,必须从处理和读取数据中抽出更多时间。
坚持,稍等!,我们之前不是说过我们应该将数据存储到“......某个存储设备......”吗?因此,这意味着有更多时间将位写入 SD 卡,加上更多时间来处理FAT 文件系统(至少),以便能够写入 SD 卡,然后插入计算机并可以读取文件。
你能看出头疼吗?您始终在管理时间和带宽。最后,你有一个 DSP CPU 可以做非常快的操作,但你让它做诸如“读锅”、“读麦克风”等家务。
所以,忘记 I2S 总线和多路复用器上的 MEMS 麦克风吧。如果你想正确地做到这一点,你会围绕编解码器设计一个“音板” 。例如这个,24bit 6 通道 in with maxFs在 192kHz 和 I2S 连接到 CPU。它的模拟输入/输出部分可以接受线路输入电平,这意味着您可以使用简单的电容式麦克风和简单的前置放大器。它在“帧”上运行,并且还具有缓冲模式,因此 CPU 现在可以一次处理一批样本。当然,现在,你还是要解决多路流的存储和处理问题。
但是当您开始围绕编解码器设计音板时,您已经非常接近使用声卡了。例如,查看gumstix的“声卡” ,它只是这个编解码器,但已经插入其 ARM CPU 的 I2S,加上它需要从操作系统中访问的驱动程序。
这就是为什么我之前建议您通过使用现成的物品来消除所有这些。至少,您可以免费获得所有“管道”,并且可以专注于开发软件部分。
希望这可以帮助。