所有关于电路
项目

如何使用机器人录制和传输音频信号

2017年9月15日经过罗伯特·凯

本文详细介绍了音频信号的采样和数据传输到PC机进行分析。

本文详细介绍了音频信号的采样和数据传输到PC机进行分析。

支持信息

为什么?

在一个以前的文章,我介绍了一个直接的MEMS麦克风电路,可以包括在机器人系统中或任何其他电子项目中。如果您未定义究竟如何生成模拟音频,请从该文章开始。如果您已经拥有一个工作麦克风界面,现在您想要对音频数据进行采样和分析,您可以为此文章做好准备。

我们都知道数字数据在处理和存储方面的优势。但为什么要把数据转移到个人电脑上呢?如果你的目标只是录下声音,然后进行分析或保存以备将来使用,那么答案是显而易见的。但是,如果目标是系统内处理呢?PC分析是有价值的,即使最终的应用程序需要机器人本身来处理音频数据-强大的和用户友好的软件可用于PC可以帮助你开发和微调算法,最终将实现在机器人的处理器。

抽样和时间

有一个缓冲音频信号后,将音频数据带到PC中有两个主要任务:模数转换和机器人到PC数据传输。

让我们首先看看模数转换,特别是所涉及的时间细节。以下示意图显示了麦克风电路和与EFM8微控制器的连接:

这里是PCB布局,麦克风输出信号用蓝色高亮显示:

采样率

一般来说,可听见频率的标准范围是20赫兹到20千赫。这是最大或最优范围;实际的范围因人而异。此外,对于许多类型的声音再现,我们不必代表整个可听到的频率范围。例如,当音频信号被限制在4 kHz以下的频率时,可靠的语音通信是可能的,而10 kHz的上限允许体面(不是很好)的音乐复制。高质量音频的标准采样率为44.1 kHz——刚好足够支持高达20khz的频率。

我的观点在于你不受20 kHz的带宽。根据所需的音频质量,您可以选择带宽,然后将ADC配置为样本速率大约是带宽的两倍。我以16 kHz运行了我的14位EFM8 ADC,允许我捕获高达近8 kHz的频率。

存储与发送

数字音频似乎是一种过时的技术,但在微控制器的背景下,音频数据仍然需要大量内存。如果你以每秒14位和16000个采样(即16 ksps)的速度采样,那么音频每秒需要32000字节的数据。如果你的MCU只有4kb的RAM,你的时间就只有八分之一秒。对于125毫秒的录音,你能做的并不多。

因此,对于此项目,我们不会存储音频数据。相反,我们将实时地将其转移到PC:ADC生成每个14位样本后,我们将两个字节发送出串行端口。您可以使用相同的硬件加软件布置这篇文章是关于将麦克风融入机器人技术的即:, PololuUSB-to-UART转换板(见下图)和(“另一个终端”)。

当传输完成后,我们将数据从YAT转移到Excel。

时间冲突吗?

这里的主要问题是确保在新的ADC样本到达之前成功转移了两个字节。以16 kSP运行的ADC将每62.5μs生成一个样本。UART硬件必须传输10位每字节(8个数据位加上一个起始位和一个停止位)。这是20位总数,然后我们还需要少量时间来中断处理和执行必要的指令。因此,让我们包括一些边距,并说25位周期必须适合ADC样本之间的62.5μs。

$ $ \压裂{\ \ 62.5μs}{25 \钻头\时期}= \压裂{\ \ 2.5μs}{钻头\时期}$ $

$$baud\ rate=\frac{1}{bit\ period}=400\ kbaud$$

我们将波特率提高到最接近的标准值,即460800。EFM8分频器硬件的限制导致实际波特率为453704。够近吗?我的结论这篇文章当波特率不含量超过3.75%时,UART通信通常是可靠的。460800和453704之间的差异约为1.5%,因此应该是好的。

在我们继续之前,让我们使用一个调试信号和一个范围来确认我们没有时间冲突。

SI_INTERRUPT (ADC0EOC_ISR, ADC0EOC_IRQn) {C2ADAPTER_LEDGRN = HIGH;ADC0CN0_ADINT = 0;//清除中断标记SFRPAGE = 0x00;//这个页面为SBUF0和ADC0H/L SBUF0 = ADC0H;而(! SCON0_TI);SCON0_TI = 0;SBUF0 = ADC0L;而(! SCON0_TI);SCON0_TI = 0;Num_Samples_Sent + +; if(Num_Samples_Sent == 15999) { //stop Timer5 (one more conversion will occur) SFRPAGE = TIMER5_PAGE; TMR5CN0_TR5 = 0; } C2ADAPTER_LEDGRN = LOW; }

As you can see, C2ADAPTER_LEDGRN goes high at the beginning of the interrupt routine (i.e., when a new ADC sample becomes available) and low at the end of the interrupt routine, at which point the bytes have been transferred and the processor is ready to start idly waiting for the next sample. The cursors in this first scope capture confirm that the rising edges are separated by ~62.5 µs.

您可以看到数据传输完成与下一个样本的到达之间有充足的时间。要精确,我们有18.8μs的闲暇时间,这是ADC采样期的30%:

雅特和Excel

字节使用上面所示的代码发送(如果您愿意,可以删除C2ADAPTER_LEDGRN = HIGH和C2ADAPTER_LEDGRN = LOW语句)。你可以通过查看源beplay体育下载不了文件和硬件配置文件来详细了解固件:

proj_recordtransferaudio_firmware.zip

这篇文章有关使用YAT和Excel的详细信息。但是,请注意,如果您正在处理大量数据,YAT可能会给您带来问题。显然,它不喜欢在终端监视器中有很多数据,所以保存到文件技术变得不方便。

替代方法是使用日志文件,但我对记录功能进行了严重的困难 - 这么严重的是我放弃了yat并决定写自己的c#串口日志记录软件正是我想要的.这里是:

到目前为止,它工作得很好。我可能会继续添加功能,直到我有一个有效且可靠的通用串行端口程序(再一次)正是我需要做什么,而且还有更多。当我相信它是稳定的并且可以充分处理错误方案时,我会使记录器下载。

你可以使用以下连结下载我的Excel档案:

EFM8_Audio_Data_——_Excel.zip

它目前已安排16,000个音频样本,该样本对应于录制时间的一秒钟,并且它执行以下操作:

  • 将字节转换为ADC计数和毫伏
  • 生成音频数据的两个时域图
  • 通过计算和绘制快速傅里叶变换(FFT)数据来执行光谱分析;点击在这里有关使用Excel的FFT功能的说明

在下面的视频中,我正在使用这个网站.EFM8收集并传输16000个音频样本,这些样本存储在我的记录器软件中,并导入到Excel中。你可以看到傅里叶图中峰值的频率对应于原始信号的频率。(我正在做1024点的FFT,其结果的频率分辨率为15.625 Hz。所以,通常情况下,原始的音频频率和测量的音频频率不会完全相同。)

总结

我们已经讨论了与音频信号数字化有关的一些重要细节,我们使用定制硬件与Excel结合来可视化和分析数字音频数据。我甚至还开发了一些方便的串行端口软件——这很好地提醒了我,项目并不总是遵循预期的路线。