DTMF通信系统设计—基于MATLAB和STM32

2023-11-06

1 摘要

双音多频(DTMF)信号具有抗干扰能力强、传输速率高的优点,其首先应用于电话的拨号系统。随着时代的发展,DTMF 信号的应用也更加广泛,现今已被应用在诸如语言菜单、语音邮件、电话银行和ATM 终端中。

本系统分别基于MATLAB 和单片机完成了DTMF 通信系统的设计,可实现基于DTMF信号的MATLAB 双机通信、单片机双机通信以及MATLAB 与单片机的相互通信等功能,并且能输出相关波形及声音。为了操作更加简便,结果观察更加直观,系统设计有相应的GUI 界面。此外,为了保护系统的隐私性,本系统还增加了登录功能,可实现用户注册、修改密码。

关键词:双音多频;MATLAB;单片机;双机通信

2 设计任务

  1. 利用MATLAB 设计一个DTMF 通信系统;
  2. 输出DTMF 波形及声音;
  3. 利用单片机设计一个DTMF 通信系统

3 课程设计主要解决的问题

  1. 六位电话号码输出到MATLAB GUI 的文本框中时,显示不完全。
    错误原因:起初获取输入号码时利用str2num()函数,将字符串转换成了数字,号码检测完成后,输出结果仍为数字变量,由于数值较大,显示时自动采用了科学计数法来表示,导致输出结果出现错误。
    解决办法:在输出检测结果前,先利用num2str()函数将数字转换成字符串,然后再输出。

  2. 利用单片机根据时序图进行DTMF 编码时出现编码错误,0~9 只有两种DTMF 信号。
    错误原因:控制DTMF 编码数据位的单片机引脚被复用。
    解决办法:选择其他没被复用的GPIO 口。

  3. 利用录音进行六位号码检测时,检测出的结果出现错误。
    错误原因:利用audiowrite()函数将录音存储为.wav 文件时,audiowrite 要求信号幅度位于[-1,1]区间,但是产生的DTMF 信号幅度位于[-2,2]区间,所以在存储时信号被裁剪。而译码时信号幅度又是重要参量,所以导致译码错误。
    解决办法:在利用audiowrite()函数将录音存储为.wav 文件前先将DTMF 信号幅度缩小两倍再进行存储,读取出来后再放大两倍,恢复成原来的幅度。

  4. 实现MATLAB 双机通信时,误码率较高。
    错误原因:DTMF 信号的幅度偏低,而噪声较大,导致信噪比较低,接收时误码率偏高。
    解决办法:提高DTMF 信号的幅度。

4 设计内容

4.1 整体设计方案

  1. MATLAB部分
    由一个高频信号和一个低频信号叠加生成一个DTMF 信号,发送端利用sound()函数将数字信号转换成模拟语音信号,接收端利用audiorecorder()函数对模拟语音信号进行采样将其转换为数字信号,做出译码并显示结果,二者通过音频线连接,也可直接将声音外放,译码利采用戈泽尔算法。

MATLAB设计示意图
这个图容易引发歧义,图中“产生DTMF信号”实际指的是MATLAB配置好频率,实际发出声音产生还是要DAC。

  1. 单片机部分
    主要流程与MATLAB 实现相同,以STM32F103ZET6 为主控核心,利用AE11A04模块产生DTMF 信号,MT8870 芯片及其外部电路实现DTMF 信号的接收,声音信号通过音频线传输。

  2. 输出DTMF 波形及声音
    MATLAB 中利用plot()函数绘出DTMF 时域波形,利用stem()函数绘出频谱图,利用sound()函数输出DTMF 拨号音;单片机部分利用扬声器输出DTMF 拨号音,将声音传输给MATLAB 并利用MATLAB 显示出波形;

4.2 详细设计内容

  1. 基于MATLAB 的DTMF 通信系统
    实现了利用MATLAB 对DTMF 信号的产生和检测,并且能够实现两台PC 机间的任意位电话号码传输和接收。

  2. 基于单片机的DTMF 通信系统
    以STM32F103ZET6 为主控核心,实现了DTMF 信号的产生以及接收,可实现两台单片机间的六位电话号码传输和接收。也可以由一台单片机自发自收。

  3. MATLAB 与单片机间的DTMF 通信
    实现了由MATLAB 产生六位电话号码,通过音频线发送给单片机,单片机进行接收并正确显示接收结果。

  4. 输出DTMF 波形及声音
    在MATLAB 中实现了输出DTMF 时域波形、频谱以及声音。单片机也可输出DTMF声音,波形显示需借助于示波器或者MATLAB。

  5. MATLAB 登录系统设计
    设计了一个MATLAB 登陆系统,可实现用户注册、修改密码等功能。

  6. MATLAB 和单片机均设计了相应的GUI 界面,操作简便,便于观察检测结果和相关
    波形。

5 结果与分析

5.1 基于MATLAB 的DTMF 通信系统

  1. DTMF 信号波形显示声音输出以及六位电话号码检测
    DTMF仿真页面
    上图右侧可以设置信噪比,选择是否引入高斯白噪声。每按下一个按键就会检测按下键值。左侧可以进行6位电话号码检测。可以显示检测结果,查看每一位DTMF信号的波形和频谱。当不引入噪声时结果均正确;引入噪声且信噪比较低时会出现接收错误。

5.2 双机通信模拟

此时需要两台电脑和一根音频线,一台电脑做发送端,另一台电脑做接收端。

首先在主页选择双机通信主页面
进入双机通信仿真页面,发送端发送125869。

双机通信页面

接收端首先点击开始检测,会弹出一个窗,提示准备开始录音。

弹窗提示准备开始录音
接收端按下确定后,发送端点击拨号。此时接收端开始录音,录音完成后会显示检测结果,点击声音波形或者短时能量可以看到接收信号的声音波形和短时能量波形。
接收端

5.2 基于单片机的DTMF 通信系统

由于资源有限,所以这里只用一台单片机自发自收,模拟双机通信,二者原理相同。仿真结果可以看出发送接收,误码率较低。

单片机检测结果

5.3 MATLAB 与单片机间的DTMF 通信

由MATLAB 随机发送六位电话号码,单片机进行接收,能正确判断发送的号码以及号
码位数,二者通过音频线相互连接。

电脑端选择单片机通信,输入号码,通过音频线发送给单片机,单片机解析并显示。

MATLAB发送号码

单片机解析结果

可以看出,MATLAB 发送的六位号码为“106337”,单片机检测的号码位数为六位,检测结果为“006337”,第一位出现错误。但是在大量的仿真实验中发现,单片机接收的误码率还是很低的。

6 总结与展望

本次课程设计基于MATLAB 和单片机设计了一个DTMF 通信系统,系统操作简单,误码率较低,不仅满足了题目要求,还做出了相应的拓展,总体来看较为满意。通过本次课程设计强化了我的MATLA 编程、C 语言编程和GUI 界面设计的能力,加深了我对DTMF 通信系统的了解,学习到了一些用于DTMF 编、译码的模块和芯片,了解了戈泽尔算法的原理。由于单片机部分资料较少,所有程序都只能根据芯片资料编写,甚至有些芯片的资料为英文。这不仅锻炼了我的英文水平,还让我学习了如何根据芯片时序图独立编写程序。

当然,本次设计也有不足之处,由单片机产生DTMF 信号时,两个音频输出口同时只能一个具有有效输出,所以无法在发送DTMF 信号时产生拨号音。此外,在由于课程设计时间有限,所以系统还有许多可以改进的地方。比如利用DMA 使得编码、译码分别独立进行,以提高系统运行效率,甚至利用红外遥控或者蓝牙实现远程控制DTMF 编码等功能。

至此课程设计报告的内容已经介绍完成,接下来针对程序设计时的核心部分做一个简单介绍,后续博主也会将程序代码上传到资源,感兴趣的友友可以关注一下哟。

7 关键程序设计

7.1 MATLAB程序设计

7.1.1 产生DTMF信号

MATLAB产生DTMF信号较为简单,生成两个固定频率的正弦信号,将二者叠加(相加)起来即可。

DTMF信号频率对应关系

以“1”为例,介绍一下MATLAB生成DTMF信号的程序设计

%按键1
A=10;%振幅
fs=44100;   %采样频率
N=8820;    % 信号样点数,每个音频播放时长
f = [697,1209;697,1336;697,1477;770,1209;770,1336;770,1477;852 1209;852 1336;852 1477;

global y;
y = [y A*sin(2*pi*f(1,1)*(0:N-1)/fs)+A*sin(2*pi*f(1,2)*(0:N-1)/fs) zeros(1,4410) ];
n=strcat(get(handles.edit1,'String'),'1');
set(handles.edit1,'String',n);   % 显示按下的按键

值得注意的是,如果信号幅值太小会导致译码时错误概率升高。

7.1.2 DTMF信号译码

以单个DTMF信号解析为例,介绍一下译码过程。

%单个按键检测程序 
    %DAC生成DTMF信号音
    filename = ('chen.wav'); %给文件取名
    audiowrite(filename,z1,8000) %存储.wav音频文件,在这里文件名为dtmf.wav

    %ADC解析录音文件
    [r1,~]=audioread('chen.wav');
    r1=r1.*2;   %程序里audiowrite要求sum_x位于[-1,1]区间,译码时信号幅度是重要参量,所以读取完之后要把幅度变为原来的幅度

    X=goertzel(r1(1:N),K+1);   %利用戈泽尔算法进行译码
        val=abs(X);
   
    limit=80;
   for s=5:8
       if val(s)>limit,break,end   %查找列号
   end
   for r=1:4
       if val(r)>limit,break,end   %查找行号
   end
   TNr=tm(r,s-4);   %译码结果

7.2 单片机程序设计

7.2.1 产生DTMA信号

单片机利用AE11A04芯片产生DTMF信号,具体的资料找不到了,有兴趣的友友可以到某宝搜索一下。这里凭借之前的程序,简单介绍一下产生DTMF信号的原理。

实际原理比较简单,当时买的一个集成的硬件模块,一共五根线,分别是STD,AD0,AD1,AD2,AD3。需要产生DTMA信号时先拉高STD引脚,配置AD0~AD3,组成一个二进制数,实际DTMF信号就是由二进制数控制,4位二进制数,16种组合,每一种代表一个DTMF信号。延时500ms后再将STD引脚拉低,就输出了一个DTMF信号。具体的对应表格有些找不到了,大家也可以根据下面每一个DTMF信号的程序看一下对应关系。

void AE11A04_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB,PE端口时钟
	
	GPIO_InitStructure.GPIO_Pin = STD | AD0 | AD1 | AD2 | AD3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
	GPIO_ResetBits(GPIOB,STD | AD0 | AD1 | AD2 | AD3);
}

// 接下来是每一个DTMF信号对应的IO配置,这里只用到了数字

	// 数字1
	GPIO_SetBits(GPIOB,STD | AD0);
	GPIO_ResetBits(GPIOB,AD1 | AD2 | AD3);   //对DTMF信号做二进制编码
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字2
	GPIO_SetBits(GPIOB,STD | AD1);
	GPIO_ResetBits(GPIOB,AD0 | AD2 | AD3);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字3
	GPIO_SetBits(GPIOB,STD | AD0 | AD1);
	GPIO_ResetBits(GPIOB,AD2 | AD3);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字4
	GPIO_SetBits(GPIOB,STD | AD2);
	GPIO_ResetBits(GPIOB,AD0 | AD1 | AD3);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字5
	GPIO_SetBits(GPIOB,STD | AD0 | AD2);
	GPIO_ResetBits(GPIOB,AD1 | AD3);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字6
	GPIO_SetBits(GPIOB,STD | AD1 | AD2);
	GPIO_ResetBits(GPIOB,AD0 | AD3);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字7
	GPIO_SetBits(GPIOB,STD | AD0 | AD1 | AD2);
	GPIO_ResetBits(GPIOB,AD3);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字8
	GPIO_SetBits(GPIOB,STD | AD3);
	GPIO_ResetBits(GPIOB,AD0 | AD1 | AD2);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字9
	GPIO_SetBits(GPIOB,STD | AD0 | AD3);
	GPIO_ResetBits(GPIOB,AD1 | AD2);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

	// 数字0
	GPIO_SetBits(GPIOB,STD | AD1 | AD3);
	GPIO_ResetBits(GPIOB,AD0 | AD2);
	delay_ms(500);
	GPIO_ResetBits(GPIOB,STD);

7.2.2 单片机接收

单片机接收使用的是MT8870芯片,也是直接买的集成好的模块。跟生成DTMF信号的原理相同,他也是通过四根信号线接收到的4位二进制数来判断是哪个DTMF信号。这里只贴一下MT8870的初始化函数,具体解析时信号的对应关系可以看一下7.2.1小节。

void MT8870_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); // 使能PC端口时钟
	
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5;	//选择对应的引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉       
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PC端口	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DTMF通信系统设计—基于MATLAB和STM32 的相关文章

  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • Matlab 的 fftn 在多线程下变得更慢?

    我可以访问 12 核机器和一些严重依赖 fftn 的 matlab 代码 我想加快我的代码速度 由于 fft 可以并行化 我认为更多的内核会有所帮助 但我看到的恰恰相反 这是一个例子 X peaks 1028 ncores feature
  • 如何在 MATLAB 中为 4 个子图创建一个通用图例?

    如何在 MATLAB 中为 4 个子图创建一个通用图例 如下所示 又快又脏 hSub subplot 3 1 1 plot 1 1 1 1 1 1 1 1 hLegend legend hello i am legend subplot 3
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m
  • 通过 h5py 将 matlab v7.3 文件读入 python numpy 数组列表

    我知道以前已经有人问过这个问题 但在我看来 仍然没有答案可以解释正在发生的事情 并且不适用于我的情况 我有一个 matlab v7 3 文件 其结构如下 gt rank lt 1x454 cell gt gt each element is
  • Matlab 中的多行匿名函数? [复制]

    这个问题在这里已经有答案了 是否可以在 Matlab 中创建多行匿名函数 没有合适的例子在文档中 http www mathworks com help matlab matlab prog anonymous functions html
  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • matlab mex 文件和 C++ dll (Windows)

    我有一个带有 Test 类的 DLL 标题 class MY EXPORT Test public int doit const string str 和来源 int Test doit const string str return in
  • MATLAB 中时间戳过滤器的优化 - 处理非常大的数据集

    我正在 MATLAB 中编写一个程序 必须使用 MATLAB 并且不能真正使用 MEX 来过滤大量数据 我需要实现的过滤器之一要求我将时间戳向量与其他时间戳不会出现的已知 不良 时间列表进行比较 一个典型的时间戳向量有大约 2 000 00
  • 检查Matlab中脚本需要使用的函数

    我有一个别人写的代码包 我正在运行一个脚本 它调用一些函数 这些函数又调用更多函数 等等 我想获取不是 MATLAB 内置函数但属于包的一部分的函数列表 我尝试使用matlab codetools requiredFilesAndProdu
  • Matlab中转换数据类型的有效方法(double vs. im2double)

    我想将真彩色图像转换为双精度 据我所知有两种方法可以做到这一点 double rgb img im2double rgb img 哪一种效率更高 谢谢 他们都是不同的 im2double将图像的范围转换为0 1如果数据类型是uint8 or
  • 在另一列中添加具有特定条件的一列,如 excel 的 sumif

    我有一个像这样的矩阵 A 1 2 2 3 3 4 4 5 5 6 6 8 7 9 8 5 9 4 现在我想添加第二列 条件是如果 limit 0 interval 3 且 limit limit interval 或者换句话说 当第 1 列
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 使用mat2cell将MxN的矩阵划分为1xN大小的M矩阵

    我有一个大小为 MxN 的矩阵 比方说 1867x3 1867 行和 3 列 我想将其分成 1867 个大小为 1x3 的单元格 我使用了mat2cell X 1 1866 这里X是矩阵 1867x3 结果给出了两个单元格 一个单元格的大小
  • MATLAB - 如何将子图一起缩放?

    我在一张图中有多个子图 每个图的 X 轴是相同的变量 时间 每个图上的 Y 轴都不同 无论是它所代表的内容还是数据的大小 我想要一种同时放大所有图的时间尺度的方法 理想情况下 可以在其中一张图上使用矩形缩放工具 并让其他图相应地更改其 X
  • Matlab没有优化以下内容吗?

    我有一个很长的向量 1xrv 和一个很长的向量w1xs 和一个矩阵Arxs 它是稀疏的 但维度非常大 我期望 Matlab 对以下内容进行优化 这样我就不会遇到内存问题 A v w 但看起来 Matlab 实际上是在尝试生成完整的v w矩阵
  • 两个向量之间的欧氏距离(单行矩阵)

    我有两个向量 单行矩阵 假设我们已经知道长度len A x1 x2 x3 x4 x5 B y1 y2 y3 y4 y5 计算它们之间的欧几里德距离最快的方法是什么 我的第一次尝试是 diff A B sum 0 for column 1 l
  • 如何在 Matlab 中将数组打印到 .txt 文件?

    我才刚刚开始学习Matlab 所以这个问题可能非常基本 我有一个变量 a 2 3 3 422 6 121 9 4 55 我希望将值输出到 txt 文件 如下所示 2 3 3 422 6 121 9 4 55 我怎样才能做到这一点 fid f

随机推荐

  • Python from import导包ModuleNotFoundError No module named,找不到模块问题

    在学习Flask框架的蓝图时 遇到导包时用到了 from 模块 import 对象 然后试了试直接 import会报错 直接告诉我找不到模块 发现问题以此记录 场景 有一个flask框架的项目 目录结构如下 有一个主包pro flask 然
  • Linux中find指令基本详解

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net caicai1617 article details 21512239 find指令的
  • 思普协同服务器不稳定,思普操作系统怎么样?

    思普操作系统怎么样呢 思普操作系统功能有哪些呢 思普操作系统有桌面版和服务器版两种 简单实用 具体思普操作系统怎么样 思普操作系统好用吗 我们一起来了解一下 思普操作系统怎么样 1 思普操作系统将办公 娱乐 通讯等开源软件一同封装到办公系统
  • git生成Key操作保存到GITHUB中

    https blog csdn net sinat 23880167 article details 78502528 1 在git中通过命令 ssh keygen Generating public private rsa key pai
  • Kali Linux 学习资源整理

    Kali Linux 官网 https www kali org Kali Linux官方教材 https kali training Penetration Testing Training with Kali Linux https w
  • cookies,session,token的区别和使用(接口参考)

    cookies session token的区别和使用 接口参考 1 依据和使用 基于cookie 因cookie的验证是有状态的 验证流程 用户输入登陆凭据 服务器验证凭据是否正确 并创建会话 然后把会话数据存储在数据库中 具有会话id的
  • Vue开发技巧总结

    1 路由参数解耦 通常在组件中使用路由参数 大多数人会做以下事情 export default methods getParamsId return this route params id 在组件中使用 route 会导致与其相应路由的高
  • 【管理学】作业与思考题

    绪论 管理学的研究对象是什么 在企业管理研究基础上抽象出的一般管理理论对其他组织的管理是否也具有指导意义 管理学的研究对象是人类的管理实践 从广义上来说 管理实践包括对个体活动的 管理和对群体活动的管理 任何个人即使在从事仅与自己相关的目标
  • [Github] GitKraken 简体中文翻译补丁

    GitKraken 简体中文翻译补丁 项目地址 项目原理 本项目通过将 rogeraabbccdd GitKraken zh tw 翻译包内的繁体中文文件转化为简体中文而成 采用了 Python3 9 作为转换工具并利用 Github Ac
  • 【高性能】Linux挂载GPT硬盘

    Linux挂载GPT硬盘 硬盘分区表存储了硬盘数据块的存储方式 根据分区表 可以将主流硬盘划分为MBR和GPT格式 其中MBR支持2T以下的硬盘 GPT则是新分区表标准 能支持2T以上的硬盘 64位Linux可以兼容MBR和GPT两类硬盘
  • 吉林大学计算机系高级语言程序设计(C语言)期末题目及解答(下)

    内容简介 因为正在准备考研复试 所以计划把吉大期末的C语言题目重新刷一遍 上机 做为笔记放在这里 有需要的朋友请自提 注 持续更新 因为文章过大所以分为了上下两篇 上篇也在我的博客列表里 本文所有代码均已测试通过 未通过的会在前面标注 未通
  • java 返回文件的二进制字符串给前端

    RequestMapping value fileToStream method RequestMethod GET ApiOperation 将文件转成流传给前端 public WebResponse fileToStream HttpS
  • java jar后台启动的三种方式

    java jar启动 linux中启动 java jar 后台运行程序 直接用java jar xxx jar 当退出或关闭shell时 程序就会停止掉 以下方法可让jar运行后一直在后台运行 java jar xxx jar 说明 在末尾
  • tensorflow基础操作

    目录 数据类型 数据载体 如何创建一个tensor 创建随机数 tensor的性质 检查维度 检查tensorflow是用cpu还是gpu 将tensor格式转换成numpy格式 检查tensor的数据类型 转换tensor 将格式转换成t
  • 性能测试调研:测试的目的是什么?

    昨天讲了 性能测试 你知道什么是99线吗 今天看看第二篇性能测试调研都有哪些内容 1 测试目的 2 系统架构及业务流程 3 测试范围及业务场景 4 性能测试指标 1 测试目的 测试背景 是新系统还是旧系统改造 评估测试重点 新系统预估可能的
  • Spring ApplicationContextAware 获取bean

    Spring 获取 bean spring最重要的功能是作为bean容器 方便的提供bean的初始化和存取服务 我们使用spring 也正是为了避免自己去创建或者管理对象 因此应该尽量从spring容器中去拿bean 而不是自己去new 如
  • OpenGL的Context(Profile)

    OpenGL在渲染的时候需要一个Context 这个Context记录了OpenGL渲染需要的所有信息 可以把它理解成一个大的结构体 它里面记录了当前绘制使用的颜色 是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态
  • 命令行卸载java_卸载java

    有小伙伴经常会遇到Java没有卸载干净的情况 造成重新安装JDK能正常安装 接着安装JRE的时候总是报1603错误 虽然说JRE安装报错了没安装上 但是eclipse IntelliJ IDEA和AndroidStudio都能正常打开和使用
  • 实时音频编解码之二编码学数学知识

    本文谢绝任何形式转载 谢谢 1 3 编码数学算法 1 3 1 定点和浮点 编码的一些参数是经过定标和量化的 然后再将其送入区间编码器进一步压缩数据量 为了降低执行编解码的内存和算力要求 Opus编码器中很多地方使用了Q定标方式将浮点数转化为
  • DTMF通信系统设计—基于MATLAB和STM32

    文章目录 1 摘要 2 设计任务 3 课程设计主要解决的问题 4 设计内容 4 1 整体设计方案 4 2 详细设计内容 5 结果与分析 5 1 基于MATLAB 的DTMF 通信系统 5 2 双机通信模拟 5 2 基于单片机的DTMF 通信