基于Matlab模拟5GNRCDL 模型下微波和毫米波频率的单链路信道容量估计
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室🍊个人信条:格物致知。更多Matlab仿真内容点击👇智能优化算法 神经网络预测 雷达通信 无线传感器信号处理 图像处理 路径规划 元胞自动机 无人机 电力系统⛄ 内容介绍This is a brief documentation on the MATLAB implementation of estimating the average channel capacity using the Mathworks 5G New Radio (NR) clustered delay line (CDL) channel model that is provided in the 5G Toolbox [1]. The nrCDLChannel System objectTM implements the CDL model as specified in the 3GPP TR 38.901, in which the CDL-A, CDL-B and CDL-C models are for non-line-of-sight (NLOS) links while the CDL-Dand CDL-E models are for LOS links [2]. In this example, the CDL-A model is implemented assuming NLOS links. The nrCDLChannel System objectTM can generate channel coefficients and filter the input signal⛄ 部分代码% Obtain the array response vectors at the BS and UE for all propagation angles.% RayAOD/AOA/ZOD/ZOA: MN x 1% ElePosBS/UE: 3 x Nt/Nr% 3 x MNUnitVectorBS = SphericalUnitVector(RayZOD,RayAOD); UnitVectorUE = SphericalUnitVector(RayZOA,RayAOA);% Steering vectors at BS and UEAt = exp(1i*2*pi*UnitVectorBS.'*ElePosBS/WaveLength); % MN x NtAt = At.'; % Nt x MNAr = exp(1i*2*pi*UnitVectorUE.'*ElePosUE/WaveLength); % MN x NrAr = Ar.'; % Nr x MN⛄ 运行结果⛄ 参考文献[1] Singh J , Shukla A . Spectrum Sensing in MIMO Cognitive Radio Networks Using Likelihood Ratio Tests with Unknown CSI. 2020.⛄ 完整代码❤️部分理论引用网络文献,若有侵权联系博主删除❤️ 关注我领取海量matlab电子书和数学建模资料
基于阿里云直播实现视频推流(ffmpeg)/拉流(Django2.0)以及在线视频直播播放(支持http/https)功能
由于5g网络的光速推广,视频业务又被推上了风口浪尖,在2019年初我们还在谈论照片,短视频等关键字,而进入2020年,我们津津乐道的就只有视频,视频,还是视频,普通人拿起手机做直播早已不是奢望。去年我曾经写了一篇文章:利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播,这篇攻略依托docker的便捷性,自主搭建了一个网络直播平台,只不过受限于个人服务器的带宽和配置,如果真的做起万人直播业务还是力不从心,所以本次我们尝试使用套路云,不好意思说错了,是阿里云(阿里云的套路是真的顶),我们利用阿里云来做一套网络直播平台,体验依托第三方的在线直播的魅力,值得吐槽的一点是,阿里云关于直播的文档过于松散,有些直播细节并没有完全讲清楚,本次所有操作都是亲测可用,请各位放心服用。在线直播的基本思路没有变化,还是本地打开设备直播 -> 数据实时推送到服务器 -> N个客户端拉取数据流到本地播放,只不过之前nginx-trmp的角色由阿里云进行了替代,因为阿里云基于其庞大的cdn网络性能更加牛逼。首先注册阿里云平台:https://www.aliyun.com/在产品线中选择视频直播服务然后选择添加域名,添加一个播流域名,注意这个域名是用来播放的,前提是需要通过工信部备案随后添加第二个域名,这个域名是用来推流的此时我们已经添加了两个域名,一个用来推流,一个用来拉流播放点击播流域名,进行配置,关联推流域名关联成功之后,一定不要忘了再次配置播流域名,对该域名进行跨域配置,如果不进行跨域配置,你的直播地址就无法在其他网站或者客户端上面播放,配置参数是access-control-allow-origin,取值是*,意为所有来源。随后点击地址生成器,来生成推流的网络地址以及播放地址这里需要填写appname和streamname,这里根据需要自己填就可以,需要注意的是,如果开多个直播,那么这两个变量不能重名,点击开始生成,系统会分配给你一个推流地址和三个播放地址。需要注意一点的是,阿里云为了安全起见,防止恶意推流或者恶意截获播放地址,默认开启了一个鉴权串,每次直播这个鉴权串会不同,这里我只是测试,所以将这个功能关闭了,如果正式生产环境进行直播还是建议带上这个参数,增加安全性到了这里,前期的准备工作基本就完成了,我们就来推个流,这里可以使用软件来推流,比如odbc,但是我们在这里推荐使用ffmpeg,因为ffmpeg更加灵活,同时更容易集成到web框架比如django中,关于ffmpeg的安装和使用请参加这篇文章:Python3利用ffmpeg针对视频进行一些操作这里我们用ffmpeg命令将我当前的桌面录屏推送到阿里云直播服务ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://bo.v3u.cn/v3u/live当然了,如果你愿意推送某个视频,也可以这样推ffmpeg -re -stream_loop -1 -i test.mp4 -vcodec copy -acodec copy -f flv -y rtmp://bo.v3u.cn/live/v3u此时再阿里云直播服务的流管理中,可以实时监控到推流信息推流成功后,之后的工作就是在线播放了,这里我们使用Django来进行在线播放,首先利用django的视图功能来渲染一个网页模板def my_ali(request):
return render(request,'index.html')在模板中,我们使用阿里出品的Aliplayer来进行播放<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="IE=edge" >
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Aliplayer在线配置</title>
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.8.1/skins/default/aliplayer-min.css" />
<script type="text/javascript" charset="utf-8" src="https://g.alicdn.com/de/prismplayer/2.8.1/aliplayer-min.js"></script>
</head>
<body>
<div class="prism-player" id="player-con"></div>
<script>
var player = new Aliplayer({
"id": "player-con",
"source": "http://ali.v3u.cn/v3u/live.m3u8",
"width": "100%",
"height": "500px",
"autoplay": true,
"isLive": false,
"rePlay": true,
"playsinline": true,
"preload": true,
"controlBarVisibility": "hover",
"useH5Prism": true
}, function (player) {
player._switchLevel = 0;
console.log("播放器创建了。");
}
);
</script>
</body>播放地址,也就是source属性,使用m3u8后缀直播效果是这样的不得不说,阿里云虽然套路,但是性能真的顶,无论是速度还是清晰度,或者说延迟方面,都要远远强于我之前自己搭建的nginx-rtmp服务器。值得一提的是,默认的播放地址还是http,如果你需要https的直播地址,比如有些客户端强制https拉流,像微信这样的,就需要在阿里云里为你的播放域名申请一个ssl证书,这里以ali.v3u.cn为例子选择产品线的ssl证书服务点击购买证书证书类型,毫无疑问选择免费版购买之后,选择证书申请·证书的绑定域名要选择你的播放域名成功后,点击下载,选择apache将下载后的证书解压后,用编辑器打开public.crt文件,将秘钥配置到播放流域名的配置中这之后我们就可以用https的地址来播放直播视频了结语:总体上阿里云直播还是很给力的,主要的坑就是一定要记得配置域名跨域,另外说明一下直播服务价格不菲,预算不足的朋友还是慎重考虑,最后就是阿里云同步还提供直播视频进行录播,录播的文件还能直接存放在阿里云自己的oss网盘中,这个真是套路的可以,也就是说除了直播,我们还可以依托阿里云oss来实现在线点播功能,不过这就是另外一个故事了,有机会和大家分享。
《看见新力量第四期》电子版地址
《看见新力量第四期》由阿里云创新中心出品的《看见新力量》栏目,在过去一年,不断地记录正在发生的创业故事,本期栏目我们采访了15位在数字经济、5G、物联网赛道涌现出的新生力量,这些企业从阿里云主办的创业大赛的上千家参赛企业中脱颖而出,用创业者的视角带我们走进他们的企业,了解技术与商业上的创新,讲述他们创业路上的酸甜苦辣,坚定地相信通过技术创新可以为社会带来更多的价值。
电子版下载地址:https://developer.aliyun.com/ebook/7678
电子书:
</div>
基于Matlab模拟毫米波通信的路径损耗模型
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。🍎个人主页:Matlab科研工作室🍊个人信条:格物致知。更多Matlab仿真内容点击👇智能优化算法 神经网络预测 雷达通信 无线传感器信号处理 图像处理 路径规划 元胞自动机 无人机 电力系统⛄ 内容介绍毫米波传感器可以克服云、雾、尘埃和夜间观察等条件的限制,并且具有分辨率和分辨精度高等一系列特点,因此毫米波技术的研究方兴未艾.MATLAB语言具有友好的用户操作界面和方便的绘图功能,在工程中得到了广泛的应用.介绍了毫米波的特点,并在MATLAB 6.5环境下对毫米波最大作用距离进行了研究与仿真.⛄ 部分代码%*************************************************************************% This is an example of using the "pathLossModel.m" function to provide the% large-scale channel characterization (Path Loss) for mmWave% transmissions.%% This example shows how to use the function pathLossModel() for two% different scenarios: % 1) Customizable (complex, semi-complex, simple) conference room in LOS% 2) Vehicular-to-Infrastructure (V2I) communications in NLOS% % The path loss model parameters are displayed in the command window, while % the generated graphs are plotted in separate pop-up windows.%% m-files required: pathLossModel.m% Subfunctions: none% Input data files required: use the provided ".mat" files or your own% files containing the path loss values to be analyzed.%% See also: pathLossModel.m, getCIR.m, exampleGetCIR.m%%*************************************************************************%------------- BEGIN CODE --------------clc%Indoor LOS scenario: Customizable Conference Room%Use any of the three "ConferenceRoom_xxx.mat" files to customize the%conference roomscenario='Complex Conference Room Scenario';load('ConferenceRoom_complex.mat')f=60e9;%Obtain PL model parameters (path loss exponent and shadowing factor) for%the given scenario[n,sigma,FSPL_d0]=pathLossModel(pl,f,1);disp(['Given the ' scenario char(10) ... 'PL Parameters: n=' num2str(n) ' sigma=' num2str(sigma) ]);%plot Path Loss model for the given scenariopathLossModel(pl,f,1);title(scenario);%Outdoor NLOS scenario: V2I with two types of horn antennas, and Tx-Rx%antenna beam alignment procedure%Use any of the four "V2I_NLOS_xxx.mat" files provided in this folder scenario='V2I NLOS scenario, 22deg/15dBi antenna and no Beam Aligning';load('V2I_NLOS_22deg15dBi_noBeamAligning.mat')f=28e9;%Obtain PL model parameters (path loss exponent and shadowing factor) for the given scenario[n,sigma,FSPL_d0]=pathLossModel(pl,f,1);disp(['Given the ' scenario char(10) ... 'PL Parameters: n=' num2str(n) ' sigma=' num2str(sigma) ]);%plot Path Loss model for the given scenariopathLossModel(pl,f,1);title(scenario);%------------- END OF CODE --------------⛄ 运行结果⛄ 参考文献[1]李磊, 吕久明. 基于MATLAB的毫米波作用距离仿真[J]. 舰船电子对抗, 2007.⛄ 完整代码❤️部分理论引用网络文献,若有侵权联系博主删除❤️ 关注我领取海量matlab电子书和数学建模资料
关于又拍云免费cdn全网加速服务的长期评测(各种踩坑)
之前一篇文章阐述了如何在前端进行网站优化:具体谈谈如何优化前端性能的总结,其中一条重要的优化手段是cdn加速,所谓cdn加速就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求在写那篇文章的时候,我本人还未实际使用过cdn加速,也就是说还停留在理论阶段,正所谓实践才是检验真理的唯一标准,本次我们就实际测试一下cdn加速,只不过这次我们使用又拍云的服务,又拍云每个月可以为用户免费提供15g的流量,比七牛云要多出5g,同时之前的一篇文章我们已经使用七牛云用来存储静态图片和视频:使用Tornado配合七牛云存储api来异步切分上传文件,所以这一次我们启用新的产品来尝鲜。首先第一步,注册又拍云账号:upyun.com然后点击使用cdn加速服务,并且在加速服务场景选择网页图片选择好以后,需要绑定你的网站的域名,绑定好以后,又拍云会提供一个cname地址拿到这个cname地址以后,将阿里云的dns解析根据cname地址重新绑定第二步,设置回源管理,这里需要注意绑定的回源地址一定得是你服务器的ip,如果你绑定域名的话,又拍云会报错,本人就是没有仔细阅读文档而导致访问域名总是报错,另外建议使用https协议,这样更加安全。第三步,设置参数跟随,这里比较坑的一点就是又拍云默认不跟随网址参数,也就是通过问号传参他根本就不识别,但是参数无法传递,所以一定要选择全程跟随参数第四步,开启一些性能优化,这里建议开启gzip和页面压缩,这样在网页传输中可以更快的传输数据最后一步,如果你遇到ddos攻击或者静态文件盗链,又或者你不希望某些人访问你的网站,你可以把对方的ip放入黑名单还有最后一步很重要,就是设置https的证书,否则你的云cdn服务无法访问https协议的网站将你的https证书用sublime打开,将里面的秘钥复制到又拍云的自有证书即可,另外也可以点选强制选项,这样所有的http协议都会301重定向到https协议,增加安全性。ok,总体上需要注意的设置就这些,经过一系列的操作,你的网站内容已经缓存到各个cdn子节点当中了,打开速度会更加的迅捷,这里我进行了一个长期的测试,对于一个日pv在500左右的个人网站来说每天需要花费的cdn流量大概在100m左右所以,对于这个量级的个人站长来说,完全不用担心免费流量不够用的问题,每月15g完全绰绰有余,所以在2020年,cdn加速服务已经不是企业级应用的专利了,个人站长也可以一亲芳泽,这就是时代的进步以及技术的发展所带来的便利。
【算法基础】顺序查找解析
作者:[柒号华仔]个人信条:星光不问赶路人,岁月不负有心人。个人方向:主要方向为5G,同时兼顾其他网络协议,编解码协议,C/C++,linux,云原生等,感兴趣的小伙伴可以关注我,一起交流。1. 顺序查找介绍1.1 定义查找是指在指定数据组合中找出满足条件的元素个体。顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。顺序查找是最基础也是最简单的查找算法,在需要进行查找时,这是我们的首选方法,只有数据较多,结构复杂,耗时较多需要优化时,我们才会考虑使用其他查找方法。1.2 基本原理对于任意一个序列以及一个给定的元素,从第一个序列元素开始,将给定元素与序列中元素依次比较,若某个元素与给定元素相同,则查找成功,否则,若将序列中的元素与给定元素全部比较完,依然无法匹配相同,则查找失败。比如,拿着一张照片从一个班上找出对应学生,那么长相就是判定值,我们需要一个个学生依次去比对,长相一致则找出了该学生,如果全班都看了一遍,还是没找到,则寻人失败。1.3 时间复杂度与空间复杂度顺序查找平均查找长度为 (n + 1) / 2,时间复杂度为 O(n) 。顺序查找是对数列顺序的比较,没有额外的空间,所以空间复杂度为常数 O(1)。1.4 优缺点优点:算法简单,对表中元素排列次序无要求,且对关键字的次序无要求,插入和删除元素都非常方便。缺点:时间复杂度较大,当数据规模较大时,效率较低。2. 代码实现2.1 代码设计a. 输入需要查找的元素key;b. 从数组首元素(i=0)开始查找,如果array[i] = key,则查找成功返回i;c. 否则i加1,继续查找,如果找到数组末尾,依然没找到,则查找失败,返回-1。2.2 代码实现#include<stdio.h>
#include<string.h>
int search(int array[],int n,int key)
{
int i;
for(i = 0; i<n; i++){
if(array[i] == key)
return i; //查找成功
}
return -1; //查找失败
}
int main(void)
{
int arr[7] = {62,8,35,22,90,58,6};
int key,ret;
printf("请输入需要查找的数字:");
scanf("%d",&key);
ret = search(arr,sizeof(arr)/4,key);
if(ret < 0)
printf("查找失败\n");
else
printf("该数字为数组第%d个元素\n",ret+1);
return 0;
}
运行结果:请输入需要查找的数字:58该数字为数组第6个元素
【算法基础】计数排序解析
作者:[柒号华仔]个人信条:星光不问赶路人,岁月不负有心人。个人方向:专注于5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关注我,一起交流。1. 计数排序介绍1.1 定义计数排序就是一种牺牲内存空间来换取低时间复杂度的排序算法,通过额外申请内存空间,根据统计符合条件的元素个数来确定排序位置。1.2 基本原理1.对于一个待排序数组,获取数组的最大值max和最小值min;2.创建一个长度为max-min+1的计数数组count array,统计每个数值在待排数组中出现的次数,将次数填写到数组count array中,对应下标=数值-min;3.创建一个输出数组out array,长度与待排序数组长度一致,根据每个元素出现的次数按顺序填写元素到out array,元素数值 = 计数数组下标+min。例如:对于数组array[20] = {2,3,8,7,1,2,2,2,7,3,9,8,2,1,4,2,4,6,9,2};进行排序首先,找出待排数组最大值max = 9,最小值min = 1;然后建立计数数组countArray[9],统计每个数值出现次数填入countArray建立输出数组outArray[20],根据元素出现次数按顺序填写:第一个元素数值为1,出现2次,因此outArray[0]=1,outArray[1]=1;第二个元素数值为2,出现7次,因此outArray[2]~outArray[8]均等于2;第三个元素数值为3,出现2次,因此outArray[9]=3,outArray[10]=3;第四个元素数值为4,出现2次,因此outArray[11]=4,outArray[11]=4;第五个元素数值为5,出现0次;第六个元素数值为6,出现2次,因此outArray[12]=6,outArray[13]=6;第七个元素数值为7,出现2次,因此outArray[14]=7,outArray[15]=7;第八个元素数值为8,出现2次,因此outArray[16]=8,outArray[17]=8;第九个元素数值为9,出现2次,因此outArray[18]=9,outArray[19]=9;1.3 时间复杂度和空间复杂度计数排序是非比较排序,时间复杂度是O(n+k),空间复杂度是O(k)。1.4 优缺点优点:在对一定范围内的整数排序时,它的复杂度为O(n+k),快于任何比较排序算法。缺点:如果最大值和最小值相差非常大,元素数值分布间隔比较大,所申请额外内存空间很大,会造成空间浪费。2. 代码实现#include <stdio.h>
#include <string.h>
void printArray(int array[], int size)
{
int i;
for (i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
int countSort(int array[],int arrayLen)
{
int max,min,countLen;
int i,j;
max = array[0];
min = array[0];
for(int i = 1; i < arrayLen; i++) {
if (array[i] > max) {
max = array[i];
}
if(array[i] < min) {
min = array[i];
}
}
countLen = max - min + 1;
int countArray[countLen];
memset(countArray,0,sizeof(countArray));
for(i = 0;i<countLen;i++){
for(j = 0;j<arrayLen;j++){
if(array[j] == i+min)
countArray[i]++;
}
}
j = 0;
for (i=0; i<countLen; i++)
{
while (countArray[i] > 0)
{
array[j] = i + min;
j++;
countArray[i]--;
}
}
}
int main(int argc, char **argv) {
int array[] = {2,3,8,7,1,2,2,2,7,3,9,8,2,1,4,2,4,6,9,2};
countSort(array,sizeof(array)/sizeof(int));
printArray(array, sizeof(array)/sizeof(int));
return 0;
}运行结果:1 1 2 2 2 2 2 2 2 3 3 4 4 6 7 7 8 8 9 9
【算法基础】快速排序解析
作者:[柒号华仔]个人信条:星光不问赶路人,岁月不负有心人。个人方向:专注于5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关注我,一起交流。1. 快速排序介绍1.1 定义快速排序是一种分治排序方法,通过多次比较和交换来实现排序,其基本操作是将无序表不断拆分和交换,直到拆分到最小时,整个表就成为了一个有序表,从而得到一个新的、记录数量增1的有序表。在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。1.2 基本原理快速排序的基本原理:从无序表中选择一个基准元素,将比它小的元素移动到左边,比它大的元素移动到右边,该元素便实现了分区操作;左右两个分区分别独立排序,在各自的分区中选择一个基准元素,分区中比基准小的元素移动左边,比基准大的元素移动到右边;不断重复上述分区和移动操作,最终实现整个数组变为有序表。简单的说,就是每一次都让基准左边的元素比它小,基准右边的元素比它大,这样无限拆分循环下去,数组自然就变为有序数组了。下面的动图诠释了快速排序的过程:1.3 时间复杂度最优的情况下,时间复杂度为O(nlogn);最坏的情况下,无序表完全正序或者倒序,每次划分只得到一个比上一次划分少一个记录的子序列,时间复杂度为O($n^2$)。1.4 空间复杂度空间的消耗主要是递归造成的栈空间使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。1.5 优缺点优点:算法简单,排序效率高,最好情况下的时间复杂度为O(nlogn) 缺点:非稳定排序2. 代码实现#include "stdio.h"
void printArray(int array[], int size)
{
int i;
for (i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
void quickSort(int array[],int left,int right)
{
if(left >= right)
return;
int pivot = array[left];
int i = left, j = right;
while(i < j){
while (i < j && array[j] >= pivot)
j--;
array[i] = array[j];
while (i < j && array[i] < pivot)
i++;
array[j] = array[i];
}
array[i] = pivot;
quickSort(array, left, i-1);
quickSort(array, i+1, right);
}
int main()
{
int array[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
quickSort(array,0,sizeof(array)/sizeof(int));
printArray(array, sizeof(array)/sizeof(int));
return 0;
}
运行结果:2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
了解了解 | 加密,编码,Hash,序列化等
对称加密使用秘钥和加密算法对数据进行转换,得到的无意义数据以为密文;使用秘钥和解密算法对密文进行逆向转换,得到的数据即为原数据。 首先通过加密算法进行加密,然后在进行发送,目标收到密文后就会通过解密算法进行解密对称加密对任何的二进制数据都可以进行加密。经典算法:DES,AES由于 DES 秘钥太短,导致被弃用了,如果秘钥太短就会导致容易破解,为什么呢?如果暴力进行破解,秘钥的长度太短,就会导致这个秘钥很快被试完,然后就会被破解。现在主流都是 AES 。这两个都是对称加密。非对称加密使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据。和对称加密不同的是:在非对称加密中解密的时候用的还是加密算法,但是秘钥却不同了例子:比如双方要进行通信,通信的内容只有10 个字符,分别是 0,1,2,3,4,5,6,7,8,9。加密秘钥:对每个字符+4,解密秘钥:对每个字符 +6发送消息:110加密:554解密:5+6 = 11,拿到溢出的就是1,中间的也一样,最后面的就是 4+6 = 10,拿到后面溢出的就是 0,最后的结果就是 110。当然这个是禁不起推敲的,但是他可以解释非对称加密的核心原理,其中最主要的就是溢出。如果不允许溢出,那么非对称加密就没办法玩了。问题:如果 A 和 B 通过非对称加密来进行通信时没有任何问题的,但是问题在于怎么把秘钥发送给对方呢?如果 A 和 B 进行通信, A 有自己的加密密钥和解密密钥,同样的 B 也有。那怎么解决密钥传输的问题呢? 答案就是将 加密密钥直接公布出去理解一下:在通信的时候,A 把自己的加密密钥给 B,B 把自己的密钥给 A。A 给 B 发送一个消息,然后通过 加密密钥B 进行加密,然后发送给 B。B 接收到密文后就可以使用本地的解密密钥 B 进行解密。但是:如果在发送的过程中被 C 截获了加密密钥和密文,那么他能解密吗? 显然是不能的,因为加密和解密的密钥不是同一个,所以就算被截获也无法解密在上面的问题中:加密密钥对应着:公钥解密密钥对应着:私钥其中公钥是可以任意公布的,但是私钥不能对任何人公布且不能进行传输。延时用途公钥能不能解私钥?可以,首先通过 私钥进行加密,得到密文,接着使用公钥再次进行加密就可以得到原数据。这种方式叫做签名验证。为什么呢?既然先通过 公钥加密后在通过私钥加密就可以得到原数据。那同样的道理,通过私钥加密后在通过公钥加密就可以拿到原数据。签名与验证由于私钥和公钥互相可解,因此非对称加密还可以用作数字签名技术签名:使用私钥对原数据进行加密算法(称为签名)得到签名数据验证:使用公钥对原数据进行加密算法(称为验证)得到原数据例如:我对某个文件进行签名后,得到签名数据。别人拿着一个看不懂的文件是可以通过公钥验证成功的就说明这个文件是由我亲自进行签名的。因为私钥只有我知道,没有人可以随意的造出一个可以刚好被公钥验证后是原数据的数据。同时使用 加密和签名还是上面的那个图A 发送消息 到 B ,在这个过程中可以被 C 给拦截到,C 无法解密出原数据,但是 C 可以使用公钥重新加密一段数据发送给 B。例如 C发送:给我借 3万元。然后 B 收到后就使用私钥进行解密,发现是借钱,然后就会把钱打过去。这就会导致 B 的钱被骗走。怎么解决呢:使用 加密+签名A 发送消息的时候使用对方的公钥进行加密,然后使用自己的私钥对消息进行签名B 收到消息后,使用自己的私钥解密拿到原数据,还需要使用对方的公钥进行验证即可这样一来,即时 C 拿到数据,他可以通过公钥进行加密,但是他没办法通过私钥进行签名,所以这个问题就得到了解决。经典算法:RSA , DSARSA:可以用来加密解密,和签名DSA:专门被设计用来签名的。他的优势就是速度比较快。优点:可以在不安全的网络上传输缺点:计算复杂,因此性能上比对称加密差的很多密钥和登陆密码密钥(Key)密钥就是一个刚好契合密文的东西,通过这个密钥刚好就可以对密文进行解密场景:用于加密和解密目的:保证数据被盗是不会被人读懂内容登陆密码(password)相当于就是一个通行口令,是一个身份验证。场景:用于进入网站或登陆时的身份验证目的:数据提供方对用户的数据进行保护,保证 “你是你” 的时候才提供权限Base64 将二进制数据转换成由64个字符组成的字符串,分别是 大小写26个字母,一共是52,然后是0 到 9,接着是 + / ,一共是64字符什么是二进制数据非文本数据就是二进制数据,例如图片,音乐,电影等都是二进制数据。用途让原数据具有字符串所具有的特性,如可以放在 URL 中传输,可以保持到文本文件,可以通过普通的聊天软件进行文本传输把原本人眼可读的字符串变成不可读的字符串,降低偷窥风险Base64 加密传输图片,可以更安全和高效,真的吗?Base64 没有任何的安全可言,可通过码表逆向的得到元数据Base64 的高效是假的。通过 Base64进行转换后的字符串会比原来的数据大,所以不会高效,相反他是低效的。变种:Base58他把 Base64 中的字符给去掉了4个 ,0,O,I,l,+,/ ,这6个去掉了,因为这个容易混淆,+ / 去掉是因为双击复制。变种:URL encoding将 URL 中的保留字符使用 % 进行编码,并且将 + 和 / 换成了另外两个字符例如:https://blog.csdn.net/哈哈哈上面这个网址,放在浏览器中回车,然后将复制出来粘贴到下面如下:https://blog.csdn.net/%E5%93%88%E5%93%88%E5%93%88因为浏览器不支持显示汉子,即时你看起来是汉子,实际上他都已经转换过了,如果在流量器中输入 中 国,注意中间有个空格,在浏览器中,会直接使用 + 代替,而且 / 也有独特的作用,这正是 在为什么需要将 + / 换成别的字符的原因。目的:消除歧义,避免解析错误压缩与解压缩压缩:把数据换一种方式来存储,以减小存储空间解压缩:把压缩后的数据还原为原来的形式,以便使用常见的压缩算法:DEFLATE,JPEG,MP3DEFLATE:将一大堆东西归档,在归档的同时还可以进行压缩JPEG:对图片进行压缩MP3:对声音进行压缩压缩属于编码吗?编码到底是什么意思?编码没有任何官方定义。例如:将 A 转为 B,并且还可以转回来,在这个转换的过程中没人任何信息的损失,且不会增加任何信息。这个就是编码压缩和解压缩是完全符合这个特点的。所以压缩也是属于编码的一种形式。媒体数据的编解码什么是图片,音频,视频的编解码图片的编码:把图像数据协程 JPG,PNG等文件的编码格式其实就是把数据转为对应的格式,例如一个白点用 ffffff 表示,一个图片的宽高是 64*64,那么就会有 64 * 64 个 ffffff,要对这个 64*64 的图片进行编码可以指定的格式如:YS: ffffff=64*64;通过上面这个格式可以很清楚的看到,并且进行解码。当然上面只是一个简单的例子,好的算法可不是这么干的,但是意思到了就行了图片的解码:把 JPG,PNG 等文件中的数据解析为标准的图像数据。音频,视频的编解码:和上面的都差不多,有有损压缩和无损压缩等,无非就是音质不太好,当然图片也是可以的,例如微信表情现在 1mb,你就需要对图片进行压缩了,使用好的算法压缩后的图片会变小,但是看起来还是和原图差不多。序列化把对象(一般是在内存中的)转换成字节序列的过程java 序列化机制目的:让内存中的东西可以被存储和传输序列化是编码吗?严格来说不是编码,编码是将 A 格式 转为 B 格式,并且可以任意相互转换,但是序列化是将内存中的对象序列化为字节的过程。其实都差不多,就看你怎么理解了。Hash 把任意数据转换成指定大小(通常很小)的范围的数据,他在主要作用是 摘要,数字指纹。比如说有 200 个人,通过 hash 对这 200 个人进行编号,如 001,002等,每个编号对应着一个人,这个编号就被称作为 hash值。经典算法:MD5,SHA1,SHA256 等。hash 是有算法的,他会根据算法算出对应的 hash 值。在算出 hash 值得同时也要保证碰撞率非常低,碰撞率指的就是 hash 值不相同。还有就是不容易被破解。学过 java 的应该都知道 hashcode,可以重新 hashcode 方法进行自定义的 hash 值计算,如:public int hashCode(String sources){
return sources.length()
}
//传入 哈好很 得到的 hash值:3
//传入 哈哈 得到的 hash 值:2通过上面这个简单的算法就可以得到对应的 hash 值。如果保证 hash 值得碰撞率非常低,这就需要一些比较高深的算法了。实际用途数据完整性验证例如:从网上下载一个文件,这个文件的作者提供了一个 5g 的文件和一个 hash 值。然后你从网上下载,下载完成后在计算这个文件的 hash 值,如果和作者提供的一样,就说明文件没有损坏,否则的话就说明文件可能被篡改或者是损坏了。快速查找:hashCode 和 HashMapHashMap 原理hashCode与equals的作用与区别学过 java 的肯定都知道,重写 hashCode 后必须要重写 equals。这是为啥呢?HashMap的数据结构是数组+链表的形式,通过hashCode获取对应的下标,然后在判断是否需要保存数据。 在保存数据的时候是通过 key 来保存的,这个键必须是惟一的。在保存的时候,传入 key ,然后看源码就可以发现,他会计算 key 的 hash 值,然后就会判断这个 hash 是否是惟一的,也就是 hash 是否碰撞,如果没有,则就会以这个 hash 值为key ,将值保存起来,如果 hash 不是惟一的,就说明发生了 hash 碰撞。接着就会通过 equals 判断 key 的内容是否相等,如果不相等就保存进去,否则就不保存。隐私保护明文:有些网站保存用户信息的时候使用的是明文,就是 账号密码直接保存,在数据库中是可见的,如果数据库发送泄漏,那么别人就可以直接拿到你的账号密码。这种明文存储的坏处。不明文:什么是不明文呢?就是对密码进行 hash。登陆的时候只需要将密码进行 hash 比较相同后说明真确,否则则不行。如果数据库泄露,他拿到的也是一些 hash 值,并没有用处,所以说是安全的。加盐因为 hash ,md5 不可逆,拿到 hash 之后,无法逆向的算出原密码。但是那些非常闲的人就会将常用的密码进行hash,然后在比较 hash 值是否相等。正应为上面的这个原因,所以每个网站都有自己的盐,在保存密码的时候对 密码和盐进行 hash 值的计算,然后将对应的结果保存。这样一来就算拿到 hash 值,也不可能比较出原密码了。因为 hash 值是进过加盐的。所以每个网站的盐必须要严格的保护,不能泄露。Hash 是编码吗不是,Hash 是不可逆的。他只是抽取对象的特征然后生成的一个 hash值。Hash 是加密码? MD5 是加密?其实都不是,加密指的是可逆的,加密后的数据进过计算后可以还原。但是 hash 和 MD5 都不不符合这个条件,你可以称他们为 “不可逆的转换”Hash 和 非对称加密在 非对称加密中进行签名的时候,需要使用私钥对原数据进行签名,然后得到签名文件。但是如果这个文件非常大,那么这个签名文件也会非常大,就会造成非常大的浪费。因此将 hash 算法放在了签名中,流程如下:使用 hash 算法对原数据进行特征的提取拿到 hash 值。然后通过私钥对 hash 值进行加密(用私钥加密叫做签名),得到签名后的值。验证的时候:使用公钥进行验证,然后拿到 hash 值,然后在计算一下原数据的 hash 值,如果相同就说明成功,否则文件就被篡改了。使用这种方式,在发送消息的时候不管原数据多大,签名数据都会非常小。字符集一个由整数向现实世界中的文字符号的 Map分支ASCLL:128个字符,1字节ISO-8859:对 ASCLL 进行扩充,1 字节Unicode:13 万个字符,多字节UTF-8:Unicode 编码分支UTF-16:Unicode 编码分支GBK/GB2312/GB18030原数据的 hash 值,如果相同就说明成功,否则文件就被篡改了。使用这种方式,在发送消息的时候不管原数据多大,签名数据都会非常小。
基于CNN卷积神经网络实现手势识别
前言大家好,我是阿光。本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。正在更新中~ ✨🚨 我的项目环境:平台:Windows10语言环境:python3.7编译器:PyCharmPyTorch版本:1.8.1💥 项目专栏:【PyTorch深度学习项目实战100例】一、基于CNN卷积神经网络实现手势识别基于5G时代生活场景下的手势识别在视频直播,智能家居,智能驾驶等诸多方领域使用,用户可以使用简单的手势来控制或与设备交互,让计算机理解人类的行为。其核心技术为手势分割、手势分析以及手势识别。但是本任务只作为入门阶段,所以并没有使用较为复杂技术以及动态分割,只是针对静态的手势图像采用卷积神经网络进行分类。二、数据集介绍这个数据集包含14个不同的人所做的手势,每个人都做10个不同的手势,每个手势重复10次,总共有1400个手势。Kinect和Leap动作的数据已经被获取,设置如图所示。还提供了Kinect的校准