雷竞技注册
项目

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

2017年9月15日通过罗伯特Keim

本文提供有关采样音频信号并将数据传输到PC进行分析的详细信息。

本文提供有关采样音频信号并将数据传输到PC进行分析的详细信息。

支持信息

为什么?

在一个以前的文章,我提出了一个简单的MEMS麦克风电路,可以包括在一个机器人系统或几乎任何其他电子项目。雷竞技最新app如果你还不确定如何制作模拟音频,可以从这篇文章开始。如果您已经有了一个可工作的麦克风接口,并且现在希望对音频数据进行采样和分析,那么您就为本文做好了准备。

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

抽样和时机

一旦你有了缓冲音频信号,将音频数据传输到PC需要完成两项主要任务:模数转换和机器人到PC的数据传输。

让我们首先看看模数转换,特别是涉及到的时间细节。下面的原理图摘录显示了麦克风电路和与EFM8单片机的连接:

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

采样率

通常,可听频率的标准范围为20 Hz至20 kHz。这是最大或最佳范围;真实范围从人到人的人变化很大。此外,对于许多类型的声音再现,我们不必代表整个可听频率范围。例如,当音频信号被限制在低于4kHz的频率时,可以实现可靠的语音通信,并且10kHz的上限允许体积(不大)音乐再现。高质量音频的标准采样率为44.1 kHz - 足以支持高达20 kHz的频率。

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

存储与发送

数字音频似乎是旧技术,但音频数据在微控制器的上下文中仍然需要很多内存。如果您在每秒14位和16,000个样本(即16 ksps),则每个秒的音频需要32,000字节的数据。如果您的MCU只有4 KB的RAM,那么您将仅限于八分之一。您可以使用125毫秒的录制来进行。

因此,对于这个项目,我们将不存储音频数据。相反,我们将它实时地连续传输到PC:一旦ADC生成每个14位样本,我们将两个字节发送到串行端口。您可以使用中讨论的相同的硬件加软件安排本文将麦克风纳入机器人-i.e.,一个pololuUSB-to-UART转换器董事会(见下图)和雅特(“另一个终端”)。

转移完成后,我们将数据从yat移动到Excel。

时序冲突?

这里的主要关注点是确保在新的ADC样本到达之前成功传输两个字节。以16 ksps运行的ADC将每62.5µs生成一个样本。UART硬件必须每字节传输10位(8个数据位加上一个开始位和一个停止位)。总共是20位,然后我们还需要少量的时间来处理中断和执行必要的指令。所以让我们加上一些裕量,假设25位的周期必须适合ADC样本之间的62.5µs。

$$ \ frac {62.5 \ mu s} {25 \ bit \句号} = \ frac {2.5 \ \ mu s} {bit \句号} $$

$$波特率= \ \ FRAC {1} {位\句号} = 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; }

如您所见,C2ADAPTER_LEDGRN初走高中断例程(例如,当一个新的ADC样品可用)和较低的中断程序结束时,此时字节传输和处理器已经准备好开始悠闲地等待下一个样品。第一个scope capture中的游标确认上升边被~62.5µs分隔。

您已经可以看到,从完成数据传输到下一个示例到达之间有足够的时间。准确的说,我们有18.8µs的空闲时间,占ADC采样周期的30%:

yat和Excel.

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

proj_recordtransferaudio_firmware.zip.

参考这篇文章有关使用YAT和Excel的详细信息。但是,如果您正在处理大量数据,请警告yat可能会给您出现问题。显然,它不喜欢终端监视器中的大量数据,因此保存到文件技术变得不方便。

另一种方法是使用日志文件,但是我在日志记录功能方面遇到了严重的困难——严重到我放弃了YAT,决定编写自己的c#串行端口日志记录软件正是我想要的。这里是:

到目前为止,它的运作良好。我可能会继续添加功能,直到我有一个通用的串口程序,可有效且可靠地(再次)这正是我需要它做的,仅此而已。当我确信该记录器是稳定的,并能够适当地处理错误场景时,我将提供该记录器供下载。

您可以使用以下链接下载我的Excel文件:

efm8_audio_data_--_excel.zip.zip.zip.

它目前被安排为16000个音频样本,这对应于一秒的录音时间,它做了以下工作:

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

在以下视频中,我正在使用单音音频信号这个网站。EFM8收集并传输16,000个音频样本,由我的记录器软件存储并导入Excel。您可以看到傅立叶图中的峰值的频率对应于原始信号的频率。(我正在进行1024点FFT,导致频率分辨率为15.625 Hz。因此,通常,原始和测量的音频频率不会完全相同。)

总结

我们已经讨论了与音频信号的数字化相关的一些重要细节,我们将自定义硬件与Excel结合使用以可视化和分析数字音频数据。我甚至沿途开发了一些方便的串口软件 - 一个良好的提醒,项目并不总是遵循预期的路线。