通信原理与MATLAB(十二):MSK的调制解调

news2025/5/22 10:11:44

目录

  • 1.MSK的调制原理
  • 2.MSK的解调原理
  • 3.MSK代码
  • 4.结果图
  • 5.特点

1.MSK的调制原理

MSK调制原理如下图所示,基带码元先差分编码,然后经过串并转换分成I、Q两路,再与对应的载波相乘,然后再相加完成QAM的调制。
其中注意:I、Q两路码元分别是差分编码后的相对码的奇数和偶数位置上的码元,I路对应于奇数,Q路对应于偶数。而pk是I路码元,但是其码元宽度Tb是相对码的码元宽度Ts的两倍,并且延时一个Ts;而qk是Q路码元,其码元宽度Tb也是相对码码元宽度Ts的两倍。
例如,绝对码元是10001,如果参考电平是1,那么相对码元是100001,然后经过单极性码变为双极性码,1转换成1,0转换成-1,则I路码元是1 -1 -1,Q路码元是-1 -1 1。pk也是1 -1 -1,但是pk的码元宽度Tb是相对码的码元宽度Ts的两倍,并且延时Ts。而qk是-1 -1 1,但是qk的码元宽度Tb是相对码的码元宽度Ts的两倍。
在这里插入图片描述
在这里插入图片描述

2.MSK的解调原理

MSK的解调原理如下图所示,MSK信号再分为I、Q两路和对应的载波相乘,然后经过低通滤波器后进行抽样判决,判决之后的I、Q路码元进行合并,I路为最终码元序列的奇数位置码元,Q路为最终码元序列的偶数位置码元,然后进行解差分编码,恢复出原始的码元序列。
在这里插入图片描述

3.MSK代码

clear all;                  % 清除所有变量
close all;                  % 关闭所有窗口
clc;                        % 清屏
%% 基本参数
M=11;                       % 产生码元数    
L=100;                      % 每码元复制L次,每个码元采样次数
Ts=0.001;                   % 每个码元的宽度,即码元的持续时间
Rb=1/Ts;                    % 码元速率1K
dt=Ts/L;                    % 采样间隔
TotalT=M*Ts;                % 绝对码总时间
t=0:dt:TotalT-dt;           % 时间1
TotalT2=(M+1)*Ts;           % 相对码总时间
t2=0:dt:TotalT2-dt;         % 时间2
Fs=1/dt;                    % 采样间隔的倒数即采样频率

%% 产生单极性波形
wave=randi([0,1],1,M);      % 产生二进制随机码,M为码元个数

%% 绝对码变相对码
wave2=ones(1,M+1);          % 产生1*(M+1)的全1行向量
%% 相对码第一个参考值为1,相对码b(n+1)=绝对码a(n)和相对码b(n)做异或
for  k = 2:M+1
    wave2(k) = xor(wave(k-1),wave2(k-1));%生成相对码
end
fz=ones(1,L);               % 定义复制的次数L,L为每码元的采样点数
x1=wave(fz,:);              % 将原来wave的第一行复制L次,称为L*M的矩阵
juedui=reshape(x1,1,L*M);   % 将刚得到的L*M矩阵,按列重新排列形成1*(L*M)的矩阵
x2=wave2(fz,:);             % 将原来wave2的第一行复制L次,称为L*(M+1)的矩阵
jidai=reshape(x2,1,L*(M+1));% 将刚得到的L*(M+1)矩阵,按列重新排列形成1*(L*(M+1))的矩阵

%% 单极性变为双极性
% 基带信号变为双极性即jidai为1的时候,jidai为1;jidai为0的时候,jidai为-1
for n=1:length(jidai)
    if jidai(n)==1
        jidai(n)=1;
    else
        jidai(n)=-1;
    end
end

%% 产生I、Q两路码元
I_lu=wave2(1:2:end);        % 相对码的奇数位置为I路码元
Q_lu=wave2(2:2:end);        % 相对码的偶数位置为Q路码元

%% I、Q两路单极性码元变为双极性码元
I_lu=2*I_lu-1;
Q_lu=2*Q_lu-1;

%%I、Q两路码元的单个码元的持续时间是原始码元中单个码元的两倍,Tb=2Ts,并且I路码元延时Ts
fz2=ones(1,2*L);            % 定义复制的次数2L
x3=I_lu(fz2,:);             % 将原来I_lu的第一行复制2L次,称为2L*((M+1)/2)的矩阵
I=reshape(x3,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵
x4=Q_lu(fz2,:);             % 将原来Q_lu的第一行复制2L次,称为2L*((M+1)/2)的矩阵
Q=reshape(x4,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵
I_yanshi=zeros(1,length(I));% 产生1*length(I)的零向量
% I路延时Ts,即I路1至L置零,原来1(2*L)*((M+1)/2)-L的数移动到L+1至最后
I_yanshi(L+1:end)=I(1:(2*L)*((M+1)/2)-L);

%% 绘制码元波形
figure(1);                  % 绘制第1幅图
subplot(411);               % 窗口分割成4*1的,当前是第1个子图 
plot(t,juedui,'LineWidth',2);% 绘制绝对码元波形,线宽为2
title('绝对码信号波形');    % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT,-1.1,1.1])   % 坐标范围限制

subplot(412);               % 窗口分割成4*1的,当前是第2个子图 
plot(t2,jidai,'LineWidth',2);% 绘制相对码元波形,线宽为2
title('相对码信号波形');    % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT2,-1.1,1.1])  % 坐标范围限制

subplot(413);               % 窗口分割成4*1的,当前是第3个子图 
plot(t2,I,'LineWidth',2);   % 绘制I路码元波形,线宽为2
title('I路信号波形');       % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT2,-1.1,1.1])  % 坐标范围限制

subplot(414);               % 窗口分割成4*1的,当前是第4个子图 
plot(t2,Q,'LineWidth',2);   % 绘制Q路码元波形,线宽为2
title('Q路信号波形');       % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT2,-1.1,1.1])  % 坐标范围限制
%% MSK调制
fc1=4000;                   % 载波1频率4kHz   
fc2=1/(4*Ts);               % 载波2频率1/(4*Ts)  
zb1=cos(2*pi*fc1*t2);       % 同相载波1
zb2=-sin(2*pi*fc1*t2);      % 正交载波1
zb3=cos(2*pi*fc2*t2);       % 同相载波2
zb4=sin(2*pi*fc2*t2);       % 正交载波2
I_wave=I_yanshi.*zb1;             
I_wave=I_wave.*zb3;         % I路波形
Q_wave=Q.*zb2;       
Q_wave=Q_wave.*zb4;         % Q路波形
msk=I_wave+Q_wave;          % MSK的调制 
figure(2);                  % 绘制第2幅图
subplot(411)                % 窗口分割成4*1的,当前是第1个子图 
plot(t2,I_wave,'LineWidth',2);% 绘制I路信号的波形 
title('I路信号波形')        % 标题
axis([0,TotalT2,-1.1,1.1]); % 坐标范围限制
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(412)                % 窗口分割成4*1的,当前是第2个子图 
plot(t2,Q_wave,'LineWidth',2);% 绘制Q路信号的波形 
title('Q路信号波形')        % 标题
axis([0,TotalT2,-1.1,1.1]); % 坐标范围限制
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(413)                % 窗口分割成4*1的,当前是第3个子图 
plot(t2,msk,'LineWidth',2); % 绘制MSK的波形 
title('MSK信号波形')        % 标题
axis([0,TotalT2,-1.1,1.1]); % 坐标范围限制
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 信号经过高斯白噪声信道
tz=awgn(msk,20);            % 信号msk中加入白噪声,信噪比为SNR=20dB
subplot(414);               % 窗口分割成4*1的,当前是第4个子图 
plot(t2,tz,'LineWidth',2);  % 绘制MSK信号加入白噪声的波形
axis([0,TotalT2,-1.5,1.5]); % 坐标范围设置
title('通过高斯白噪声信道后的信号');% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 解调部分
jt1=tz.*zb1.*zb3;           % 相干解调,I路乘以相干载波
jt2=tz.*zb2.*zb4;           % 相干解调,Q路乘以相干载波
figure(3);                  % 绘制第3幅图
subplot(511)                % 窗口分割成5*1的,当前是第1个子图 
plot(t2,jt1,'LineWidth',2)  % 绘制I路乘以相干载波后的信号
axis([0,TotalT2,-1.5,1.5]); % 设置坐标范围
title("I路乘以相干载波后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(512)                % 窗口分割成5*1的,当前是第2个子图 
plot(t2,jt2,'LineWidth',2)  % 绘制Q路乘以相干载波后的信号
axis([0,TotalT2,-1.5,1.5]); % 设置坐标范围
title("Q路乘以相干载波后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 加噪信号经过滤波器
% 低通滤波器设计
fp=2*Rb;                    % 低通滤波器截止频率,乘以2是因为下面要将模拟频率转换成数字频率wp=Rb/(Fs/2)
b=fir1(30, fp/Fs, boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数
% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
% 这里是生成了30(31个抽头系数)的矩形窗滤波器
[h,w]=freqz(b, 1,512);      % 生成fir滤波器的频率响应
% freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
lvbo1=fftfilt(b,jt1);       % 对信号进行滤波,jt是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数
lvbo2=fftfilt(b,jt2);       % 对信号进行滤波,jt是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数

subplot(513);               % 窗口分割成5*1的,当前是第5个子图 
plot(w/pi*Fs/2,20*log(abs(h)),'LineWidth',2); % 绘制滤波器的幅频响应
title('低通滤波器的频谱');  % 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度/dB');          % y轴标签

subplot(514)                % 窗口分割成5*1的,当前是第4个子图 
plot(t2,lvbo1,'LineWidth',2);% 绘制I路经过低通滤波器后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范围
title("I路经过低通滤波器后的信号");% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(515)                % 窗口分割成5*1的,当前是第5个子图 
plot(t2,lvbo2,'LineWidth',2);% 绘制Q路经过低通滤波器后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范围
title("Q路经过低通滤波器后的信号");% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

%% 抽样判决
% 滤波后的信号大于0,判决为1,小于0,判决为-1
for i=1:length(lvbo1)
    if lvbo1(i)>0
        pdst1(i)=1;
    else
        pdst1(i)=-1;
    end
end

for i=1:length(lvbo2)
    if lvbo2(i)>0
        pdst2(i)=1;
    else
        pdst2(i)=-1;
    end
end

% 取码元的中间位置上的值进行判决,由于I路延时了Ts,因此第一个抽样值为2L,间隔为2L
% Q路第一个抽样值为L,间隔为2L
I_panjue=[];
Q_panjue=[];
for j=(2*L):(2*L):((2*L)*((M+1)/2))
    if pdst1(j)>0
        I_panjue=[I_panjue,1];
    else
        I_panjue=[I_panjue,-1];
    end
end

for j=L:(2*L):((2*L)*((M+1)/2))
    if pdst2(j)>0
        Q_panjue=[Q_panjue,1];
    else
        Q_panjue=[Q_panjue,-1];
    end
end

x5=I_panjue(fz2,:);         % 将原来I_panjue的第一行复制2L次,称为2L*((M+1)/2)的矩阵
I_zong=reshape(x5,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵
x6=Q_panjue(fz2,:);         % 将原来Q_panjue的第一行复制2L次,称为2L*((M+1)/2)的矩阵
Q_zong=reshape(x6,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵

figure(4)                   % 绘制第4幅图
subplot(411)                % 窗口分割成4*1的,当前是第1个子图 
plot(t2,I_zong,'LineWidth',2)% 画出经过抽样判决后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范用
title("I路经过抽样判决后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(412)                % 窗口分割成4*1的,当前是第2个子图 
plot(t2,Q_zong,'LineWidth',2)% 画出经过抽样判决后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范用
title("Q路经过抽样判决后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

% 将I路码元为最终输出的奇数位置码元,将Q路码元为最终输出的偶数位置码元
code=[];

for n=1:(M+1)
    if mod(n, 2)~=0
        code = [code, I_panjue((n+1)/2)];
    else
        code = [code, Q_panjue(n/2)];
    end
end
x7=code(fz,:);              % 将原来code的第一行复制L次,称为L*(M+1)的矩阵
dout=reshape(x7,1,L*(M+1)); % 将刚得到的L*(M+1)矩阵,按列重新排列形成1*(L*(M+1))的矩阵

subplot(413)                % 窗口分割成4*1的,当前是第3个子图 
plot(t2,dout,'LineWidth',2) % 画出经过抽样判决后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范用
title("恢复的相对码波形")   % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

%% 相对码变绝对码
yuanma=ones(1,M);
for i=1:(M+1)
   if code(i)==1
       code(i)=1;
   else 
       code(i)=0;
   end
end

for k=1:M
   yuanma(k)=xor(code(k),code(k+1)); 
end

x8=yuanma(fz,:);            % 将原来yuanma的第一行复制L次,称为L*M的矩阵
yuanma_wave=reshape(x8,1,L*M);% 将刚得到的L*M+矩阵,按列重新排列形成1*(L*M)的矩阵

subplot(414)                % 窗口分割成4*1的,当前是第3个子图 
plot(t,yuanma_wave,'LineWidth',2) % 画出经过抽样判决后的信号
axis([0,TotalT,-1.1,1.1]);  % 设置坐标范用
title("恢复的绝对码波形")   % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 绘制频谱
%% 信源频谱
T=t2(end);                  % 时间
df=1/T;                     % 频谱分辨率
N=length(jidai);            % 采样长度
f=(-N/2:N/2-1)*df;          % 频率范围
mf=fftshift(abs(fft(jidai)));%对信源信号采用快速傅里叶变换并移到矩阵中心
figure(5)                   % 绘制第5幅图
subplot(211);               % 窗口分割成2*1的,当前是第1个子图 
plot(f,mf,'LineWidth',2);   % 绘制信源频谱波形
title("基带信号频谱");      % 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

%% MSK信号频谱
sf=fftshift(abs(fft(msk)));% 对MSK信号采用快速傅里叶变换并将0-fs频谱移动到-fs/2-fs/2
subplot(212)                % 窗口分割成2*1的,当前是第2个子图 
plot(f,sf,'LineWidth',2)    % 绘制MSK调制信号频谱
title("MSK信号频谱")        % 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签
 
%% 乘以相干载波后的频谱
mmf=fftshift(abs(fft(jt1)));% 对I路相干载波信号采用快速傅里叶变换并移到矩阵中心
mmf2=fftshift(abs(fft(jt2)));% 对Q路相干载波信号采用快速傅里叶变换并移到矩阵中心
figure(6)                   % 绘制第6幅图
subplot(211);               % 窗口分割成2*1的,当前是第1个子图 
plot(f,mmf,'LineWidth',2)   % 画出I路乘以相干载波后的频谱
title("I路乘以相干载波后的频谱")% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

subplot(212);               % 窗口分割成2*1的,当前是第2个子图 
plot(f,mmf2,'LineWidth',2)  % 画出Q路乘以相干载波后的频谱
title("Q路乘以相干载波后的频谱")% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

%% 经过低通滤波后的频谱
dmf=fftshift(abs(fft(lvbo1)));%对I路低通滤波信号采用快速傅里叶变换并移到矩阵中心
dmf2=fftshift(abs(fft(lvbo2)));%对Q路低通滤波信号采用快速傅里叶变换并移到矩阵中心
figure(7);                  % 绘制第7幅图
subplot(211);               % 窗口分割成2*1的,当前是第1个子图 
plot(f,dmf,'LineWidth',2)   % 画出I路经过低通滤波后的频谱
title("I路经过低通滤波后的频谱");% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

subplot(212);               % 窗口分割成2*1的,当前是第2个子图 
plot(f,dmf2,'LineWidth',2)  % 画出Q路经过低通滤波后的频谱
title("Q路经过低通滤波后的频谱");% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

4.结果图

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

5.特点

最小移频键控(MSK)信号是一种包络恒定、相位连续、带宽最小,并
且严格正交的2FSK信号,抗干扰能力强。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】LSTM预测股票价格

入行深度学习1年多了,该还的还得还,没接触过LSTM的预测项目,这就来活了。 文章目录前言1. 开工1.1 引入必须的库1.2 数据初探1.3 划分数据集1.4 数据归一化1.5 数据分组1.6 搭建模型1.7 训练1.8 测试集总结前言 LSTM是一个处理时序关联的数据…

数据结构-第七期——并查集的应用(Python)

在学习并查集的应用之前,请大家先学习第六期-并查集的入门 ,这样会比较好理解 真题训练1 合根植物2017年第八届决赛,lanqiao0J题号110 【题目描述】 w 星球的一个种植园,被分成 mn 个小格子(东西方向 m 行,南北方向…

dubbo-admin安装

一、dubbo-admin安装 1、环境准备 dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,nodejs 安装n…

基于Python的geopandas库处理矢量几何的教程

前言在许多工作中中,我使用 ArcGIS 平台从事过许多与地理空间相关的项目,我非常喜欢这个平台。 这意味着我可以在具有尖端地理空间技术的项目中进行咨询,例如多维栅格、深度学习和空间物联网自动化。 考虑到这一点,我总是试图跟踪…

openstack增加一个计算节点

1.前言 由于资源有限,所以直接在存储节点(block)部署 由于存储节点最初只设计了一块网卡,所以需要增加一块网卡,名称为eth1,IP:192.168.200.30编辑ifcfg-eth1,然后重启网络systemct…

【优化】windows双网叠加 多网叠加 网速叠加 教程

【优化】windows双网叠加 多网叠加 网速叠加 教程 1 连接两个以上的网络, 网络不能是同一个 例如 网线-A wifi-B 2 控制面板\所有控制面板项\网络连接 最后 确定保存 同理 修改wifi-B的接口活跃点数为 25 并保存 如果没有生效 可以将两个网络连接禁用 再启用 通过命…

4656. 技能升级

4656. 技能升级 https://www.acwing.com/problem/content/4659/ 第十三届蓝桥杯省赛CC组 算法标签:贪心;多路归并;二分 思路 如果暴力来做的话,会将所有数放到一个集合里面排序,取前 mmm 项之和即可,但时…

Vue3——第六章(侦听器:watch、watchEffect)

一、watch 基本使用 在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数: 二、侦听数据源类型 watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 get…

5.2、运输层端口号、复用与分用的概念

1、端口号 运行在计算机上的进程使用进程标识符PID\color{red}进程标识符 PID进程标识符PID来标志。 因特网上的计算机并不是使用统一的操作系统 不同的操作系统(windows,Linux,Mac OS)又使用不同格式的进程标识符\color{red}不同格式的进程标识符不同…

ThreadLocal 实战应用

1 什么是 ThreadLocal?ThreadLocal 是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用 ThreadLocal 创建的变量只能被当前线程访问,其他线程则无法访问和修改。ThreadLocal 在设计之初就是…

CDN简单介绍

CDN 介绍 CDN (全称 Content Delivery Network),即内容分发网络,服务器的静态资源存在CDN服务器上,用户在最近的CDN服务器上获取资源。 从功能上看,典型的 CDN 系统由分发服务系统、负载均衡系统和运营管理系统组成。分发服务系…

我利用 ChatGPT 提高工作效率的 5 种方式

技术应该是我们的朋友,而不是我们的敌人ChatGPT 在 11 月的发布改变了世界。学校阻止该计划,程序员对他们工作中新发现的效率赞不绝口,而创意人员则怀疑他们的工作是否受到威胁。每个人都在想同一个问题:ChatGPT 的未来会是什么样…

IPS+ESPC联动实现安全中心接管

目录 一、IPS介绍 原理 功能 缺陷 二、ESPC介绍 原理 功能 三、NIPSESPC联动 实验目的 实验过程 一、IPS介绍 原理 如今内部威胁增多,外部攻击剧增,防火墙存在着一定的局限性,如:部署在边界处,更多的是对一些…

环境搭建(python+pycharm(anconda可选)

python下载 python下载,由于网站服务器在国外,所以打开可能有点慢,也可以使用国内的镜像网站(因为我没有试过,有兴趣的可以去尝试下,此文章的后面部分会有临时换源的操作) 电脑位数的查看 …

1277:【例9.21】方格取数——数字三角形模型

【题目描述】 设有NN的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上&…

如何实现同一IP的不同端口访问不同的网站

一,要求 1, 基于同一IP的不同端口访问不同的网站(可以通过域名去访问) ipport1 -> 对应一个域名 ipport2 -> 对应一个域名 使用域名1我应该访问到 ipport1对应的内容 使用域名2我应该访问到 ipport2对应的内容 2. …

阳了怎么居家办公?这4款远程办公软件你得知道!

疫情高峰期尚未过去,可是临近年底,各公司各部门都到了算绩效、追回款、清退结算的时候,大家都忙得根本脱不开身!居家远程办公也不得不架起电脑回消息! 本文给大家推荐4款超好用的远程办公软件,高效省事&am…

【机器学习 - 1】:knn算法

文章目录机器学习的概念和基础knn算法的实现过程封装knn算法总结机器学习的概念和基础 机器学习可以两类任务: 分类任务和回归任务 以机器学习本身来进行分类可分为: 监督学习 非监督学习 半监督学习 增强学习 监督学习:给机器的训练数据 有标…

android架构拆分方案-结构相关方案与技术

很纯、很生硬的架构技术归纳blog上上文https://blog.csdn.net/dongyi1988/article/details/128617738接上文https://blog.csdn.net/dongyi1988/article/details/128629011android架构官网地址https://source.android.google.cn/docs/core/architecture?hlzh-cnGKI(…

VBO、VAO、EBO学习记录

在这里要先了解一下OpenGL的一个幕后大致运作流程,可以直接阅读OPENGL CN 我自己大概总结了一下就是,OpenGL本身就是一个巨大的状态机,我们通过更改状态变量(上下文)来告诉OpenGL如何去绘制图像。一般通过设置选项,修改缓冲来更改…