# SoundCollector **Repository Path**: rtidea/SoundCollector ## Basic Information - **Project Name**: SoundCollector - **Description**: 声音采集系统,实现音频的采集、放大、滤波、AD转换, 并上传到PC端进行播放 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2022-10-27 - **Last Updated**: 2022-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Sound Collector `声音采集器` 本项目为复旦大学2016级电子工程系《电子系统设计》课程项目, 要求设计一个声音采集系统,实现音频的采集、放大、滤波、AD转换, 并上传到PC端进行播放 # 系统框图 ![系统框图](./Images/系统框图.PNG) # 语音信号 ## 语音频率 在电话技术中,可用的语音频带范围约为300Hz至3400Hz。因此, 300至3000Hz之间的电磁波谱特低频频带也被称为语音频率, 其表示基带处的声能的电磁能量。为单个语音频率传输信道分配 的带宽通常为4kHz,这包括保护频带,以允许8kHz的采样率作为 数字公共交换电话网(PSTN)所用的脉冲编码调变系统的基础。 根据奈奎斯特-香农采样定理,采样频率(8kHz)必须至少是在 离散时间(4kHz)采样之前进行适当滤波的语音频率最高部分的 两倍,从而有效重建语音信号。 (本段文字摘自[维基百科-语音频率](https://zh.wikipedia.org/wiki/%E8%AF%AD%E9%9F%B3%E9%A2%91%E7%8E%87)) ## 语音强度 一般正常交流说话的声音在40dB ~ 60dB左右,但本项目主要关注的 是咪头所能输出的电信号大小, 经测量, 由咪头直接输出的电压幅值大概在10mV ~ 80mV左右. # 咪头 咪头是将声音信号转换为电信号的设备, 这里选用`电容式驻极体咪头`. 驻极体话筒具有体积小、结构简单、电声性能好、价格低的特点, 广泛用于盒式录音机、无线话筒及声控等电路中. 属于最常用的电容话筒. 由于输入和输出阻抗很高, 所以要在这种话筒外壳内设置一个场效应管作为 阻抗转换器, 为此驻极体电容式话筒在工作时需要直流工作电压. 更多[参考资料](./Reference/咪头) # 小信号放大 这里选用两级`LM358`对小信号进行放大, 并通过电位计调节增益, [Multisim 仿真](./MultisimProject/1KHz电压放大.png)时, 该电路将幅度10mV, 频率1KHz的正弦交流电放大到了幅度为1V, 直流偏置为2.47V的正弦波. 实际使用时, 要考虑咪头输出电压大小, 调节电位计R5. 且可以调节R7以调整直流偏置大小, 调节R9来微调放大倍数, 将输出电压控制在 0~3.3V之间. 可能需要在AD采样时加入保护电路, 防止声音过大时烧坏MCU. 更多[参考资料](./Reference/SignalAmplifier/readme.md) # 滤波 语音信号频率在300~3400Hz之间, 考虑到保护频带, 设计滤波器时应该 将截止频率控制在4KHz, 至于300Hz以下的频谱则不用滤除, 因为采样时 需要信号有一定的直流偏置, 这个直流偏置就是300Hz以下的频谱成分. 实验中选用简单二阶有源低通滤波器(参考《模拟电子技术基础(第五版)》童诗白, 华成英等. 图6.3.7) 或者参考[二阶有源低通滤波器_最简单的二阶低通滤波器电路图 图13.06, 图13.07](http://www.elecfans.com/dianlutu/filter/20170724534697.html) 需要注意的是, 虽然经过放大, 加直流偏置, 滤波之后整个系统呈现带通特性, 但这并不表明输出的电压没有24Hz以下的频率成分, 系统的带通特性表明输入端 的低频成分无法传递到输出端, 但在系统内部却为其提供了直流偏置, 所以输出端至少还有0Hz分量. [Multisim 仿真](./MultisimProject/二阶低通滤波上截止频率.png) # AD转换 这里选用`stm32`f103c8t6作为主控芯片, 这款芯片内置2个12位`ADC转换单元`, 主频72MHz, 20kB RAM, 64kB FLASH, 4个16位定时器, 3个USART, 可以满足本项目的要求. 实际选用某宝上的一款stm32f103c8t6最小系统板, 已焊接晶振和 复位电路, 并引出管脚, 使用DIP40封装. **Pin Assignment** |用途 |管脚 |管脚 |用途 | |:--------|:-------------|:----------- |:----------| | |B12 |G | | | |B13 |G | | | |B14 |3V3 | | | |B15 |R | | | |A8 |B11 | | |CH340(RX)|A9(USART1_TX) |B10 | | |CH340(TX)|A10(USART1_RX)|B1 | | | |A11 |B0 | | | |A12 |A7 | | | |A15 |A6(ADC1_IN6) |模拟音频信号| | |B3 |A5 | | | |B4 |A4 | | | |B5 |A3(USART2_RX)|HC05_TX | | |B6 |A2(USART2_TX)|HC05_RX | | |B7 |A1 | | | |B8 |A0 | | | |B9 |C15 | | | |5V |C14 | | | |G |C13 |led | | |3V3 |VB | | 详见[./KeilProject/readme.md](./KeilProject/readme.md) # 上位机 > 上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。 使用python编程,调用`pySerial`库,向单片机发送指令,接收串口数据, 合成\*.wav音频文件,使用`winsound`进行播放 详见[./Scripts/readme.md](./Scripts/readme.md) # Bill of Material |元件|功能|主要参数|参考价格|图片| |---|---|---|---|---| |咪头|将音频信号转换为电信号|52dB拾音器带引脚9*7mm|¥1.85/5个|| |集成运放|信号放大, 偏置, 滤波|LM358, SOP8封装|¥0.32|| |电阻||0805封装|\*|| |电位计||3296W封装|\*|| |电容||0805封装|\*|| |单片机|数据处理和传输|stm32f103c8t6|¥10|| |`CH340`模块|USB转TTL, 程序下载,串口通信|55mm x 16mm|¥5|| |PCB板|电子元器件电气连接的载体|10cm x 10cm|¥50/10块|| |锂电池|为整个系统供电|12V、3000mAh|¥47|| |降压模块|为单片机等提供合适的供电电压|`LM2596`, 输出1.25~35V|¥2.9|| |蓝牙模块|无线通信|HC-05,一对|¥15.5/个|| # 成果展示 声音信号由咪头采集,经过放大,加直流偏置,滤波,AD转换,被单片机采集到,然后可以通过USB数据线或者一对蓝牙模块发送给上位机,合成音频文件并播放。 如果选择用USB数据线传输,可以不用外接电源,因为USB可以给系统提供5V电压;如果选择无线蓝牙传输,则需要外接12V锂电池,同时其中一个蓝牙模块连接到stm32的USART2,另一个通过CH340模块连接到PC机。 受限于串口波特率,stm32中最好不要同时使用USART1和USART2发送数据,可能会导致缓冲区满,丢失数据。 另外,当串口数据超出100 ~ 200的范围时,音频播放噪声较大,所以咪头采集时离声源的距离应该适当。尽管stm32的AD采集管脚处外接了BAT54S限压,也不要使信号长时间处于较高电压。 # Develop Log 2019/3/1: - [x] 初步确定项目框架 - [x] 确定部分器件型号 - [x] 实现stm32上的AD转换 2019/3/2: - [x] 更新README.md文件 - [x] 完成pyAudio播放\*.wav文件的编程 - [ ] 发现pySerial和stm32通信存在问题, 调用serial.Serial.open()之后stm32死机, arduino不存在这个问题, 但arduino无法正确接收pySerial发送的信息 后续可以考虑以下三种预案: 1. 继续解决串口通信问题; 2. 使用SD卡存储语音信号, 再用读卡器读入; 3. 使用网络传输, socket编程(?) - [ ] 用户界面可以考虑用python easygui编写(串口通信)或者添加OLED屏幕显示 2019/3/4: - [ ] 如果PC机和单片机无法实时通信, 可以通过红外遥控给单片机发送指令(使用按键会引入较大的噪声) 2019/3/5: - [x] 完成小信号放大电路的设计与仿真, 可以通过调节电阻参数将输出信号控制在0~3.3V 2019/3/6: - [x] 完成抗混叠滤波电路的设计与仿真, 滤波时也可以产生两三倍的增益, 缓解前级放大电路的压力 2019/3/6: - [x] 之前串口通信出错是因为所用的stm32开发板中将RST, boot管脚连接到了CH340, PC机通过串口使单片机不断地复位. 这应该是软件配置的问题, 但暂时没能很好地解决. 使用自己开发的串口调试助手时, 可以禁用RST, DTR, 发现能够成功通信, 但是不够稳定, 仍然时不时出错. 解决方案是在设计电路板时在单片机和CH340的这两个管脚之间用跳线帽 连接, 程序下载完成后断开. 或者在电路板上不设计下载电路, 只引出USART1管脚. 2019/3/11: - [x] pySerial接收stm32发来的字节并解析成列表, 存储成\*.npy格式(./SerialRead.py) - [x] 用PyQt4开发简单的图形界面, 实现同样的功能(./gui_mini.py) 2019/3/12: - [x] 完成Altium Designer原理图绘制 2019/3/16: - [x] 完成Altium Designer PCB板绘制 - [ ] PCB板上要预留调试接口 2019/3/17: - [x] 检查三极管封装 2019/3/19: - [x] 完善上位机GUI程序;添加接收文本框和发送文本框(其功能暂未添加) 2019/3/21: - [x] 实现实时波形图绘制 2019/3/22: - [x] 整理部分文档资料 2019/3/23: - [x] 实现音频文件的读写与播放 2019/4/13: - [x] 用一对串口蓝牙模块实现无线数据传输,但蓝牙模块(主机)与PC机连接时还需要通过CH340模块, 后续可以研究PyBluez库以实现PC机直接和蓝牙模块(从机)通信 2019/4/16: - [x] 优化上位机 2019/4/25: - [x] 完成PCB板焊接与调试 - [x] 为单片机添加USART2驱动,可通过蓝牙发送数据,但受限于波特率,USART1和USART2不可同时使用 2019/4/27: - [x] 优化上位机,添加音乐播放按钮 # 友情链接 [PCB板打样工厂-捷多邦](https://www.jdbpcb.com/) [在线长度换算-ConvertLIVE](https://convertlive.com/zh/u/转换/毫米/自/密耳#1) [在线流程图制作-ProcessOn](https://www.processon.com/) [数据手册-ALLDATASHEET](http://www.alldatasheet.com)