OFDM802.11a的FPGA实现(十)导频插入(含verilog和matlab代码)

原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现

目录

  • 1.前言
  • 2.插入导频原理
  • 3.硬件实现
  • 4.Matlab仿真
  • 5.ModelSim仿真
  • 6.结果对比验证
  • 7.verilog代码

1.前言

前面一篇文章完成了星座图的映射,今天继续设计后面的模块。在接收机当中,虽然利用接收到的短/长训练序列,能够进行信道均衡,频偏校正,但符号还会存在一定的剩余频率偏差,并且偏差会随着时间的积累而累积,会造成所有子载波产生一定的剩余相位偏转。因此,还需要不断的对参考相位进行跟踪。要实现这一功能,需要在 52 个非零子载波中插入 4 个导频符号。

2.插入导频原理

Data 域的数据经过星座图映射后形成对应的复数值,每个 OFDM 符号周期可以通过 48 个子信道发出 48 个调制后的数据,所以把这些值每 48 个分成一组,每一组将对应一个 OFDM 符号。

OFDM子载波

子载波的数量一共有 53 个,每个子载波的标号为-26,-25,…,-1,0,1,…,26。其中 48 个复数数据分别对应到-26 至-22,-20 至-8,-6至-1,1 至 6,8 至 20,以及 20 至 26 这些子载波上,四个导频子信道分别对应到-21,-7,7 和 21 这 4 个子载波上。0 号子载波上填充零值(直流)。

导频所在位置

导频所处位置的值,是根据一个循环的导频的极性控制序列来完成的,该极性控制序列如下:

导频极性

每个导频极性对应一个OFDM符号,比如第一个OFDM符号也就是signal域的符号,其导频极性控制为1,那么其输出导频位置所给的值就位1 1 1 -1,又比如第5个OFDM符号,也就是第4个data域的OFDM符号,其极性控制为-1,那么其导频位置所给的值就位-1 -1 -1 1。依此类推。当p为“一1”时,对应的OFDM符号的导频符号需要改变极性(-1→+1;+1→-1);当p 为“1”时,对应的OFDM符号的导频符号不需要改变极性。p可以通过标准中所规定的扰码器(Scrambler)来产生。

扰码器

只不过,此模块扰码器的初始状态设为{1,1,1,1,1,1,1}。

3.硬件实现

导频插入模块的硬件实现框图

图中,SPI_DIN为导频模块输入数据,INDEX_IN为输入数据标号,从0到47。扰码器(Scrambler)产生导频的极性控制信号,扰码器初始状态设为7’b1111111。4个导频依次为1,1,1,-1。输入数据标号INDEX_IN通过LUT模块进行变换生成写入RAM 的地址,输入计数0到47映射为52个子载波,中间插入4个导频符号。因为导频插入模块输出到一个64位的 IFFT模块,一个模64的计数器用来生成输出地址。双口 RAM 暂时存放输入的信号。

由于导频插入模块之后是IFFT模块,因此本模块在具体实现时通过ROM 进行了数据顺序变换,使得数据输出时顺序变为符合IFFT输入的要求。例如,当使用64点的IFFT时,输入的48个数据(标号为0至47)的标号首先按照如下公式进行变换,映射为-26至26,其中标号-21,-7,7,21即为插入导频处(k为输入数据标号):

M ( k ) = { k − 26 , 0 ≤ k ≤ 4 k − 25 , 5 ≤ k ≤ 17 k − 24 , 18 ≤ k ≤ 23 k − 23 , 24 ≤ k ≤ 29 k − 22 , 30 ≤ k ≤ 42 k − 21 , 43 ≤ k ≤ 47 M(k) = \begin{cases} k-26,0 \leq k \leq 4 \\ \\k-25 ,5\leq k\leq 17\\ \\k-24 ,18\leq k\leq 23\\ \\k-23 ,24\leq k\leq 29\\ \\k-22 ,30\leq k\leq 42\\ \\k-21 ,43\leq k\leq 47 \end{cases} M(k)= k26,0k4k25,5k17k24,18k23k23,24k29k22,30k42k21,43k47
根据协议中对IFFT输入端口映射的规定,将变换后M(k)为1至26的子载波映射到IFFT的输入端口1至26,M(k)为一26至一1的子载波映射到IFFT的端口38到63,而剩下的端口27至37和0则置为零值。此映射的描述如下图所示。

IDFT输入与输出

相应的,插入导频的位置-21,-7,7,21分别对应到IFFT的输入端口43,57,21,7。编程实现时,根据导频极性,在这4个位置上插入导频。因此,结合上述两步,写入RAM中的数据标号的变换可直接用下式实现:
M ( k ) = { k + 38 , 0 ≤ k ≤ 4 k + 39 , 5 ≤ k ≤ 17 k + 40 , 18 ≤ k ≤ 23 k − 23 , 24 ≤ k ≤ 29 k − 22 , 30 ≤ k ≤ 42 k − 21 , 43 ≤ k ≤ 47 M(k) = \begin{cases} k+38,0 \leq k \leq 4 \\ \\k+39 ,5\leq k\leq 17\\ \\k+40 ,18\leq k\leq 23\\ \\k-23 ,24\leq k\leq 29\\ \\k-22 ,30\leq k\leq 42\\ \\k-21 ,43\leq k\leq 47 \end{cases} M(k)= k+38,0k4k+39,5k17k+40,18k23k23,24k29k22,30k42k21,43k47

在设计上,采用乱序写,顺序读的方式。先定义1个位宽为16的RAM,对输入数据的实数和虚数按Index序号通过上面公式变换后,存入RAM中。再通过扰码器产生的极性控制信号,对导频是否极性变换做处理,极性处理后,将导频信号写入对应RAM地址空间中。最后,以顺序方式从RAM中读取数据。为保证流水线处理,以及写入写出不发生冲突,RAM的深度需设置为2个OFDM符号的长度,使用乒乓缓存操作(前面文章乒乓缓存操作的链接)。

在对数据域进行调制的时候,导频控制序列是从地址1开始累加,直到处理完126个OFDM符号是,这是导频控制序列读取到第126个,然后才会回到0,然后从0~126循环,因为在802.11a当中,第一个OFDM符号是signal域的符号,data域是从第二个符号开始。

插入导频模块的输入输出如下图所示:

4.Matlab仿真

  以2个OFDM符号,16-QAM调制,编码效率为3/4,进行仿真,生成测试数据共计288个,如下:

test_data =

  列 1 至 27

     0     0     0     0     1     1     1     0     0     0     1     1     1     1     1     1     0     0     1     1     1     1     0     0     0     0     1

  列 28 至 54

     0     1     1     1     0     0     1     0     0     1     0     1     1     0     0     1     1     0     0     1     0     1     0     1     0     1     0

  列 55 至 81

     1     0     0     0     1     0     1     1     1     0     1     0     0     1     1     1     1     0     1     1     1     0     1     1     0     0     0

  列 82 至 108

     0     0     1     1     0     0     1     0     0     1     1     1     1     0     0     1     1     0     1     0     1     0     0     1     1     0     0

  列 109 至 135

     1     0     1     1     0     1     0     1     1     1     0     0     1     1     1     0     1     0     1     0     1     0     1     0     1     0     1

  列 136 至 162

     1     0     0     0     0     1     1     0     0     0     1     0     1     1     1     0     1     0     0     1     1     1     1     0     1     0     0

  列 163 至 189

     0     1     0     0     0     0     0     1     0     1     0     0     1     1     1     1     1     0     1     1     1     0     0     1     0     1     1

  列 190 至 216

     1     1     1     1     0     0     0     0     0     1     0     1     1     0     0     1     0     1     0     1     0     1     1     1     1     0     0

  列 217 至 243

     1     1     1     1     0     0     1     0     0     1     1     1     0     1     0     0     0     0     1     1     1     0     0     0     1     1     1

  列 244 至 270

     1     1     0     1     1     0     1     1     0     0     1     0     0     0     0     1     1     0     0     0     0     1     1     0     0     0     1

  列 271 至 288

     0     0     0     0     0     1     1     0     0     1     1     1     0     0     1     1     1     0

  测试数据经过前面章节的扰码、编码、删余、交织、调制映射,然后进行如下的插入导频:

%% 插入导频到7,21,43,57,由于matlab下标从1开始,这里插入导频位置为8,22,44,58
%插入导频极性控制,扰码
scram_seed2 = [1,1,1,1,1,1,1];
scram_reg = scram_seed2;
scram_out = zeros(1,k);
for m = 1:k
    scram_out(m) = mod(scram_reg(1) + scram_reg(4), 2);
    scram_reg(:,1:end) = [scram_reg(:,2:end), mod(scram_reg(1) + scram_reg(4), 2)];     %扰码寄存器移位,最低位为7+4
    if(m==127)
        scram_reg = scram_seed2;%127个OFDM符号之后,扰码器恢复初始状态
    end    
end
rx_interFrq = mod_out;
interFrq_out = zeros(1,64*k);
for m = 1:k
    reg48 = rx_interFrq((m-1)*48+1:m*48);
    reg_pn = scram_out(m);
        if(reg_pn)              %当 scram_out== 0 时,不需要极性取反, 当 scram_out==1 时,需要极性取反。
            reg_interFrq = [-1,1,-1,-1];%极性取反
        else
            reg_interFrq = [1,-1,1,1];
        end
        reg64 = zeros(1,64);
        %端口映射为IFFT输入
        reg64(1+38:5+38) = reg48(1:5);
        reg64(6+39:18+39) = reg48(6:18);
        reg64(19+40:24+40) = reg48(19:24);
        reg64(25-23:30-23) = reg48(25:30);
        reg64(31-22:43-22) = reg48(31:43);
        reg64(44-21:48-21) = reg48(44:48);
        %剩下的1,28-38端口置0
        reg64(28:38) = 0;
        reg64(1) = 0;
        %插入导频8,22,44,58
        reg64(8) = reg_interFrq(1);
        reg64(22) = reg_interFrq(2);
        reg64(44) = reg_interFrq(3);
        reg64(58) = reg_interFrq(4);
        interFrq_out((m-1)*64+1:m*64) = reg64;
end

  插入导频之后输出如下:

interFrq_out =

  列 1 至 8

   0.0000 + 0.0000i  -0.9531 - 0.9531i  -0.3125 + 0.9531i   0.9531 - 0.9531i   0.3125 + 0.3125i   0.9531 + 0.3125i   0.9531 - 0.3125i   1.0000 + 0.0000i

  列 9 至 16

  -0.9531 + 0.9531i   0.3125 - 0.9531i  -0.3125 + 0.9531i  -0.9531 + 0.9531i   0.3125 - 0.9531i  -0.9531 - 0.9531i   0.3125 + 0.3125i   0.9531 + 0.9531i

  列 17 至 24

  -0.3125 - 0.9531i  -0.3125 + 0.3125i  -0.3125 + 0.3125i  -0.3125 + 0.9531i   0.9531 - 0.9531i  -1.0000 + 0.0000i   0.9531 + 0.9531i   0.9531 + 0.3125i

  列 25 至 32

  -0.3125 - 0.3125i   0.9531 - 0.3125i  -0.9531 - 0.3125i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i

  列 33 至 40

   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i  -0.9531 + 0.9531i   0.9531 + 0.3125i

  列 41 至 48

   0.3125 + 0.9531i  -0.9531 + 0.3125i  -0.9531 + 0.9531i   1.0000 + 0.0000i   0.3125 + 0.3125i   0.9531 + 0.9531i   0.9531 + 0.3125i  -0.3125 + 0.9531i

  列 49 至 56

  -0.9531 + 0.9531i   0.9531 + 0.9531i  -0.9531 - 0.3125i   0.9531 + 0.9531i  -0.3125 + 0.3125i   0.9531 + 0.3125i  -0.9531 - 0.9531i   0.3125 + 0.9531i

  列 57 至 64

   0.3125 + 0.3125i   1.0000 + 0.0000i  -0.9531 + 0.9531i  -0.9531 - 0.3125i  -0.9531 + 0.3125i  -0.3125 + 0.9531i   0.9531 + 0.9531i  -0.3125 + 0.3125i

  列 65 至 72

   0.0000 + 0.0000i  -0.9531 - 0.9531i   0.3125 + 0.3125i  -0.9531 - 0.9531i   0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 - 0.9531i   1.0000 + 0.0000i

  列 73 至 80

  -0.3125 + 0.3125i   0.3125 + 0.3125i  -0.3125 + 0.3125i  -0.3125 + 0.3125i   0.9531 - 0.9531i  -0.3125 - 0.3125i  -0.9531 - 0.9531i   0.3125 - 0.3125i

  列 81 至 88

  -0.9531 + 0.3125i   0.9531 + 0.3125i   0.3125 - 0.9531i   0.3125 - 0.9531i  -0.9531 + 0.9531i  -1.0000 + 0.0000i  -0.9531 - 0.3125i   0.3125 - 0.9531i

  列 89 至 96

   0.3125 - 0.9531i  -0.9531 - 0.3125i  -0.3125 + 0.3125i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i

  列 97 至 104

   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i  -0.9531 + 0.9531i   0.9531 + 0.9531i

  列 105 至 112

  -0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 + 0.9531i   1.0000 + 0.0000i  -0.3125 - 0.3125i  -0.9531 + 0.3125i  -0.3125 - 0.3125i   0.3125 - 0.9531i

  列 113 至 120

  -0.9531 - 0.3125i  -0.9531 + 0.9531i   0.9531 + 0.9531i  -0.9531 + 0.9531i   0.3125 - 0.3125i  -0.3125 + 0.3125i  -0.3125 + 0.9531i   0.9531 - 0.9531i

  列 121 至 128

   0.9531 + 0.9531i   1.0000 + 0.0000i   0.3125 + 0.9531i   0.9531 - 0.3125i   0.9531 + 0.3125i  -0.3125 - 0.3125i  -0.9531 + 0.3125i   0.9531 - 0.3125i

5.ModelSim仿真

硬件按照如下图所示连接进行仿真:

将前面提到的测试数据作为输入,对硬件进行测试,仿真结果如下图:

导频插入

如上图所示,在没有数据输入的空隙,将导频写入RAM对应位置。

乱序写入

如上图所示,输入数据根据标号,进行乱序写入RAM。

顺序输出

如上图所示,输出数据从RAM中顺序输出,并且另外一个缓存区可以进行数据输入,实现了乒乓缓存,以保证流水线操作。

全局仿真图

6.结果对比验证

  将ModelSim仿真结果存为txt文件,在Matlab里面读出来与Matlab的仿真结果进行比较,代码如下:

%% 插入导频
FPGA_pilot_dout = readlines('D:/FPGA/OFDM_802.11a_my/TX/matlab/pilot_data_out.txt','EmptyLineRule','skip')';
display(FPGA_pilot_dout);
FPGA_Re_pilot_dout = extractBefore(FPGA_pilot_dout,9);
FPGA_Im_pilot_dout = extractAfter(FPGA_pilot_dout,8);
display(FPGA_Re_pilot_dout);
display(FPGA_Im_pilot_dout);
q = quantizer('fixed','round','saturate',[8,6]);
FPGA_Re_pilot_dout = bin2num(q,FPGA_Re_pilot_dout);
FPGA_Im_pilot_dout = bin2num(q,FPGA_Im_pilot_dout);
FPGA_Re_pilot_dout = cell2mat(FPGA_Re_pilot_dout);
FPGA_Im_pilot_dout = cell2mat(FPGA_Im_pilot_dout);
FPGA_pilot_dout = FPGA_Re_pilot_dout + 1j*FPGA_Im_pilot_dout;
display(interFrq_out);
display(FPGA_pilot_dout);
check_pilot = FPGA_pilot_dout == interFrq_out;
display(check_pilot);

FPGA插入导频之后的输出如下:

FPGA_pilot_dout =

  列 1 至 8

   0.0000 + 0.0000i  -0.9531 - 0.9531i  -0.3125 + 0.9531i   0.9531 - 0.9531i   0.3125 + 0.3125i   0.9531 + 0.3125i   0.9531 - 0.3125i   1.0000 + 0.0000i

  列 9 至 16

  -0.9531 + 0.9531i   0.3125 - 0.9531i  -0.3125 + 0.9531i  -0.9531 + 0.9531i   0.3125 - 0.9531i  -0.9531 - 0.9531i   0.3125 + 0.3125i   0.9531 + 0.9531i

  列 17 至 24

  -0.3125 - 0.9531i  -0.3125 + 0.3125i  -0.3125 + 0.3125i  -0.3125 + 0.9531i   0.9531 - 0.9531i  -1.0000 + 0.0000i   0.9531 + 0.9531i   0.9531 + 0.3125i

  列 25 至 32

  -0.3125 - 0.3125i   0.9531 - 0.3125i  -0.9531 - 0.3125i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i

  列 33 至 40

   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i  -0.9531 + 0.9531i   0.9531 + 0.3125i

  列 41 至 48

   0.3125 + 0.9531i  -0.9531 + 0.3125i  -0.9531 + 0.9531i   1.0000 + 0.0000i   0.3125 + 0.3125i   0.9531 + 0.9531i   0.9531 + 0.3125i  -0.3125 + 0.9531i

  列 49 至 56

  -0.9531 + 0.9531i   0.9531 + 0.9531i  -0.9531 - 0.3125i   0.9531 + 0.9531i  -0.3125 + 0.3125i   0.9531 + 0.3125i  -0.9531 - 0.9531i   0.3125 + 0.9531i

  列 57 至 64

   0.3125 + 0.3125i   1.0000 + 0.0000i  -0.9531 + 0.9531i  -0.9531 - 0.3125i  -0.9531 + 0.3125i  -0.3125 + 0.9531i   0.9531 + 0.9531i  -0.3125 + 0.3125i

  列 65 至 72

   0.0000 + 0.0000i  -0.9531 - 0.9531i   0.3125 + 0.3125i  -0.9531 - 0.9531i   0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 - 0.9531i   1.0000 + 0.0000i

  列 73 至 80

  -0.3125 + 0.3125i   0.3125 + 0.3125i  -0.3125 + 0.3125i  -0.3125 + 0.3125i   0.9531 - 0.9531i  -0.3125 - 0.3125i  -0.9531 - 0.9531i   0.3125 - 0.3125i

  列 81 至 88

  -0.9531 + 0.3125i   0.9531 + 0.3125i   0.3125 - 0.9531i   0.3125 - 0.9531i  -0.9531 + 0.9531i  -1.0000 + 0.0000i  -0.9531 - 0.3125i   0.3125 - 0.9531i

  列 89 至 96

   0.3125 - 0.9531i  -0.9531 - 0.3125i  -0.3125 + 0.3125i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i

  列 97 至 104

   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i  -0.9531 + 0.9531i   0.9531 + 0.9531i

  列 105 至 112

  -0.3125 + 0.3125i  -0.9531 - 0.3125i  -0.3125 + 0.9531i   1.0000 + 0.0000i  -0.3125 - 0.3125i  -0.9531 + 0.3125i  -0.3125 - 0.3125i   0.3125 - 0.9531i

  列 113 至 120

  -0.9531 - 0.3125i  -0.9531 + 0.9531i   0.9531 + 0.9531i  -0.9531 + 0.9531i   0.3125 - 0.3125i  -0.3125 + 0.3125i  -0.3125 + 0.9531i   0.9531 - 0.9531i

  列 121 至 128

   0.9531 + 0.9531i   1.0000 + 0.0000i   0.3125 + 0.9531i   0.9531 - 0.3125i   0.9531 + 0.3125i  -0.3125 - 0.3125i  -0.9531 + 0.3125i   0.9531 - 0.3125i

FPGA输出与Matlab仿真结果进行对比结果如下:

check_pilot =

  1×128 logical 数组

  列 1 至 41

   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

  列 42 至 82

   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

  列 83 至 123

   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

  列 124 至 128

   1   1   1   1   1

  两个OFDM符号插入导频之后为128个输出,对比逻辑结果全为‘1’,说明FPGA该模块设计完全正确,作者测试了其他调制方案和数据速率都是正确的,这里不再重复赘述。感兴趣的可以自行进行测试。

原文连接(相关文章合集):OFDM 802.11a的xilinx FPGA实现

7.verilog代码

需要verilog代码,点此链接即可获取!!!!

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

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

相关文章

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析 下图为keil编译后的结果: 单位为Byte。Code是程序大小。RO是常量大小。RW是读写变量占用大小,如已初始化的静态变量和全局变量。ZI是全零变量占用大小,如未初始化的static修饰的静态变量、全局…

聊聊BitLocker

最近有消息称微软决定在Windows 11 24H2中默认开启BitLocker,这个消息在网上引起了不小的波澜。有人说,对于我们这些普通用户来说,BitLocker真的有必要吗? 什么是BitLocker BitLocker 是一项 Windows 安全功能,可为整…

如何使用多协议视频汇聚/视频安防系统EasyCVR搭建智慧园区视频管理平台?

智慧园区作为现代化城市发展的重要组成部分,不仅承载着产业升级的使命,更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化,将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…

如何制作有趣的gif?这个方法别错过

是否在社交媒体上看到过很多有趣好玩的gif动图,有的搞笑有趣有的又很可爱。大家有没有想过自己动手制作gif动画呢?接下来,就给大家分享一招gif在线制作(https://www.gif5.net/)的方法,超简单不需要下载任何…

什么牌子的洗地机质量最好?四款耐用高分产品推荐

洗地机具备了吸尘、擦拭、除菌等多种功能,可以一次完成多种清洁任务,帮助用户更高效地保持家居整洁,节省时间和精力,备受人们的喜爱。但是怎么挑选到优质的洗地机一直是大家关注的问题。今天,笔者将结合自己在家电行业…

什么是驱动数字签名?如何获取驱动数字签名?

Windows 驱动程序承载着计算机实现的各种内核和用户模式功能。如果驱动程序被黑客攻击,可能会产生很多问题。Windows通过数字签名来验证驱动程序包的完整性及发布者的身份。2020年10月的安全更新中,微软加强了对驱动软件的验证,如果Windows无…

【微积分听课笔记】全微分,二元极值,Double Integral

6.6 二元函数的极值_哔哩哔哩_bilibili 此笔记为听课笔记,宋浩老师微积分~ 最近诸事缠身,会有种会不会只做一件事好些。实际上,关键在于动力,我不可能每次都准备充分。动力,分配,这是目前进入大学我正在学…

【yolov8 项目打包】pyinstaller 打包pyQt5 界面为exe

创建一篇博客文章,介绍如何使用PyInstaller将PyQt5界面打包为exe文件,并且处理与YOLOv8模型相关的文件,可以按照以下结构进行: 标题:使用PyInstaller将PyQt5界面与YOLOv8模型打包为Windows可执行文件 引言 在机器学习…

vue视图不刷新强制更新数据this.$forceUpdate()

在vue中,更新视图数据,不刷新页面,需要强制更新数据才可以 前言 在对数据就行添加和删除时,发现页面视图不更新,排除发现需要强制更新才可以 点击添加或删除,新增数据和删除就行,但在不使用fo…

如何vscode中刷力扣

推荐你阅读 互联网大厂万字专题总结 Redis总结 JUC总结 操作系统总结 JVM总结 Mysql总结 微服务总结 互联网大厂常考知识点 什么是系统调用 CPU底层锁指令有哪些 AQS与ReentrantLock原理 旁路策略缓存一致性 Java通配符看这一篇就够 Java自限定泛型 技术分享 如何vscode中刷力扣…

视频号小店想要长久发展,做店的核心是什么?一篇详解!

大家好,我是电商小V 想要做好视频号小店,那么他的核心是什么呢? 视频号小店的核心还是商品,其实电商运营底层的逻辑都是一样的,都是以商品为核心去运营的,再说的浮夸一点就是,你的商品选择的好&…

【实战】采用jenkins pipeline实现自动构建并部署至k8s

文章目录 前言部署jenkins编写docker-compose-jenkins.yaml配置maven源启动jenkins解锁jenkins Jenkins默认插件及git、镜像仓库、k8s凭证配置host key verification configuration修改为不验证Gitee ssh阿里云镜像仓库ssh编写pipeline安装以下常用插件将kubectl命令文件拷贝到…

System Verilog通过CORDIC算法迭代16次求sin和cos值

求5~85度的sin和cos值 其它角度和Verilog实现代码类似,查表、移位和加法器 define DIE 16 //迭代次数 define PIE 3.1415926 define MUL 100_000_000 //同比放大 initial begin int die; int x[17]; int y[17]; int z[17…

学习软考----数据库系统工程师25

关系规范化 1NF(第一范式) 2NF(第二范式) 3NF(第三范式) BCNF(巴克斯范式) 4NF(第四范式) 总结

排序算法(Java版)

目录 1、直接插入排序2、希尔排序3、直接选择排序4、堆排序5、冒泡排序6、快速排序6.1 递归实现6.2 非递归实现 7、归并排序7.1 递归实现7.2 非递归实现 8、性能分析 今天我们学习一种算法:排序算法(本文的排序默认是从小到大顺序)&#xff0…

深度学习常用优化算法笔记介绍,各种梯度下降法详细介绍

优化算法 mini-batch梯度下降法 当一个数据集其数据量非常大的时候,比如上百万上千万的数据集,如果采用普通的梯度下降法,那么运算速度会非常慢,因为如果使用梯度下降法在每一次迭代的时候,都需要将这整个上百万的数…

基于边缘智能网关的工业燃气管网监测应用

随着城市化和工业化的飞速发展,燃气的使用量和应用范围持续增加,燃气管网作为承载燃气输送的设施,安全问题至关重要。一旦燃气管网发生泄漏事故,极易引发起火、爆炸等,从而酿成人员伤亡及财产损失的恶性事故。 得益于物…

流量分析利器arkime的学习之路(三)---结合Suricata攻击检测

1、基础 Arkime安装部分参考《流量分析利器arkime的学习之路(一)—安装部署》 在此基础上安装suricata软件并配置。 2、安装suricata yum install suricate 可能依赖的文件包括libyaml,PyYAML,这些可能在之前安装arkime或者其他…

Vue接收后端POST、GET返回的zip文件流打开报异常

近期接到一个小任务是将内容导出为 Zip 文件流的行式给前端 Vue 供用户下载;过程中发现一个问题打开 zip 文件报异常,如下: 首先后端这块单独在服务端请求是落盘的文件是正常的;因此后端的这块的逻辑没有问题;但中间前…

微服务拆分

目录 前言: 逻辑视图架构风格 一、分层式架构风格 二、六边形架构 如何定义微服务架构 微服务的拆分 业务能力进行服务拆分 子域进行服务拆分 拆分的原则 单一职责 闭包原则 前言: 我们在软件开发的时候一直在谈论架构,那么什么是…