嗨,极客时间! 您是否曾经想过,“电信号”在印刷电路板上的微电路,晶体管,二极管,电阻器和电容器之间的声音如何? 在现代电子设备中,这种信号的一种变体是数字总线,而用于通过总线交换数据的流行接口之一是UART。 它通常用于微控制器中以与计算机或某种外围设备进行通信。 要在总线上获得声音,根本不需要将带有放大器的扬声器连接到具有
UART欧姆的真实总线,因为可以在程序中对其进行仿真。 您对最终产生的声音感兴趣吗?还是需要一个程序进行实验? 然后我要猫。
我们使用UART监听总线上的文件
如果通过
UART传输文件会产生什么声音? 以下是通过以下
UART参数获得的一些示例:
- 115200波特率
- 8位
- 奇偶校验位:无
- 停止位长度:1
游戏音效切尔诺贝利的缠扰者阴影 (文件XR_3DA.exe,位于曲目的尽头,始于2:36,有旋律)。
有关语音合成器的文章
的文本和代码的声音 (文章本身在
此处 )。
Lena的照片听起来像什么?

结果就是
噪音 。
pdf格式的“动态系统理论中的时间序列的熵和预测”一书的声音。用于wav播放器的Atmega系列微控制器的固件的声音。它可以用来做什么?
从理论上讲,可以以文本,图片,视频或程序的形式存在这样的信息,这些信息不仅具有功能意义或美学意义,而且具有数字总线的“美丽”声音,然后证明是某种“数字”诗歌。 通常,对于业余爱好者来说,在我看来,听数字总线的声音与听短波无线电波的声音一样有趣。
它是如何工作的或关于UART的一些知识
什么是
UART可以在
Wikipedia上阅读。
UART非常容易在程序中进行仿真。 实际上,您只需要能够创建从0到1的信号降落(反之亦然)(对于
WAV文件具有16位的位容量,这些值是从
-A到+
A的值 ,其中
A是信号幅度)并将其记录在音频文件中。
UART接口的工作原理如下:在起始位(逻辑为零)之后,您需要根据提供的数据从低到高设置电平。 接下来是您不能使用的奇偶校验位。 消息末尾是一个停止位(逻辑“单位”),其长度可以不同。 可以在本文结尾的源代码中找到该代码的示例。 有关UART的更多信息可以在网络上找到很多资料。 UART可以用于其他用途,例如用作PWM,但在我们的情况下,这意味着从理论上讲,您甚至可以像在微控制器上的WAV播放器中一样,将完整的声音信号直接传输到扬声器。 但是,我宁愿建议将其用作曲折发生器。 信号的音频频率和相位可以以数据位的形式提供,例如
00001111将产生一个曲折,其周期等于一位的传输时间的10个周期(因为在这种情况下,起始位也等于0,停止位等于0 1)。 由于起始位和停止位,因此并非所有曲折周期都可以传输,例如在这种情况下为
01100110 ,因为从本质上讲,我们将在总线
0011001101上侦听此类序列。 如果使用较高的数据传输速率(例如115200波特),则可以通过将Meadras的周期延长几个字节来创建可听的声音频率。
...
使用此
链接,您可以下载程序以将文件转换为
UART总线的声音。 还有一个使用OpenAL在程序运行期间播放声音的版本,这里是
链接 。
该程序的源代码如下:
头文件SoundsDigitalBus.h#ifndef SOUNDS_DIGITAL_BUS_H_INCLUDED #define SOUNDS_DIGITAL_BUS_H_INCLUDED #define SDB_WAV_FILE_NAME "sdb_output.wav" #define SDB_UART_BIT 8 #define SDB_UART_PARITY 0 #define SDB_UART_STOP_BIT 1 #define SDB_UART_BAUDRATE 9600 #define SDB_UART_BAUDRATE_MAX 921600
SoundsDigitalBus.cpp文件的源代码 #include "SoundsDigitalBus.h" #if SDB_WITH_OPENAL == 1
文件main.h #ifndef MAIN_H_INCLUDED #define MAIN_H_INCLUDED #define LINUX 0x00 #define WINDOWS 0x01 #define RU 0x00 #define EN 0x01
文件main.cpp #include "main.h" sdb soundsDigitalBus; int main() { static FILE *fp = NULL;
PS我注意到一个错误,即在源代码中,起始位为逻辑1,而不是0,而停止位为0,而不是1。谁需要对真实声音信号进行基本匹配就可以解决该错误。