收藏官网首页
查看: 25510|回复: 3

[资料] GoKit之智能家居及ANC

4

主题

25

帖子

231

积分

中级会员

Rank: 3Rank: 3

积分
231
跳转到指定楼层
楼主
发表于 2016-8-29 16:32:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 绿林科技 于 2016-9-18 23:39 编辑

Notes.

Notes.

Hardware system design: AS3430 Active Noise Cancellation (ANC), IC circuit:


1 General Description
The AS3400/10/30 are speaker driver with Ambient Noise Cancelling
function for headsets, headphones or ear pieces. It is intended to
improve quality of e.g. music listening, a phone conversation etc. by
reducing background ambient noise.
The fully analog implementation allows the lowest power
consumption, lowest system BOM cost and most natural received
voice enhancement otherwise difficult to achieve with DSP
implementations. The device is designed to be easily applied to
existing architectures.
An internal OTP-ROM can be optionally used to store the
microphones gain calibration settings.
The AS3400/10/30 can be used in different configurations for best
trade-off of noise cancellation, required filtering functions and
mechanical designs.
The simpler feed-forward topology is used to effectively reduce low
frequency background noise. The feed-back topology with either 1 or
2 filtering stages can be used to reduce noise for a larger frequency
range, and to even implement transfer functions like speaker
equalization, Baxandall equalization, high/low shelving filter and to
set a predefined loop bandwidth.
The filter loop is optimized by the user for specific headset electrical
and mechanical designs by dimensioning simple R, C components.
Most headset implementations will make use of a single noise
detecting microphone. Two microphones could be used to allow for
increased flexibility of their location in the headset mechanical
design. Using the bridged mode allows to even drive high impedance
headsets.



变换接口:

下面是降噪评估电路:





基本原理

当噪音来袭时

ANC首先会感知外界噪音的波形组成

然后会产生一种反向的干扰波形

这样物理课上我们都学过的

两种相反的波形重叠后

就会完全抵消




通讯功能:

客户端:Win平板电脑,安卓手机APP

服务端:阿里云服务器,采用Visual C++编写


下面先贴一下Win平板上位机与STM32下位机的串口通讯部分协议头文件,源码注释风格采用微软WRK及UNIX的注释风格

  1. /*++

  2. Copyright (c) Microsoft Corporation.  All rights reserved.

  3. Module Name:

  4.         Serial_Protocol.h

  5. Abstract:

  6.         串口通信协议**头文件.

  7. --*/
  8. #pragma once



  9. //定义消息类型
  10. #define MT_MOTOR 0x20 //电机
  11. #define MT_RGB_LED 0x21 //RGB灯
  12. #define MT_SENSORS 0x22//温湿度和红外抵挡状态
  13. #define MT_CURTAIN 0x26//设置窗帘
  14. #define MT_GLASS_TRANSPARENT 0x28//让玻璃透明(2楼)
  15. #define MT_GLASS_TRANSPARENT_ONE 0x30//让玻璃透明(1楼)
  16. #define MT_MODE 0x32//设置模式

  17. //定义消息子类型
  18. #define ST_MOTOR 0x23//电机转速
  19. #define ST_RGB_LED 0x24//RGB灯
  20. #define ST_SENSORS 0x25//温湿度和红外抵挡状态
  21. #define ST_CURTAIN 0x27//设置窗帘
  22. #define ST_GLASS_TRANSPARENT 0x29//让玻璃透明(2楼)
  23. #define ST_GLASS_TRANSPARENT_ONE 0x31//让玻璃透明(1楼)
  24. #define ST_MODE 0x33//设置模式


  25. typedef struct _SERIAL_PROTOCOL {
  26.         unsigned char m_nMsgType;//消息类型
  27.         unsigned char m_nSubType;//消息子类型
  28.         union {
  29.                 struct {
  30.                         unsigned char rLed;
  31.                         unsigned char gLed;
  32.                         unsigned char bLed;
  33.                 }LED;
  34.                 struct {
  35.                         unsigned char Temperature;//温度
  36.                         unsigned char Humidity;//湿度
  37.                         unsigned char Infrared;//红外的遮挡状态
  38.                         float PhotoSensitiveData;//光敏传感器
  39.                 }SENSORS;
  40.                 unsigned char MotorSpeed;//电机转速
  41.                 unsigned char bIsOpenTheCurtain;//是否开启窗帘
  42.                 unsigned char bIsGlassTransparent;//是否让玻璃透明
  43.                 unsigned char Mode;//模式设置
  44.         }nVaule;
  45.         unsigned int Crc32CheckSum;//效验和
  46.         unsigned long Reserve;//保留,未使用
  47. }SERIAL_PROTOCOL,*PSERIAL_PROTOCOL;


  48. //网络通讯协议
  49. #define SERIAL_MT_MOTOR 0x26//电机
  50. #define SERIAL_MT_RGB_LED 0x27//RGB灯
  51. #define SERIAL_MT_SENSORS 0x28//传感器
  52. #define SERIAL_MT_CURTAIN 0x32//窗帘
  53. #define SERIAL_MT_GLASS_TRANSPARENT 0x34//让玻璃透明
  54. #define SERIAL_MT__ANC 0x36//ANC操作
  55. #define SERIAL_MT__MODE 0x38//模式操作

  56. #define SERIAL_ST_MOTOR 0x29//电机
  57. #define SERIAL_ST_RGB_LED 0x30//RGB灯
  58. #define SERIAL_ST_SENSORS 0x31//传感器
  59. #define SERIAL_ST_CURTAIN 0x33//窗帘
  60. #define SERIAL_ST_GLASS_TRANSPARENT 0x35//让玻璃透明
  61. #define SERIAL_ST__ANC 0x37//ANC操作
  62. #define SERIAL_ST__MODE 0x39//模式操作


  63. typedef struct _SERIAL_NETWORK_PROTOCOL {
  64.         unsigned long m_nMsgType;//消息类型
  65.         unsigned long m_nSubType;//消息子类型
  66.         unsigned char rLED;
  67.         unsigned char gLED;
  68.         unsigned char bLED;
  69.         unsigned char Temperature;//温度
  70.         unsigned char Humidity;//湿度
  71.         unsigned char Infrared;//红外的遮挡状态
  72.         float PhotoSensitiveData;//光敏传感器
  73.         unsigned char MotorSpeed;//电机转速
  74.         unsigned char bIsOpenTheCurtain;//是否开启窗帘
  75.         unsigned char bIsGlassTransparent;//是否让玻璃透明
  76.         unsigned char bIsOpenANC;//是否开启ANC
  77.         unsigned char Mode;//设置模式
  78.         unsigned long Crc32CheckSum;//效验和
  79.         unsigned long Reserve;//保留,未使用
  80. }SERIAL_NETWORK_PROTOCOL, *PSERIAL_NETWORK_PROTOCOL;
复制代码
WIN10平板电脑界面:

服务端的设计:
    服务器采用允许上万人同时访问的IOCP模型。IOCP模型又称完成端口模型。在介绍IOCP模型之前,我们来介绍一下完成端口。完成端口是Windows系统中的一种内核对象,它在内部提供了线程池的管理机制,这样在进行异步重叠IO操作时可以避免反复创建线程的系统开销。
    IOCP模型的主要设计思路是创建一个完成端口对象,将完成端口对象绑定到套接字上,然后开启几个用户线程,当重叠I/O操作完成时,系统会将I/O完成包放入I/O完成包队列中,这样用户线程通过调用GetQueuedCompletionStatus 函数可以检测队列中的I/O完成包,如果函数成功等待到I/O完成包,会获取完成端口的键值,该键值是在完成端口时指定的,通常使用该键值描述一个自定义的数据结构,包含套接字、数据缓冲区、重叠结构的信息。

部分源码:
  1. DWORD WINAPI ServiceAcceptConnect(_In_ LPVOID lpParameter)
  2. /*++

  3. Routine Description:

  4.         接收客户端连接,然后依据CPU数量开启多个用户线程,等待I/O完成数据包。

  5. Arguments:

  6.         lpParameter - 线程参数.

  7. Return Value:

  8.         0 - If Success
  9.         1 - if fail.

  10. --*/
  11. {
  12.         HANDLE hComPort;//定义一个完成端口对象
  13.         //创建完成端口对象
  14.         if ((hComPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0)) == NULL)
  15.         {
  16.                 return 0;
  17.         }
  18.         SOCKET mainSock;//本地套接字
  19.         WSADATA wsaData;//定义WSADATA对象
  20.         WSAStartup(MAKEWORD(2, 2),&wsaData);//初始化库函数
  21.         mainSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, NULL, WSA_FLAG_OVERLAPPED);
  22.         SOCKADDR_IN localAddr;//定义本地套接字
  23.         localAddr.sin_family = AF_INET;
  24.         //localAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  25.         //        localAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  26.         //struct in_addr s; // IPv4地址结构体
  27.         //inet_pton(AF_INET, "127.0.0.1",&s);
  28.         IN_ADDR LocalIPAddr = { 0 };
  29.         InetPton(AF_INET, SERVER_IP_ADDRESS, &LocalIPAddr);
  30.         localAddr.sin_addr.S_un.S_addr = LocalIPAddr.S_un.S_addr;

  31.         localAddr.sin_port = htons(SERVER_IP_PORT);//设置端口

  32.         bind(mainSock, (LPSOCKADDR)&localAddr, sizeof(localAddr));//绑定地址
  33.         listen(mainSock, 15);//监听套接字
  34.         //listen(mainSock, SOMAXCONN);//监听套接字
  35.         SOCKADDR_IN remoteAddr;
  36.         int nAddrSize = sizeof(remoteAddr);
  37.         SYSTEM_INFO SystemInfo;
  38.         GetSystemInfo(&SystemInfo);//获取系统信息
  39.         DWORD dwThreadID;
  40.         //创建CPU数*2个用户线程
  41.         for (size_t i = 0; i < SystemInfo.dwNumberOfProcessors*2; i++)
  42.         {
  43.                 HANDLE hThread = NULL;
  44.                 if ((hThread = CreateThread(NULL,0, AcceptUserThread,hComPort,0,&dwThreadID)) == NULL)
  45.                 {
  46.                         return FALSE;
  47.                 }
  48.                 CloseHandle(hThread);//关闭线程句柄
  49.         }
  50.         while (true)
  51.         {
  52.                 //接收客户端连接
  53.                 SOCKET clientSock = accept(mainSock, (SOCKADDR*)&remoteAddr, &nAddrSize);
  54.                 if (clientSock != INVALID_SOCKET)//accept调用成功
  55.                 {
  56.                         //构建一个IO_INFORMATION对象
  57.                         PIO_INFORMATION pIOInfo = new IO_INFORMATION;
  58.                         memset(pIOInfo, 0, sizeof(IO_INFORMATION));//初始化pIOInfo
  59.                         memset(pIOInfo->Buffer, 0, BUF_LEN);//初始化缓冲区
  60.                         memset(&pIOInfo->Overlapped, 0, BUF_LEN);//初始化重叠结构
  61.                         pIOInfo->Sock = clientSock;
  62.                         pIOInfo->RecBuf.len = BUF_LEN;//设置缓冲区长度
  63.                         pIOInfo->RecBuf.buf = pIOInfo->Buffer;//设置数据缓冲区
  64.                         pIOInfo->neType = NE_REC;//设置网络事件
  65.                         //MessageBox(0, _T("有新的客户端连接"), _T("Info"), 0);
  66.                         //绑定套接字和完成端口
  67.                         if (CreateIoCompletionPort((HANDLE)pIOInfo->Sock,hComPort,(SIZE_T)pIOInfo,0) == NULL)
  68.                         {
  69.                                 return FALSE;
  70.                         }
  71.                         //有错误发生
  72.                         if (WSARecv(pIOInfo->Sock,&pIOInfo->RecBuf,1,&pIOInfo->swRecvLen,&nFlags,&pIOInfo->Overlapped,NULL) == SOCKET_ERROR)
  73.                         {
  74.                                 int nError = WSAGetLastError();//获取错误代码
  75.                                 if (nError != WSA_IO_PENDING)//错误代码没有重叠操作进行中
  76.                                 {
  77.                                        
  78.                                         closesocket(pIOInfo->Sock);//关闭网络套接字
  79.                                         delete pIOInfo;//释放pIOInfo对象
  80.                                 }
  81.                         }
  82.                 }
  83.         }
  84.         return 0;
  85. }
复制代码

理论上服务器是不需要界面的,不过顺便做了点,但该界面没用到。只是功能代码的优化及实现。

etc.


Audio_Design2(AD集成库AS3430,AS3410,AS3400包含3D模型).zip (37.38 KB, 下载次数: 2)










562

主题

1222

帖子

8133

积分

版主

Rank: 7Rank: 7Rank: 7

积分
8133
沙发
发表于 2016-8-30 09:44:42 | 只看该作者
这个是什么呢? 没看明白
1、机智云QQ群: 287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits /   机智云智能宠物屋go-kit
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

4

主题

25

帖子

231

积分

中级会员

Rank: 3Rank: 3

积分
231
板凳
 楼主| 发表于 2016-8-30 16:45:36 | 只看该作者
Genius 发表于 2016-8-30 09:44
这个是什么呢? 没看明白

主动降噪

4

主题

25

帖子

231

积分

中级会员

Rank: 3Rank: 3

积分
231
地板
 楼主| 发表于 2016-8-30 21:18:06 | 只看该作者
Notes

Record
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表