基于MATLAB的MIMO预编码设计:优化迫零算法(附完整代码与分析)

news2024/11/17 9:59:16

目录

一.介绍

二. 对比本方案优化后的迫零算法与原始的迫零算法

三. 源代码

四. 运行结果及分析

4.1 天线数为8

4.2 天线数为128


一.介绍

图中“RF Chain” 全称为Radio Frequency Chain,代表射频链路。

MIMO预编码包含了基带预编码W(改变幅度和相位)和射频预编码F(改变相位)。用户k端收到的信号为:

上式中h^H_k代表基站到用户的信道矩阵,F代表射频预编码,W代表基带预编码,s代表发射信号向量,n_k代表加性高斯白噪声。

发射流的最大数量为K,则:

||FW||^2_F=K

用户k端受到的信干噪比(SINR)为:

 上式子中P代表基站的发射功率。其他参数的意义上面已解释。

系统的总频谱效率为:

 上式中E[]代表求数学期望。 其他参数的意义上面已解释。

依据基础的迫零算法进行改进,将K个射频链路输出与N_t个发射天线进行耦合,仅仅进行相位控制,然后在基带上进行低维多流处理,最终降低用户间的干扰,本方案创新性提出相位-迫零算法(Phased-ZF),优点:

极大降低计算复杂度;

性能逼近原始ZF(迫零)算法;

对该预编码的两步,总结来看为如下:

 

二. 对比本方案优化后的迫零算法与原始的迫零算法

三. 源代码

一共八个文件,两个主运行文件,六个函数文件。注意最后的两个文件为实际产生图像的代码部分。

(1)

%  BD precoder design subfunction r = CalBDPrecoder(G, K) --%
%  Input:  H, K*Nr x Nt,  aggregate channel, 
%          NsUE, # streams per user, K x 1
%  Output: r, Nt x K*Lr BD precoder

function r = CalBDPrecoder(H, NsUE) % no waterfilling
if nargin <= 1
    NsUE = ones(size(H,1)); % essentially ZF precoding with column normalization
end
[NR, Nt] = size(H);
K = length(NsUE);
Nr = NR/K;
F = [];% BD precoder initialization

%***** Standard BD design based on paper "ZF methods for DL spatial multiplexing..." ***%
for iK = 1 : K
    Gj = H(((iK-1)*Nr+1):(iK*Nr),:);
    G_tilde = H;
    G_tilde(((iK-1)*Nr+1):(iK*Nr),:) = []; % Delete iK-user's channel, G_tilde
    [U, S, V] = svd(G_tilde);
    rv = rank(G_tilde);
    
    Htmp = Gj*V(:, (rv + 1):Nt );
    Lr = rank(Htmp);% # of data streams accommodated by iK user
    [Ut, St, Vt] = svd(Htmp);
    Ftmp = V( : , (rv + 1):Nt)*Vt(: , 1:NsUE(iK));
    F = [F Ftmp];
end
r = F;

 (2)

% Function to calculate achievable rates
% r = CalRate(H, W, K);
% Input: H, channel instantialization, (KNr) x Nt
%        W, precoding matrix, column normalized, Nt x Ns
%        NsUE, a vector showing # streams of each UE, K x 1
%        Incov, input covariance, i.e., power allocation, Ns x Ns
% Output: r, achievable rate

function r = CalRate(Incov, H, W, NsUE)
Incov = diag(Incov); % vectorize
if nargin <= 3 
    NsUE = ones(size(W,2), 1);% set default, single stream per user
end

K = length(NsUE);% # of users
Nr = size(H, 1)/K;% # antenna per user, assuming equal
Ns = sum(NsUE);% total # data streams

rate = 0;
for iK = 1 : K
        
    st = sum(NsUE(1:(iK-1)))+1;
    ed = sum(NsUE(1:iK));
    
    Hj = H( (Nr*(iK-1)+1) : (Nr*iK), :);% user channel of i
    Wj = W(:, st:ed);% precoder for user i
    covj = diag(Incov(st:ed));
    Pj = Hj*Wj*covj*(Hj*Wj)'; % signal power term
    
    Wintf = W;% precoder for interferers
    covtp = Incov;
    
    Wintf(:, st:ed) = [];
    covtp(st:ed) = [];
    cov_intf = diag(covtp);
    Pintf = (Hj*Wintf)*cov_intf*(Hj*Wintf)';% interference power term
    
    rate = rate + log2(det( eye(Nr) + inv( eye(Nr) + Pintf ) * Pj ));
end

r = rate;

(3)

% expintn exponential intergral of the order n
% r = expintn(x, n) gives integral from 1 to inf of (exp(-xt)/t^n)dt, for x > 0

function r = expintn_noMaple(x, n)

if n >= 2
    sum = 0;
    for m = 0 : (n-2)
        sum = sum + (-1)^m*factorial(m)/x^(m+1);
    end

    minuend = x^(n-1) * (-1)^(n+1)/factorial(n-1) * expint(x);
    subtractor = x^(n-1) * (-1)^(n+1)/factorial(n-1) * exp(-x) * sum;
    r = minuend - subtractor;
else
    r = expint(x);
end

(4)

% expintn(x, n) is an an exponential integral of order n with input x,
% computed using maple

function r = expintn(x, n)

cmd_str = sprintf('evalf[16](Ei(%d, %g));', n, x);
r = double(maple(cmd_str));

(5)

% Generate a simplified MU-MIMO channel based on uniform linear array (ULA)
% "The capacity optimality of beam steering in large mmWave MIMO channels"
% [H, Gain, At] = GenChannelSimp (Nt, K, Ncls)
% Input: Nt, number of TX antennas
%        K, number of single-antenna UEs
%        Ncls, number of clusters, single path per cluster
%        d, normalized antenna spacing
% Output: H, generated MU-MIMO channel
%         Gain, complex gain of each path
%         At, concatenation of array response vectors

function [H, Gain, At] = GenChannelSimp(Nt, K, Ncls, d)
if nargin <= 3
    d = 1/2;
end

% spread = pi/12;% [-15, 15]
spread = pi;
ang = (2*rand(Ncls, K)-1)*spread; % generated path angles, uniform distribution
Gain = (randn(Ncls, K) + j*randn(Ncls, K))/sqrt(2);

At = zeros(Nt, Ncls, K);
H = zeros(K, Nt);
for ik = 1 : K
    tmp = 0 : (Nt-1);
    tmp = tmp(:);
    kron1 = j*2*pi*d*tmp;
    kron2 = sin(ang(:, ik));
    kron2 = kron2.';
    kronr = kron(kron1, kron2);
    
    At(:, :, ik) = 1/sqrt(Nt) * exp(kronr);
    H(ik, :) = sqrt(Nt/Ncls) * Gain(:, ik).' * At(:, :, ik)';
end

(6)

% Quant(B, W) quantizes phases of each element in W up to B bits of precision

function r = Quant(B, W)
delta = 2*pi/2^B; % quantization interval
r = zeros(size(W, 1), size(W, 2));% ininitialize quantized matrix

for i1 = 1 : size(W, 1)
    for i2 = 1 : size(W, 2)
        ph = phase(W(i1, i2)); % ph in [-pi, pi]
        phq = floor(ph/delta)*delta +(mod(ph, delta) > delta/2)*delta ;% quantized phase
        r(i1, i2) = exp(j*phq);
    end
end
r = 1/sqrt(size(W, 1)) * r;
end

(7)

%   Massive MU-MIMO under chain limitations, single-antenna UE
%   Hybrid precoding with ZF at baseband and phase reversal at analog
%   Compare full-complexity ZF (FC-ZF) vs Hybrid

tic; clear; clc

Nt = 8;
K = 2; % UE number
B1 = 1; % quantized analog beamforming, up to B bits of precision
B2 = 2;

SNR = 0 : 5 : 30; 
nSNR = length(SNR);
channNum = 1e3;

rateZF = zeros(nSNR, 1); % FC-ZF
rateZFA = zeros(nSNR, 1);
rateHyb = zeros(nSNR, 1);% W = ZF at baseband, F = PR at analog
rateHybA = zeros(nSNR, 1);
rateQHyb1 = zeros(nSNR, 1);% Quantized PR, ZF at baseband
rateQhyb2 = zeros(nSNR, 1);

for isnr = 1 : nSNR
    
    P = 10^(SNR(isnr)/10);
    
    % ====================================================================
    % ===================== Analytical result ============================
    % ====================================================================
    % ==========  ZF analytical results =============
    s = 0;
    for k = 1 : (Nt)
        rho = P/K;
        s = s + exp(1/rho)*log2(exp(1)) * expintn_noMaple(1/rho, k); % use maple for expintn()
        % s = s + exp(1/rho)*log2(exp(1)) * expintn_noMaple(1/rho, k); % if no maple installed
    end    
    rateZFA(isnr) = K*s;
    
    % ========= Hybrid precoding analytical results  ==========
    rateHybA(isnr) = K*log2(1 + (pi/4) * (P*Nt)/K );
    
    % ====================================================================
    % ===================== Simulation result ============================
    % ====================================================================   
    for ichannel = 1 : channNum
        
        H = (randn(K, Nt) + j*randn(K, Nt))/sqrt(2);
        
        %   =============  ZF preocidng, numerical  ================ 
        WtZF = H'*inv(H*H');
        WZF = WtZF*inv(sqrt(diag(diag(WtZF'*WtZF)))); % normalized columns
        rateZF(isnr) = rateZF(isnr) + CalRate(P/K*eye(K), H, WZF);
        
        %   ============ Hybrid, numerical ===============
        F = 1/sqrt(Nt)*exp(j.*angle(H))';
        Fb = CalBDPrecoder(H*F);% baseband, same as inverse with column normalization
        wt = F*Fb;% aggregate precoder
        WPR = wt*inv(sqrt(diag(diag(wt'*wt))));   
        rateHyb(isnr) = rateHyb(isnr) + CalRate((P/K)*eye(K), H, WPR);% ZF-PRP
        
        %   ============= Quantized ZF-PR precoding ============
        FQPR1 = Quant(B1, F);% analog RF
        wt = FQPR1*CalBDPrecoder(H*FQPR1);
        WQPR1 = wt*inv(sqrt(diag(diag(wt'*wt))));
        rateQHyb1(isnr) = rateQHyb1(isnr) + CalRate((P/K)*eye(K), H, WQPR1);
        
        WtQPR2 = Quant(B2, F);
        wt = WtQPR2*CalBDPrecoder(H*WtQPR2);
        WQPR2 = wt*inv(sqrt(diag(diag(wt'*wt))));
        rateQhyb2(isnr) = rateQhyb2(isnr) + CalRate((P/K)*eye(K), H, WQPR2);      
    end
    isnr   
end

rateZF = rateZF/channNum;
rateHyb = rateHyb/channNum;
rateQHyb1 = rateQHyb1/channNum;
rateQhyb2 = rateQhyb2/channNum;

LineWidth = 1.5;
MarkerSize = 6;
figure
plot(SNR, abs(rateZF), 'k-x', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateZFA), 'bo', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize);
hold on
plot(SNR, abs(rateHyb),'r-*', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateHybA), 'gd', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateQHyb1), 'b-^', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateQhyb2), 'b-v', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold off
legend('FC-ZF, simulation', 'FC-ZF, analytical', ...
    'PZF, simulation', 'PZF, analytical', ...
    'Quantized PZF, B = 1','Quantized PZF, B = 2');
xlabel('SNR (dB)')
ylabel('Spectral Efficiency (bps/Hz)')
title(sprintf('Nt = %d, K = %d', Nt, K))
grid
% saveas(gcf, sprintf('MassiveCompareScheme-Nt%d-K%d', Nt, K)); 
% saveas(gcf, sprintf('MassiveCompareScheme-Nt%d-K%d-PhaseOfZf', Nt, K));

toc

(8)

% DESCRIPTION
%   mmWave massive MU-MIMO under chain limitations, single-antenna UE
%   Hybrid precoding with ZF at baseband and Phase Reversal (PR) Preocidng at analog
%   Compare full-complexity ZF (FC-ZF), Hybrid, QHybrid, and B-MIMO numerically

tic; clear all; clc

Nt = 128;
K = 4; % UE number
Np = 10; % number of paths per user
B1 = 1; % quantized analog beamforming, up to B bits of precision
B2 = 2;

SNR = -30 : 5 : 0; 
nSNR = length(SNR);
channNum = 1e3;

rateZF = zeros(nSNR, 1); % FC-ZF
rateHyb = zeros(nSNR, 1);% W = ZF at baseband, F = PR at analog
rateHybQ1 = zeros(nSNR, 1);% Quantized hybrid precoding
rateHybQ2 = zeros(nSNR, 1);
rateBMIMO = zeros(nSNR, 1);% Multiuser beamspace MIMO precoder (BMIMO)

for isnr = 1 : nSNR
    
    P = 10^(SNR(isnr)/10);
    
    for ichannel = 1 : channNum
        
        [H, Gain, At] = GenChannelSimp(Nt, K, Np, 0.5); % mmWave channel
        % H = K x Nt, Gain = Np x K, At = Nt x Np x K
        
        %   =============  ZF preocidng, numerical  ================ 
        WtZF = H'*inv(H*H');
        WZF = WtZF*inv(sqrt(diag(diag(WtZF'*WtZF)))); % normalized columns
        rateZF(isnr) = rateZF(isnr) + CalRate(P/K*eye(K), H, WZF);
        
        %   ============ Hybrid precoding, numerical ===============
        for ik = 1 : K
            ph = - phase(H(ik,:));
            ph = ph(:);
            F(:,ik) =1/sqrt(Nt)* exp(j.*ph); % analog RF preprocessing
        end
        Fb = CalBDPrecoder(H*F);% digital baseband, same as inverse with column normalization
        wt = F*Fb;% aggregated precoder
        WPR = wt*inv(sqrt(diag(diag(wt'*wt))));   
        rateHyb(isnr) = rateHyb(isnr) + CalRate((P/K)*eye(K), H, WPR);% ZF-PRP
        
        %   ============= Quantized hybrid precoding ============
        FQPR1 = 1/sqrt(Nt) * Quant(B1, F);% analog RF
        wt = FQPR1*CalBDPrecoder(H*FQPR1);
        WQPR1 = wt*inv(sqrt(diag(diag(wt'*wt))));
        rateHybQ1(isnr) = rateHybQ1(isnr) + CalRate((P/K)*eye(K), H, WQPR1);
        
        WtQPR2 = 1/sqrt(Nt) * Quant(B2, F);
        wt = WtQPR2*CalBDPrecoder(H*WtQPR2);
        WQPR2 = wt*inv(sqrt(diag(diag(wt'*wt))));
        rateHybQ2(isnr) = rateHybQ2(isnr) + CalRate((P/K)*eye(K), H, WQPR2);

        % =========== Multiuser Beamspace MIMO precoder (B-MIMO) ============== %
        D = dftmtx(Nt);
        Hf = H*D;
        [maxVal, maxInd] = sort(diag(Hf'*Hf), 'descend'); % sort column with decreasing magnitude
        FBMIMO = D(:, maxInd(1:K));
        FbBMIMO = pinv(H*FBMIMO);
        Wt = FBMIMO*FbBMIMO;% analog x baseband precoding
        WBMIMO = Wt*inv(sqrt(diag(diag(Wt'*Wt))));
        rateBMIMO(isnr) = rateBMIMO(isnr) + CalRate((P/K)*eye(K), H, WBMIMO);
    end
    isnr   
end

rateZF = rateZF/channNum;
rateHyb = rateHyb/channNum;
rateHybQ1 = rateHybQ1/channNum;
rateHybQ2 = rateHybQ2/channNum;
rateBMIMO = rateBMIMO/channNum;

LineWidth = 1.5;
MarkerSize = 6;
figure
plot(SNR, abs(rateZF), 'k-o', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateHyb),'r-*', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateHybQ1), 'b-^', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateHybQ2), 'b-v', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold on
plot(SNR, abs(rateBMIMO), 'm-s', 'LineWidth', LineWidth, 'MarkerSize', MarkerSize)
hold off
legend('FC-ZF Precoding', 'Hybrid Precoding', 'Quantized Hybrid Precoding, B = 1',...
    'Quantized Hybrid Precoding, B = 2', 'B-MIMO Preocoding');
xlabel('SNR (dB)')
ylabel('Spectral Efficiency (bps/Hz)')
% title(sprintf('Nt = %d, K = %d,  Np = %d',Nt, K, Np))
grid

saveas(gcf, sprintf('MainCompareScheme-Nt%d-K%d-Np%d', Nt, K, Np)); % save current figure to file
toc

四. 运行结果及分析

4.1 天线数8

ZF: Zero Forcing 迫零算法 SNR Signal Noise Ratio 信噪 PZF:Phased-Zero Forcing

 对比三种算法性能:原始ZF算法,PZF算法,量化后的PZF算法。

横向对比:三种算法均满足,随着SNB0增加到30dB,频谱效率从2.166增大到23.75 bps/HZ,符合正常逻辑;

纵向对比:在同一SNR下,性能从最优到最劣,理论ZF值、实际ZF仿真值、理论PZF值、实际PZF仿真值、精度到两位比特的PZF值、精度到1位比特的PZF值;

方案对比:本方案PZF比原始ZF性能略差(相差约0.7bps/Hz),但计算复杂性低得多,更具有实用价值;

量化对比:在PZF方案基础上,进一步约算,取近似比特可进一步形成Quantized PZF. 随着近似比特精度取值从12,频谱效率也会增大(约2.07bps/Hz)。性能降低但计算复杂度会更一步降低,增加应用价值;

4.2 天线数为128

图中B-MIMO 全称为Beamspace MIMO 代表的意义是 波束空间MIMO 

天线数N_t128:

横向对比:当SNR-30增加到0dB,频谱效率整体上从0增加到19.63bps/Hz;

纵向对比:从最优到最劣:原始ZF预编码、本论文的混合预编码、比特近似精度取2的混合预编码、比特精度取1的混合预编码、波束空间MIMO方案;

以牺牲不足1bps/Hz的频谱效率,却能极大降低计算复杂度,降低MIMO对射频硬件的要求;

MATLAB代码运行时间:天线数为4时运行3秒左右,天线数为128时运行50.199667秒;

在信噪比为0dB时,本方案PZF频谱效率为18.35bps/Hz。设定4G基站采用4根天线,平均频谱效率为2.9 bps/Hz。设定5G基站天线数为64,平均频谱效率为10 bps/Hz【数据来源物联网智库》】

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

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

相关文章

NVIDIA GPU开源驱动编译学习架构分析

2022年5月&#xff0c;社区终于等到了这一天&#xff0c;NVIDIA开源了他们的LINUX GPU 内核驱动&#xff0c; Linux 内核总设计师 Linus Torvalds 十年前说过的一句话&#xff0c;大概意思是英伟达是LINUX开发者遇到的硬件厂商中最麻烦的一个&#xff0c;说完这句话之后&#x…

20230225英语学习

Is Your Phone Heavier When It’s Full of Data? We’ve Done the Math 从数学角度看&#xff0c;充满数据的手机会更重吗&#xff1f; Here’s a weird question: does your phone weigh more when it’s “full” than when it’s “empty”?It sounds almost ridiculou…

【unity游戏制作-mango的冒险】场景二的镜头和法球特效跟随

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的冒险场景二——镜头和法球特效跟随⭐ 文章目录⭐mango的冒险场景二——镜…

C#的多线程、线程池和Task

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作&#xff0c;那么设置不同的线程执行路径往往是有益的&#xff0c;每个线程执行特定的工作。 线程是轻量级进程。一个使用线程的常见实例是现代操作系统中并行编程的…

如何使用Python和ftplib模块连接到FTP服务器并列出远程目录中的文件?

ftp服务可以用在以下一些使用场景&#xff1a; 文件共享&#xff1a;使用Python和FTP服务器可以轻松地搭建一个文件共享服务&#xff0c;使得用户可以上传和下载文件&#xff0c;从而促进协作和信息共享。 数据备份&#xff1a;FTP可以用于将数据备份到另一个服务器或云存储中…

Git ---- GitHub 操作

Git ---- GitHub 操作1. 创建远程仓库2. 远程仓库操作1. 创建爱你远程仓库别名2. 推送本地分支到远程仓库3. 克隆远程仓库到本地4. 邀请加入团队5. 拉取远程库内容3. 跨团队协作4. SSH 免密登录GitHub 网址&#xff1a;https://github.com/ Ps&#xff1a;全球最大同性交友网站…

实现弹窗功能并修改其中一个系数

把鼠标放在number-info上面,会是一个delon/chart的类库,可以在NG-ALAIN上找到阅读NG ALAIN的图表,以及number-info样式,数据文本 它拥有[title] [subtitle]两个可以是TemplateRef类型的,而template可以在里面放一些东西,比如按钮,所以可以放一个修改按钮 这里刚开始把template放…

学习 Python 之 Pygame 开发魂斗罗(三)

学习 Python 之 Pygame 开发魂斗罗&#xff08;三&#xff09;继续编写魂斗罗1. 角色站立2. 角色移动3. 角色跳跃4. 角色下落继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;二&#xff09;中&#xff0c;我们完成了角色的创建和更新&#xff0c;现…

MySQL高级第一讲

目录 一、MySQL高级01 1.1 索引 1.1.1 索引概述 1.1.2 索引特点 1.1.3 索引结构 1.1.4 BTREE结构(B树) 1.1.5 BTREE结构(B树) 1.1.6 索引分类 1.1.7 索引语法 1.1.8 索引设计原则 1.2 视图 1.2.1 视图概述 1.2.2 创建或修改视图 1.3 存储过程和函数 1.3.1 存储过…

openresty的部署、nginx高速缓存的配置、nginx日志的可视化

文章目录一、openresty1.OpenResty简介2.OpenResty的技术3.OpenResty的优势4.openresty部署实验二、nginx配置高效缓存三、nginx日志可视化一、openresty 1.OpenResty简介 OpenResty官网 http://openresty.org/cn/ OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台&#x…

shell基础学习

文章目录查看shell解释器写hello world多命令处理执行变量常用系统变量自定义变量撤销变量静态变量变量提升为全局环境变量特殊变量$n$#$* $$?运算符:条件判断比较流程控制语句ifcasefor 循环while 循环read读取控制台输入基本语法:函数系统函数basenamedirname自定义函数shel…

FL StudioV21电脑版水果编曲音乐编辑软件

这是一款功能十分丰富和强大的音乐编辑软件&#xff0c;能够帮助用户进行编曲、剪辑、录音、混音等操作&#xff0c;让用户能够全面地调整音频。FL水果最新版是一款专业级别的音乐编曲软件&#xff0c;集合更多的编曲功能为一身&#xff0c;可以进行录音、编辑、制作、混音、调…

计算机网络(六): HTTP,HTTPS,DNS,网页解析全过程

文章目录一、HTTP头部包含的信息通用头部请求头部响应头部实体头部二、Keep-Alive和非Keep-Alive的区别三、HTTP的方法四、HTTP和HTTPS建立连接的过程4.1 HTTP4.2 HTTPS五、HTTP和HTTPS的区别六、HTTPS的加密方式七、cookie和sessionsessioncookie八、HTTP状态码状态码200&…

【微信小程序】-- WXML 模板语法 - 数据绑定(九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

DPDK系列之四DPDK整体框架分析说明

一、网络发展和DPDK 在上篇分析过网络应用对DPDK出现的影响。而具体体现在技术上&#xff0c;从最简单来看就是从C10K到c100K甚至更多。而相应的计算的发展也从挖掘单CPU的性能发展到了瓶颈&#xff0c;同样&#xff0c;对于网络设备也遇到了类似的问题。而目前解决问题的方法…

MySQL到Elasticsearch实时同步构建数据检索服务的选型与思考[转载]

前言 本文具体探讨 MySQL 数据实时同步到 Elasticsearch (以下简称 ES ) 技术方案和思考&#xff0c;同时使用一定篇幅介绍一些前置知识&#xff0c;从理论到实践&#xff0c;让读者更好的理解这块内容和相关问题。包括&#xff1a; 为什么我们要将数据从 MySQL 实时同步到 ES …

Day899.Join语句优化 -MySQL实战

Join语句优化 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Join语句优化的内容。 join 语句的两种算法&#xff0c;分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。 发现在使用 NLJ 算法的时候&#xff0c;其实效果还是不错的&#xff0c…

【手把手一起学习】(五) Altium Designer 20 STM32核心板Demo----PCB封装库添加元件

1 PCB封装库添加元件 元件的PCB封装非常重要&#xff0c;关系到实际电子元件能否焊接到制作的电路板上。PCB封装的引脚顺序&#xff0c;引脚间距&#xff0c;焊盘大小&#xff0c;焊盘形状等都需要与元件实物严格对应&#xff0c;因此绘制PCB封装库时&#xff0c;需要参考元件…

在Windows上编译Nginx

《在Windows上编译Nginx》视频教程官方编译说明 Building nginx on the Win32 platform with Visual C 环境准备 1. Microsoft Visual Studio(Microsoft Visual C 编译器)&#xff0c;下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/。 2. Git(备用)&…

OSS存储使用之centOS系统ossfs挂载

以CentOS7系统为例 下载CentOS系统支持的ossfs工具的版本&#xff0c;以下载CentOS 7.0 (x64)版本为例&#xff0c;可以通过wget命令进行安装包的下载 wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm 也可以通过yum命令来进行安装包的下载 sud…