最近,我对制作和音频设备的创建产生了浓厚的兴趣。 当我还是一名学生时,我在 Nordic 工作时,我学会了通过蓝牙传输音频,这引起了我的兴趣。 尤其是令人兴奋的蓝牙 le 音频,据说它可以以更低的比特率和更少的延迟获得更好的音频质量。 演奏乐器时,您希望动作和声音响应之间的延迟最小。 我想测试一下我是否可以利用 nrf5340 通过简单的键盘界面控制产生悦耳的声音,看看延迟是否足以不影响我的演奏。
该应用程序由一个发声设备、一个合成器和一个接收耳机组成。 LE Audio 可以同时发送两个对应于耳机左右部分的音频流。
该应用程序基于 Nordic NRF5340 Audio 演示应用程序,但经过简化并专门用于合成器用例。 该应用程序的主要焦点是合成器和键盘输入部分。
合成器的结构是高度模块化的,可以轻松添加或排除不同的模块并测试不同的音频合成拓扑。 提供的设置演示了合成器的不同方面,例如复音振荡器、效果器和音频同步时间相关性。
合成器模块从按钮模块接收有关停止和停止哪个音符的信息。 这些音符可以转换为音序器,或者在这种情况下,可以转换为琶音器。 琶音器与时间有关,因此需要时间源。 我们必须使用与处理音频的时间感同步的时间源。 这就是滴答提供程序的作用,它为处理的每个音频块增加了时间。 即时报价提供商向订阅模块发送即时报价。 这与MIDI同步不同音源的方式相同,因此可以实现MIDI同步。
对于复调合成,我们需要多个振荡器,这些振荡器等于一次可以演奏的音符数。 Key Assign 跟踪当前处于活动状态的振荡器,并以振荡器首先被激活的方式(处于活动状态时间最长的振荡器)将音符分配给振荡器。 如果没有非活动振荡器,它会将新音符分配给第一个活动(最长的有源振荡器)振荡器。 默认情况下,应用程序配置了五个振荡器。 即使**的琶音器超过5个音符,也很难注意到最后一个活动音符被切断。
在“音频进程启动”中,应用程序配置为单声道音频编码。 所有模块也都内置在单声道中。 修改应用程序以处理立体声音频并不难。 例如,您可以将回声效果转换为立体声乒乓球延迟效果。 在使用回声效果之前,将单声道声音分为左声道和右声道。 然后将这些通道馈入回声效果。 确保在 SW 编解码器编码中正确设置了立体声编码的 PCM 大小。
音频在 n 个样本块中处理,这些样本块在音频处理中启动。 计时器确保新块的处理间隔与音频采样率相匹配。 这也许应该直接与蓝牙连接间隔同步,以便进一步开发。
使用 16 位深度。 DSP 主要使用定点格式的整数。 因此,fixed16 类型和相关运算是在 interger math 中定义的。 由于应用特定于NRF5340,因此在某些情况下,SOC 中包含的 DSP 指令由 DSP 指令使用和抽象。
以下块(来自振荡器c)是产生正弦波的一个例子,其频率由相位增量决定。Phase Accumulate[24:31] 的前 8 位用于选择要使用的存储样本,而 Phase Increment[8:23] 用于确定两个样本之间的插值。 然后是信号的应用幅度。
for (uint32_t i = 0; i < block_size; i++)英特尔数学中提供了固定插值和缩放功能,以便使用 CPU 上的 DSP 指令有效地执行此计算。
在当前的应用配置中,当所有振荡器都处于活动状态时,NRF5340应用内核的利用率约为 80%。 当连接两个头戴式设备设备时,大约使用了 40% 的应用程序内核。 其中很大一部分可能是 LC3 编码器。
低功耗蓝牙的最小连接间隔为 75 毫秒 每 7 次音频处理每 5 毫秒启动一次,以匹配连接间隔。 因此,处理过程不会增加延迟。 LE Audio 中的新 LC3 编解码器取代了 SBC 编解码器,应该会显着减少延迟。 但是,它尚未在此特定应用中进行测试。 输入按钮的去抖动时间为 50 毫秒。 但是,这不会导致延迟。 这是因为在实现过程中,每次触发新中断时,按钮状态都会发生变化。 去抖动时间结束后,通过读取引脚值来测试此假设。 这将导致偶尔不正确的按钮状态,但在去抖动时间后会再次纠正。 这不会在测试中导致任何听觉伪影**。
由此产生的应用程序演示了使用 BLE LE Audio 传输合成器音频的功能系统。 有关如何测试应用程序的说明,请查看 GitHub 存储库。 以下是使用的设置**:2 x NRF5340 Audio DK 作为耳机,1 x NRF5340 DK 作为合成器:
虽然没有进行定量分析来确定总延迟,但我认为在弹奏键盘和聆听生成的声音时,延迟并不明显。 我相信 LE Audio 在NRF5340上有很多令人兴奋的新应用。