【雕爷学编程】Arduino动手做(137)---MT8870语音解码

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十七:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路

在这里插入图片描述
知识点:MT8870芯片

音调译码器(Tone Decoder)是 MITEL 公司所开发生产为一颗常用复频译码 IC,这个电路可以接收 DTMF 信号,是一个完整的 DTMF 接收器。它接收了 DTMF 信号后,内部将信号分成高频带和低频带,并将此信号送至数字译码器,然后将讯号送至数字译码器以解出按键值,接着将解出的按键值以二进制的方式以四条线(Q1、Q2、Q3、Q4)输出到外部共享 Bus 上,其MT8870 接脚说明如表 1 及内部结构如图 2。值得一提的是,当 MT8870 解出一个按键值且输出到外部时,其 STD 接脚会由低态升为高态,经一段时间后再降为低态,我们便可利用此特点侦测到此脚有讯号时便马上将 Q1-Q4 接脚所产生的值读入 CPU,然后解出电话的按键值。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
DTMF
双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信号有16个编码。利用DTMF信令可选择呼叫相应的对讲机。

在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。电话机中通常有16个按键,其中有10个数字键0~9和6个功能键*、#、A、B、C、D。由于按照组合原理,一般应有8种不同的单音频信号。因此可采用的频率也有8种,故称之为多频,又因它采用分别从高低频中任意抽出1种进行组合来进行编码,所以又称之为“8中取2”的编码技术。根据CCITT的建议,国际上采用的多种频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。用这8种频率可形成16种不同的组合,从而代表16种不同的数字或功能键。

在这里插入图片描述
MT8870语音解码模块

1、板载MT8870复频译码芯片

2、板载语音输入接口

3、板载5个LED指示灯,方便查看输出状态

4、芯片主要管脚基本都已经引出

5、PCB尺寸:26.5(mm)x24.5(mm)
在这里插入图片描述
模块参考电原理图

在这里插入图片描述
双音多频信号(DTMF)
电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。
在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续(早期方法,很老很古董)。

双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。

双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如’1’相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。

双音多频(DTMF)是由贝尔实验室开发的信令方式,通过承载语音的模拟电话线传送电话拨号信息。每个数字利用两个不同频率突发模式的正弦波编码,选择双音方式是由于它能够可靠地将拨号信息从语音中区分出来。一般情况下,声音信号很难造成对DTMF接收器的错误触发。DTMF是“TouchTone” (早期AT&T的商标)的基础, 替代机械式拨号转盘的按键。

在这里插入图片描述
DTMF编码器
基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,即可满足Nyquist条件。DTMF双音频信号由两个二阶数字正弦振荡器产生,一个用来产生行音频信号,另一个产生列音频信号。

CCITT规定每秒最多按10个键,即每个键时隙最短为100MS,其中音频实际持续时间至少为45MS,不大于55MS,时隙的其他时间内保持静默,因此按键产生双音频信号时,相继的两个信号间隔一段时间;解码器利用这个时间识别出双音频信号,并转换成对应的数字信息,而且要识别出间隙信息。因此流程包含音频任务和静默任务,前者是产生双音频采样值,后者产生静默样值,每个任务结束时,要重置定时器和下一个任务。其中静默任务还要加上一个任务:从数字缓冲区取出数字并解包。解包就是将数字映射为对应的行列音频特性,装载指针指向振荡器特征表对应的正确位置。两个任务轮流执行。由CCITT(国际电报电话咨询委员会)的规定,数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。每个任务结束后,启动下一个任务前(音频信号任务或静音任务),都必须复位决定其持续时间的定时器变量。在静音任务结束后,DSP从数字缓存中调出下一个数字,判决该数字。信号所对应的行频和列频信号,并根据不同频率确定其初始化参数。

DTMF信号包含两组音频信号,解码器的任务是通过数学变换把它从时域转化到频域,然后得出对应的数字信息。由于芯片处理的是数字信号,所以必须把输入信号数字化,再用DSP芯片处理。频率检测时,检测出DTMF信号的基波及二次谐波,DTMF信号只在基波上有较高的能量,而话音信号则是在基波上叠加有较强的二次谐波,检测二次谐波的作用是用来区分DTMF信号与语言和音乐信号。

在这里插入图片描述
DTMF特性
DTMF是由低频组(fb)和高频组(fa)两组频率信号构成,每个数字信号由低频组和高频组的任意一个叠加而成。根据CCITT的建议,DTMF的编译码定义可用下式表示 f(t)=A_{a}sin(2f_{a}t)+A_{b}sin(2f_{b}t) 式中两项分别表示低、高音频的值,Ab和Aa分别表示低音群合高音群的样值量化基线,而且两者幅值比为K=Ab/Aa(0.7<K<0.9)。同时规定,对应于DTMF编译码中的标称频率在发送时,DTMF信号的频率偏差不应当超过1.5%,每位数字的信号极限时长应该大于40ms,而接收设备对2%的偏差应能可靠地接收,对30ms~40ms时长的信号可以正常地接收。

与单音编码不同,DTMF信号是采用8中取2的方式,从高低两个音组中各取一个音频复合而成来代表0-9十个号码和其他功能码,再加上这8个音频信号的各频率间不存在谐波关系,大大减少了虚假信号的干扰,因而DTMF信号工作可靠性特别是抗干扰能力很强。

DTMF应用
DTMF信号即双音频信号,最先用于程控电话交换系统来代替号盘脉冲信号,主叫用户摘机按键拨号后,电话号码所对应的DTMF信号通过电话线传到程控交换机中的DTMF接受电路,交换机中的微机识别被叫电话号码后,接通主被叫用户实现双方通话。

DTMF信号还用于自动控制系统,如果把DTMF的发送电路用于主控系统,接收电路用于被控系统,就可以方便地组成有线或无线通信系统,其通道数视需要而定,16通道以内每通道只需编一位号码即可,若需要更多通道,则可像电话号码编号一样编为两位或两位以上的号码。DTMF信号还被用于部分型号的车载导航终端,用于远程下发目的地坐标信息。比如警情自动拔号、DTMF远程控制系统,基于DTMF编解码的智能家居电话远程控制系统等。
在这里插入图片描述
第一项实验:用arduino的PWM脚(11、12)合成DTMF双音多频编码信号

1、安装 "Tone.h"库: IDE-工具-管理库-搜索-安装
2、项目测试 :将喇叭贴近电话机话筒,然后发送要拨的电话号码到串口,比如10000,即可拨通电话10000
3、需要材料:喇叭1个,68Ω电阻两个
4、硬件连接:在D11,D12引脚各接一个68Ω电阻一端,
68Ω电阻另一端接喇叭,然后喇叭另一端接地。

在这里插入图片描述

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百三十七:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路

  第一项实验:用arduino的PWM脚(11、12)合成DTMF双音多频编码信号

  1、安装 "Tone.h"库: IDE-工具-管理库-搜索-安装

  2、项目测试 :将喇叭贴近电话机话筒,然后发送要拨的电话号码到串口,比如10000,即可拨通电话10000

  3、需要材料:喇叭1个,68Ω电阻两个

  4、硬件连接:在D11,D12引脚各接一个68Ω电阻一端,

    68Ω电阻另一端接喇叭,然后喇叭另一端接地。

*/



#include <Tone.h>

String Phone_Number = "";

int i = 0, mark = 0;

//定义freq1,freq2为Tone实例,并且定义双音多频的频率

Tone freq1;

Tone freq2;

const int DTMF_freq1[] = {1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477};

const int DTMF_freq2[] = {941,  697,  697,  697,  770,  770,  770,  852,  852,  852};

void setup()

{

  Serial.begin(9600);

  //定义声音产生引脚在Arduino的D11,D12

  freq1.begin(11);

  freq2.begin(12);

}

void loop()

{

  //读出串口数据,串接成Phone_Number字符串

  while (Serial.available() > 0)

  {

  Phone_Number += char(Serial.read());

  delay(2);

  mark = 1;

  }

  //播放DTMF音频,电话号码来自Phone_Number,持续长度200ms,间隔长度300ms

  PlayDTMF(Phone_Number, 200, 300);

  //如果刚才接收到串口的电话号码,因为号码已经在喇叭输出了,清空电话号码并且重置mark

  if (mark == 1)

  {

  Phone_Number = "";

  Serial.println();

  mark = 0;

  }

}

/*

  DTMF播放函数

  调用格式:playDTMF(数字(0~9), 持续时间)。

*/

void PlayDTMF(String Number, long duration, long pause)

{

  //如果输入数字为空,或者持续时间不为正数,或者暂停时间不为正数

  //则视作错误,立即停止执行返回主程序。

  if (Number.length() == 0 || duration <= 0 || pause <= 0) return;

  //将Number逐个文字分离,

  for (i = 0; i < Number.length(); i++)

  {

  //如果Number属于0~9的数字字符

  if (Number >= '0' && Number <= '9')

  {

    //则将它ASCII码减去‘0’,得到纯数字,

    Number = '0';

    //然后在串口输出一份,便于查看

    Serial.print(i, DEC);

    //输出双音多频之一

    freq1.play(DTMF_freq1, duration);

    //输出双音多频之二

    freq2.play(DTMF_freq2, duration);

    delay(pause);

  }

  }

}


通过串口,尝试输入10000号码,手机11位号码和一个28位的号码

在这里插入图片描述
视频——第一项实验:用arduino的PWM脚(11、12)合成DTMF双音多频编码信号

https://v.youku.com/v_show/id_XNDU3MzExODkzMg==.html

Arduino实验开源代码

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百三十七:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路

  第二项实验:重复播放合成DTMF双音多频8675309拨号音

  1、安装 "Tone.h"库: IDE-工具-管理库-搜索-安装

  2、项目测试 :发送电话号码8675309到串口

  3、需要材料:喇叭1个,68Ω电阻两个

  4、硬件连接:在D11,D12引脚各接一个68Ω电阻一端,

    68Ω电阻另一端接喇叭,然后喇叭另一端接地。

*/



#include <Tone.h>

Tone freq1;

Tone freq2;

const int DTMF_freq1[] = { 1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477 };

const int DTMF_freq2[] = {  941,  697,  697,  697,  770,  770,  770,  852,  852,  852 };

void setup()

{

  Serial.begin(9600);

  freq1.begin(11);

  freq2.begin(12);

}

void playDTMF(uint8_t number, long duration)

{

  freq1.play(DTMF_freq1[number], duration);

  freq2.play(DTMF_freq2[number], duration);

}

void loop()

{

  int i;

  uint8_t phone_number[] = { 8, 6, 7, 5, 3, 0 , 9 };

  for (i = 0; i < sizeof(phone_number); i ++)

  {

  Serial.print(phone_number, 10);

  Serial.print(' ');

  playDTMF(phone_number, 500);

  delay(600);

  }

  Serial.println();

  delay(4000);

}


第二项实验:重复播放合成DTMF双音多频8675309拨号音
1、安装 "Tone.h"库: IDE-工具-管理库-搜索-安装
2、项目测试 :发送电话号码8675309到串口
3、需要材料:喇叭1个,68Ω电阻两个
4、硬件连接:在D11,D12引脚各接一个68Ω电阻一端,
68Ω电阻另一端接喇叭,然后喇叭另一端接地。

在这里插入图片描述
Arduino实验场景图

在这里插入图片描述
Arduino实验开源代码

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百三十七:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路

  第三项实验:用合成DTMF双音多频信号测试咪头传感器和DTMF解码模块

  1、安装 "dtmf"库: 下载https://codeload.github.com/DFRobot/DTMF/zip/master

  2、需要材料:喇叭1个,68Ω电阻两个,咪头传感器和DTMF解码模块,两块UNO板

  3、合成信号硬件连接:在D11,D12引脚各接一个68Ω电阻一端,68Ω电阻另一端接喇叭,然后喇叭另一端接地。

  4、咪头模块接线:

  MAX9814  Arduino

  VCC      5V

  GND      GND

  OUT      IN(接到DTMF)

  5、DTMF解码模块接线

  DTMF    Arduino

  VCC      5V

  GND      GND

  Q1      12

  Q2      11

  Q3      10

  Q4      9

*/



#include "dtmf.h"

DTMF dtmf;

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  // 读DTMF代码并且用串行输出

  int myDtmf;

  myDtmf = dtmf.getDTMF();

  if (myDtmf != -1)

  Serial.println(myDtmf);

  delay(100); // 以避免收到重复的输出。

}


DTMF解码识别模块实验视频
https://v.youku.com/v_show/id_XNDU3OTkzOTA4OA==.html

打开"dtmf.h"库文件查看,发现是针对不同硬件模块的(板上芯片都是MT8870),由于接脚对不上号,故串口输出的解码不对的

在这里插入图片描述
不同的硬件模块(板上芯片都是MT8870),名称为 Arduino DTMF语音识别扩展板 V1.0

在这里插入图片描述
Arduino实验开源代码

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百三十七:MT8870 DTMF语音解码板模块 电话拨号控制音频解码处理电路

  第四项实验:不用库,使用MT8870芯片模块进行DTMF解码

  1、需要材料:喇叭1个,68Ω电阻两个,咪头传感器和DTMF解码模块,两块UNO板

  2、合成信号硬件连接:在D11,D12引脚各接一个68Ω电阻一端,68Ω电阻另一端接喇叭,然后喇叭另一端接地。

  3、咪头模块接线:

  MAX9814  Arduino

  VCC      5V

  GND      GND

  OUT      IN(接到DTMF)

  4、DTMF解码模块接线

  DTMF    Arduino

  VCC      5V

  GND      GND

  Q1      12

  Q2      11

  Q3      10

  Q4      9

*/



int keyvalue;  // 与音调相关的数字

void setup(){

Serial.begin(9600);

pinMode(12, INPUT); //从解码器芯片输入二进制1的数字

pinMode(11, INPUT); //从解码器芯片输入二进制2的数字

pinMode(10, INPUT); //从解码器芯片输入二进制4的数字

pinMode(9, INPUT); //从解码器芯片输入二进制4的数字

}

void loop()

// 首先确定键的以10为底的值 0-11

{

if (digitalRead(6) == HIGH) //如果二进制1为高

{

keyvalue = 1;  //使键值等于1

}

else

{

keyvalue = 0;  //否则将其设为零

}

if (digitalRead(7) == HIGH)  //如果二进制2为高

{

keyvalue = keyvalue + 2;  //在键值中添加“ 2”

}

if (digitalRead(8) == HIGH)  //如果二进制4为高

{

keyvalue = keyvalue + 4;  //将“ 4”添加到键值

}

if (digitalRead(9) == HIGH)  //如果二进制8为高

{

keyvalue = keyvalue + 8;  //将“ 8”添加到键值

}

// 现在将键值9、10和11转换为“ 0”,“ *”和“#”

if (keyvalue == 10)

{

Serial.println("0"); //打印零键

}

else

{

if (keyvalue == 11)

{

Serial.println("*"); //打印星号键

}

else

{

if (keyvalue == 12)

{

Serial.println("#"); //打印井号

}

else

{

Serial.println(keyvalue); //它不是特殊键,所以只需打印

}

}

}

delay(500);

}

从MT8870 DTMF语音解码板模块上,5只解码LED灯看,是在正常工作,只是串口输出的数字,依旧好像不对…

在这里插入图片描述
附录:基于DTMF编解码的智能家居电话远程控制系统

本着“环保与创新”的主题,系统集本地家电控制和监控模块,DTMF编解码的电话远程控制和监控模块以及以太网web server的远程家居控制和监控系统模块三大模块为一体,实现智能家居控制。电话远程控制和以太网远程控制,不需进行专门的布线,不占用无线电频率资源,避免了电磁污染。且可以通过以太网实时监控家用电器,避免了没必要的电力资源浪费。

一、本地家电控制和监控模块

此模块能够实时检测温湿度、一氧化碳、烟雾等的数值或者浓度,并在1602液晶上显示相关参数。当超过一定的警戒线,它还会发出警报以及通知主系统(AVR 32)出现何种警情,让主系统进行相关处理。

二、DTMF编解码的电话远程控制和监控模块

此模块能够受手机控制,通过手机拨打家里电话来远程控制家里的电器的开闭,以及当家里出现盗贼或者出现险情(包括火灾、煤气泄漏等)时固定电话能及时自动拨打电话通知用户。

三、以太网web server的远程家居控制和监控系统模块

此模块通过网线接入以太网后,用户可以通过手机或PC机打开相应浏览器来远程控制家里的电器的开闭,以及监控家里的温湿度,煤气传感器和烟雾传感器的数据。

2.2 性能要求

一、本地家电控制和监控模块

此模块性能要求传感器采集数据要实时,而且要快速,采集出来的数据经过相应转换后得到的数值与实际数值相差不能超过5%,温度的精度为0.1℃,湿度的精度为0.5%RH。

二、DTMF编解码的电话远程控制和监控模块

此模块性能要求能响应速度快,即有人拨打电话时,此模块能够在1S内检测到有电话打入,并记录下拨打人输入的按键信息。此外,当要实现自动拨打电话时,要求此模块模拟按下的电话号码要准确无误,确保准确性。

三、以太网web server的远程家居控制和监控系统模块
此模块要求接入互联网,当用户浏览网页时,家用电器信息和传感器数据每隔几秒刷新一次,确保数据传输的快速性和准确性。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33090.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云原生之深入解析Dapr安全性之访问控制策略

一、服务调用范围访问策略 ① 跨命名空间的服务调用 Dapr 通过服务调用 API 提供端到端的安全性&#xff0c;能够使用 Dapr 对应用程序进行身份验证并设置端点访问策略&#xff1a; Dapr 应用程序可以被限定在特定的命名空间&#xff0c;以实现部署和安全&#xff0c;当然仍然…

Istio 什么是服务网格

什么是服务网格 服务网格(Service Mesh)这个术语通常用于描述构成这些应用程序的微服务网络以及应用之间的交互。随着规模和复杂性的增长&#xff0c;服务网格越来越难以理解和管理。 它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求&am…

oracle字符集

1、查看oracle字符集 如果操作系统或者客户端的字符集设置和数据库设置不一样就会出现乱码 查询NLS_LANG即操作系统环境变量要设为 NLS_LANGUAGE_NLS_TERRITORY**.NLS_CHARACTERSET**&#xff0c;如&#xff1a; export NLS_LANG“AMERICAN_AMERICA.AL32UTF8”

Hadoop环境搭建

一、简介 1.1、概念 Hadoop是一个由Apache基金会所创建的分布式系统基础架构&#xff0c;主要解决海量数据的存储和海量数据的分析计算问题&#xff0c;从广义上来说hadoop是数据存储分包器&#xff0c;可以存储大量的数据。 1.2、优势 Hadoop具有高可靠性&#xff08;Hado…

electron+vue3+ts+vite

首先使用vite工具创建一个vue3ts的项目 npm create vite创建好vuets项目后启动项目 cd electron-vue3-ts-vitenpm installnpm run dev 访问http://127.0.0.1:5173/地址可以看到项目已经启动成功 安装Electron 接下来我们安装electron&#xff0c;使用以下命令 npm i -D el…

CV什么时候能迎来ChatGPT时刻?

卷友们好&#xff0c;我是rumor。 最近看了几篇CV的工作&#xff0c;肉眼就感受到了CVer们对于大一统模型的“焦虑”。 这份焦虑让他们开始尝试统一一切&#xff0c;比如&#xff1a; 统一复杂的自动驾驶任务的优化目标[1]&#xff0c;来自今年CVPR最佳论文。统一典型的CV任务&…

360手机 360手机刷机最高安卓版本参考

360手机 360手机刷机最高安卓版本参考 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机&#xff1a;360rom.github.io 【360手机(最高)安卓版本】 以下列举为常见360手机机型&#xff1b;其它早期系列&#xff0c;一般为Android4-6左右360手机UI界…

doker安装RabbitMQ以及用java连接

目录 doker安装&#xff1a; RabitMq安装&#xff1a; java链接 doker安装&#xff1a; 参考链接&#xff08;非常详细&#xff09;&#xff1a; docker安装以及部署_docker bu shuminio_春风与麋鹿的博客-CSDN博客 安装好后开启doker //启动docker服务 systemctl start do…

保偏产品系列丨5款保偏光纤产品简介

保偏光纤应用日益扩大&#xff0c;特别是在干涉型传感器等测量方面&#xff0c;利用保偏光纤的光无源器件起着非常重要的作用&#xff0c;种类也很多。 本文来介绍5款保偏光纤系列产品以及它们的性能&#xff0c;欢迎收藏转发哦&#xff01; 01、保偏光纤跳线-TLPMPC 保偏光纤跳…

梯度下降法求函数的解

题目 例如 y x^ 5 e^x3x−3&#xff0c;求解y 0的解 问题分析 首先要构造y 0的损失函数&#xff0c;让这个损失函数是凸的&#xff0c;也就是可以有最优解&#xff0c;并且是可到的&#xff0c;比较容易想到的是mse平方误差&#xff0c;我们要让y和0之间绝对误差最小。lo…

css 背景颜色级别高于背景图

<div class"bg-parent"> <img :src"employeeImg" class"bg-url" /> <div class"bg"> <el-icon class"plus-icon"> <Plus /> </el-icon> </div> </div> .bg-parent{ //父级…

python3套接字编程之socket和socketserver(TCP和UDP通信)

socket和socketserver是python3中socket通信模块&#xff0c;关于其使用做如下总结。 目录 1.socket 1.1模块引入 1.2套接字获取 1.3套接字接口 1.3.1 服务端 1.3.2 客户端套接字函数 1.3.3 公共套接字函数 1.3.4 面向锁的套接字方法 1.3.5 面向文件的套接字的函数 …

CNN卷积类型总结(标准卷积、空洞卷积、反卷积、深度可分离卷积、分组卷积等)

目录 标准卷积 卷积的运算 conv2d conv1d 其他卷积类型 空洞卷积&#xff08;膨胀卷积&#xff09; 反卷积&#xff08;转置卷积&#xff09; 深度可分离卷积 分组卷积 参考文章 上学时&#xff0c;卷积常在各个课程中出现&#xff0c;现代、信号与系统这些&#xff…

【MySQL】SQL的高阶用法

文章目录 条件查询使用关系运算符查询使用IN关键字查询使用BETWEEN AND关键字查询使用空值查询使用AND关键字查询使用OR关键字查询使用LIKE关键字查询(模糊查询)使用LIMIT分页查询使用GROUP BY进行分组查询GROUP BY和聚合函数一起使用GROUP BY和聚合函数以及HAVING一起使用 使用…

热点探测技术架构设计与实践

1. 概述 说到热点问题&#xff0c;首先我们先理解一下什么是热点&#xff1f; 热点通常意义来说&#xff0c;是指在一段时间内&#xff0c;被广泛关注的物品或事件&#xff0c;例如微博热搜&#xff0c;热卖商品&#xff0c;热点新闻&#xff0c;明星直播等等&#xff0c;所以…

2-css-2

一 复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 1 后代选择器 后代选择器&#xff1a;选中某元素的后代元素。 选择器写法&#xff1a;父选择器…

【微信小程序开发】第 7 课 - 小程序的常用组件

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、小程序中组件的分类 3、常用的视图容器类组件 3.1、view 组件 3.2、scroll - view 组件 3.3、swiper 和 swiper…

OpenAI 重磅更新 变得更强啦 | 包括更多可控的 API 模型、函数调用能力、更长的上下文和更低的价格

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 官网&#xff1a;https://openai.com/blog/function-calling-and-other-api-updates 功能调用和其他 API 更新。OpenAI 宣布更新&#xff0c;包…

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP)

哈工大计算机网络课程网络层协议详解之&#xff1a;互联网控制报文协议&#xff08;ICMP&#xff09; 在互联网中&#xff0c;IP数据报的传输很容易出现差错&#xff0c;当出现差错时&#xff0c;最简单的处理办法就是对该IP数据报进行丢弃。但是&#xff0c;并不是直接丢弃就…

Linux 学习记录40(C++篇)

Linux 学习记录40(C/QT篇) 本文目录 Linux 学习记录40(C/QT篇)一、QT软件的使用1. 新建工程 二、C语言和C的区别1. C对C的扩充2. C对C的兼容 三、第一个C程序1. cout标准输出流对象(1.介绍&#xff1a;(2. 运算符(3. cout的使用 2. cin标准输出流对象(1.介绍&#xff1a;(3. ci…