OFDM学习-(二)长短序列和PPDU整体数据处理流程
OFDM学习
(二)长短序列和PPDU整体数据处理流程
- OFDM学习
- 前言
- 一、短序列
- 短序列的作用
- 二、长序列
- 三、PLCP/SIGNAL/DATA数据处理流程
- 三、fpga实现
- STS模块
- LTS模块
- 训练序列模块
- 仿真波形
- 总结
前言
根据框图可以知道发射机这部分信号在DA转换之前,数据是两路,分别是实部和虚部8位信号。通过DA转换也是两路模拟信号,通过IQ调制搞到射频。
PPDU包括3部分数据,长短序列是不需要进行ofdm操作的,signal和data的信号需要进行ofdm操作,也就是下面图中扰码、卷积编码、交织等等的操作,最后通过ifft和cp加窗后进行输出,最后将实部信号与虚部信号与训练序列的实部和虚部按照位置分别发送。
一、短序列
子载波有效数量是52个,短序列只用到了其中的12个子载波,每个载波之间的间隔为4,位置序号是:
{-24,-20,-16,-12,-8,-4, 4,8,12,16,20,24},直流分量不能使用。又因为短序列采用的是BPSK模式,因此可以通过载波位置以及调制方式决定他的数据格式。确定[9:0] STS_IM[8] 和[9:0] STS_RE[8],就实现了短序列的产生,按照位置依次将实部序列和虚部序列信号发送即可。
因此短序列在频域上就是
% STS频域表示
S=[0,0,0,0,0,0,0,0,1+i,0,0,0,-1-i,0,0,0,1+i,0,0,0,-1-i,0,0,0,-1-i,0,0,0,1+i,0,0,0,0,0,0,0,-1-i,0,0,0,-1-i,0,0,0,1+i,0,0,0,1+i,0,0,0,1+i,0,0,0,1+i,0,0,0,0,0,0,0];
但是最终需要发出去的是时域信号,所以这个频域信号理论上是要经过ifft模块处理之后发送出去,但是因为短序列都是固定的数值,因此时序信号的实部和虚部也是固定的,所以短训练序列的产生也就是通过MATLAB将频域转换为时域后,将固定的时域信号的实部值和虚部值直接使用。短训练序列的数据格式,1位符号位,1位整数位,6位小数位。
从时域上看,每一个短序列是16个采样点,也就是总共10*16=160点。
短序列的作用
接收机进行分组检测、同步等
二、长序列
类似短序列,基本原理相同,各自作用不同。
三、PLCP/SIGNAL/DATA数据处理流程
训练序列直接按照时域产生实部信号和虚部信号,不需要进行ofdm调制。
SIGNAL信号和DATA信号需要从单比特流数据经过扰码、卷积编码、交织、符号调制、16QAM调制、导频插入、IFFT模块、CP加窗等步骤最后与训练序列组合发送到DAC进行射频端的处理。
三、fpga实现
STS模块
`timescale 1ns / 1ps
///
// Company:
// Engineer: YWang
//
// Create Date: 2023-03-10 14:53:45
// Design Name:
// Module Name: STS_generator.v
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies: 0
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
///
module STS_generator( input clk , input rst_n , input Tx_Clr , input Start_En ,output reg [7:0] STS_Im ,output reg [7:0] STS_Re ,output reg STS_Vld ,output reg [7:0] STS_Index ,output reg STS_Done
); reg [15:0] Short_Mem [15:0];reg [3:0] i,j;wire STS_Req;assign STS_Req = Start_En || (STS_Index>0);always @(posedge clk or negedge rst_n) beginif(~rst_n) begin Short_Mem[0] <= {8'b00001100,8'b00001100};Short_Mem[1] <= {8'b11011110,8'b00000001};Short_Mem[2] <= {8'b11111101,8'b11101100};Short_Mem[3] <= {8'b00100100,8'b11111101};Short_Mem[4] <= {8'b00011000,8'b00000000};Short_Mem[5] <= {8'b00100100,8'b11111101};Short_Mem[6] <= {8'b11111101,8'b11101100};Short_Mem[7] <= {8'b11011110,8'b00000001};Short_Mem[8] <= {8'b00001100,8'b00001100};Short_Mem[9] <= {8'b00000001,8'b11011110};Short_Mem[10] <= {8'b11101100,8'b11111101};Short_Mem[11] <= {8'b11111101,8'b00100100};Short_Mem[12] <= {8'b00000000,8'b00011000};Short_Mem[13] <= {8'b11111101,8'b00100100};Short_Mem[14] <= {8'b11101100,8'b11111101};Short_Mem[15] <= {8'b00000001,8'b11011110};STS_Vld <= 0;STS_Index <= 0;STS_Done <= 0;STS_Re <= 0;STS_Im <= 0;i <= 0;j <= 0;end else if( Tx_Clr ) begin i <= 0;j <= 0;STS_Vld <= 0;STS_Index <= 0;STS_Done <= 0;endelse if( STS_Req && (STS_Index<161) ) beginSTS_Index <= STS_Index + 1;STS_Vld <= 1'b1; if(i<10) beginif(j==15) begin j <= 0;i <= i+ 1; STS_Re <= Short_Mem[j][15:8]; STS_Im <= Short_Mem[j][7:0];endelse beginif(i==0 && j==0) beginSTS_Re <= Short_Mem[j][15:8]>>1; //鍔犵獥锛屽乏绉讳竴 STS_Im <= Short_Mem[j][7:0]>>1;//娉ㄦ剰锛歋hort_Mem銆�0銆戜负姝f暟endelse beginSTS_Re <= Short_Mem[j][15:8]; STS_Im <= Short_Mem[j][7:0];endj <= j + 1;endendelse begin //鏈�鍚庝竴浣�STS_Re <= Short_Mem[0][15:8]>>1; //鍔犵獥锛屽乏绉讳竴 绗竴涓��STS_Im <= Short_Mem[0][7:0]>>1; STS_Done <= 1'b1;endend else begin STS_Vld <= 1'b0;endendendmodule
LTS模块
`timescale 1ns / 1ps
///
// Company:
// Engineer: YWang
//
// Create Date: 2023-03-10 14:53:45
// Design Name:
// Module Name: LTS_generator.v
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies: 0
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
///
module LTS_generator( input clk , input rst_n , input Tx_Clr , input Start_En ,output reg [7:0] LTS_Im ,output reg [7:0] LTS_Re ,output reg LTS_Vld ,output reg [7:0] LTS_Index ,output reg LTS_Done
); reg [15:0] Long_Mem [63:0];reg [6:0] i,j;wire LTS_Req;assign LTS_Req = Start_En || (LTS_Index>0);always @(posedge clk or negedge rst_n) beginif(~rst_n) begin //鏃跺煙鏍峰�� Re ImLong_Mem[0] <= {8'b00101000 , 8'b00000000};Long_Mem[1] <= {8'b11111111 , 8'b11100001};Long_Mem[2] <= {8'b00001010 , 8'b11100100};Long_Mem[3] <= {8'b00011001 , 8'b00010101};Long_Mem[4] <= {8'b00000101 , 8'b00000111};Long_Mem[5] <= {8'b00001111 , 8'b11101010};Long_Mem[6] <= {8'b11100011 , 8'b11110010};Long_Mem[7] <= {8'b11110110 , 8'b11100101};Long_Mem[8] <= {8'b00011001 , 8'b11111001};Long_Mem[9] <= {8'b00001110 , 8'b00000001};Long_Mem[10] <= {8'b00000000 , 8'b11100011};Long_Mem[11] <= {8'b11011101 , 8'b11110100};Long_Mem[12] <= {8'b00000110 , 8'b11110001};Long_Mem[13] <= {8'b00001111 , 8'b11111100};Long_Mem[14] <= {8'b11111010 , 8'b00101001};Long_Mem[15] <= {8'b00011111 , 8'b11111111};Long_Mem[16] <= {8'b00010000 , 8'b11110000};Long_Mem[17] <= {8'b00001001 , 8'b00011001};Long_Mem[18] <= {8'b11110001 , 8'b00001010};Long_Mem[19] <= {8'b11011110 , 8'b00010001};Long_Mem[20] <= {8'b00010101 , 8'b00011000};Long_Mem[21] <= {8'b00010010 , 8'b00000100};Long_Mem[22] <= {8'b11110001 , 8'b00010101};Long_Mem[23] <= {8'b11110010 , 8'b11111010};Long_Mem[24] <= {8'b11110111 , 8'b11011001};Long_Mem[25] <= {8'b11100001 , 8'b11111100};Long_Mem[26] <= {8'b11011111 , 8'b11111011};Long_Mem[27] <= {8'b00010011 , 8'b11101101};Long_Mem[28] <= {8'b11111111 , 8'b00001110};Long_Mem[29] <= {8'b11101000 , 8'b00011101};Long_Mem[30] <= {8'b00010111 , 8'b00011011};Long_Mem[31] <= {8'b00000011 , 8'b00011001};Long_Mem[32] <= {8'b11011000 , 8'b00000000};Long_Mem[33] <= {8'b00000011 , 8'b11100111};Long_Mem[34] <= {8'b00010111 , 8'b11100101};Long_Mem[35] <= {8'b11101000 , 8'b11100011};Long_Mem[36] <= {8'b11111111 , 8'b11110010};Long_Mem[37] <= {8'b00010011 , 8'b00010011};Long_Mem[38] <= {8'b11011111 , 8'b00000101};Long_Mem[39] <= {8'b11100001 , 8'b00000100};Long_Mem[40] <= {8'b11110111 , 8'b00100111};Long_Mem[41] <= {8'b11110010 , 8'b00000110};Long_Mem[42] <= {8'b11110001 , 8'b11101011};Long_Mem[43] <= {8'b00010010 , 8'b11111100};Long_Mem[44] <= {8'b00010101 , 8'b11101000};Long_Mem[45] <= {8'b11011110 , 8'b11101111};Long_Mem[46] <= {8'b11110001 , 8'b11110110};Long_Mem[47] <= {8'b00001001 , 8'b11100111};Long_Mem[48] <= {8'b00010000 , 8'b00010000};Long_Mem[49] <= {8'b00011111 , 8'b00000001};Long_Mem[50] <= {8'b11111010 , 8'b11010111};Long_Mem[51] <= {8'b00001111 , 8'b00000100};Long_Mem[52] <= {8'b00000110 , 8'b00001111};Long_Mem[53] <= {8'b11011101 , 8'b00001100};Long_Mem[54] <= {8'b00000000 , 8'b00011101};Long_Mem[55] <= {8'b00001110 , 8'b11111111};Long_Mem[56] <= {8'b00011001 , 8'b00000111};Long_Mem[57] <= {8'b11110110 , 8'b00011011};Long_Mem[58] <= {8'b11100011 , 8'b00001110};Long_Mem[59] <= {8'b00001111 , 8'b00010110};Long_Mem[60] <= {8'b00000101 , 8'b11111001};Long_Mem[61] <= {8'b00011001 , 8'b11101011};Long_Mem[62] <= {8'b00001010 , 8'b00011100};Long_Mem[63] <= {8'b11111111 , 8'b00011111};LTS_Vld <= 0;LTS_Index <= 0;LTS_Done <= 0;LTS_Re <= 0;LTS_Im <= 0;i <= 0;j <= 0;end else if( Tx_Clr ) begin i <= 0;j <= 0;LTS_Vld <= 0;LTS_Index <= 0;LTS_Done <= 0;endelse if( LTS_Req && (LTS_Index<161) ) beginLTS_Index <= LTS_Index + 1;LTS_Vld <= 1'b1; if(i==0) beginif(j==31) begin j <= 0;i <= i+ 1; LTS_Re <= Long_Mem[j+32][15:8]; LTS_Im <= Long_Mem[j+32][7:0];endelse beginif(i==0 && j==0) beginLTS_Re <= 8'b11101100; //鐭缁冨簭鍒楀埌闀胯缁冨簭鍒楃殑绐楀彛鍑芥暟LTS_Im <= Long_Mem[j+32][7:0];endelse beginLTS_Re <= Long_Mem[j+32][15:8]; LTS_Im <= Long_Mem[j+32][7:0];endj <= j + 1;endendelse if( i==1 || i==2 ) beginif(j==63) begin j <= 0;i <= i+ 1; LTS_Re <= Long_Mem[j][15:8]; LTS_Im <= Long_Mem[j][7:0];endelse begin LTS_Re <= Long_Mem[j][15:8]; LTS_Im <= Long_Mem[j][7:0]; j <= j + 1;endendelse begin // 鍔犵獥澶勭悊LTS_Re <= Long_Mem[0][15:8]>>1; //鍔犵獥锛屽乏绉讳竴浣� LTS_Im <= Long_Mem[0][7:0]>>1; LTS_Done <= 1'b1;endend else begin LTS_Vld <= 1'b0;endendendmodule
训练序列模块
`timescale 1ns / 1ps
///
// Company:
// Engineer: YWang
//
// Create Date: 2023-03-10 14:22:41
// Design Name:
// Module Name: symbol_train.v
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies: 0
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:????????????????
//
///
module symbol_train( input clk , input rst_n , input Tx_Clr , input Start_En ,output [7:0] Train_Im ,output [7:0] Train_Re ,output Train_Vld ,output [8:0] Train_Index ,output Train_Done
); wire STS_Start_En;wire [7:0] STS_Im ;wire [7:0] STS_Re ;wire STS_Vld ;wire [7:0] STS_Index ;wire STS_Done ;wire LTS_Start_En;wire [7:0] LTS_Im ;wire [7:0] LTS_Re ;wire LTS_Vld ; wire [7:0] LTS_Index ;wire LTS_Done ;STS_generator u_STS(.clk (clk ),.rst_n (rst_n ),.Tx_Clr (Tx_Clr ),.Start_En (STS_Start_En ),.STS_Im (STS_Im ),.STS_Re (STS_Re ),.STS_Vld (STS_Vld ),.STS_Index (STS_Index ),.STS_Done (STS_Done ));LTS_generator u_LTS(.clk (clk ),.rst_n (rst_n ),.Tx_Clr (Tx_Clr ),.Start_En (LTS_Start_En ),.LTS_Im (LTS_Im ),.LTS_Re (LTS_Re ),.LTS_Vld (LTS_Vld ),.LTS_Index (LTS_Index ),.LTS_Done (LTS_Done ));assign Train_Im = STS_Vld ? STS_Im : LTS_Vld ? LTS_Im : 8'b0 ; assign Train_Re = STS_Vld ? STS_Re : LTS_Vld ? LTS_Re : 8'b0 ; assign Train_Vld = STS_Vld ? 1'b1 : LTS_Vld ? 1'b1 : 1'b0;assign Train_Index = STS_Index + LTS_Index;assign Train_Done = LTS_Done;assign STS_Start_En = Start_En;assign LTS_Start_En = STS_Done;endmodule
仿真波形
总结
训练序列的产生要明白:
频域上用了12个子载波,间隔为4,BPSK符号格式,功率因数1.4几来着?。
频域固定,因此时域实部和虚部也是固定,通过MATLAB就可以直接得到时域的训练序列的实部和虚部的数值,因此直接在程序中写死循环即可。
数据格式:1位符号,1位整数,6位小数
代码参考:基于FPGA的OFDM基带发射机的设计与实现
训练模块代码未做修改。
相关文章:

OFDM学习-(二)长短序列和PPDU整体数据处理流程
OFDM学习 (二)长短序列和PPDU整体数据处理流程 OFDM学习前言一、短序列短序列的作用 二、长序列三、PLCP/SIGNAL/DATA数据处理流程三、fpga实现STS模块LTS模块训练序列模块仿真波形 总结 前言 根据框图可以知道发射机这部分信号在DA转换之前,…...

.NET周刊【12月第4期 2024-12-22】
国内文章 dotnet 简单使用 ICU 库进行分词和分行 https://www.cnblogs.com/lindexi/p/18622917 本文将和大家介绍如何使用 ICU 库进行文本的分词和分行。 dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 https://www.cnblogs.com/lindexi/p/18621674 本文将和大…...

Conda 安装 Jupyter Notebook
文章目录 1. 安装 Conda下载与安装步骤: 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能(可选)6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具,尤其适合数据科学、机器…...

鸿蒙开发:实现键值数据库存储
前言 鸿蒙当中数据持久化存储,为我们提供了多种的实现方式,比如用户首选项方式,关系型数据库方式,键值型数据库方式,文件存储方式等等,对于数据量比较的小的,我们直接选择轻量级的用户首选项方式…...

WebGL 实践(一)开发环境搭建
WebGL 是一种基于 JavaScript 的 API,用于在浏览器中渲染 2D和3D 图形,很多场景都能用,例如游戏开发、数据可视化、在线教育和虚拟现实等应用领域。 零、基础知识 相关基础知识很重要,如果会html、JavaScript等技术掌握起来会更…...

在线机考|2024华为实习秋招春招编程题(最新)——第3题_PCB印刷电路板布线_300分(八)
题目内容 在PCB印刷电路板设计中,器件之间的连线需要避免线路的阻抗值增大、而且赛件之间还有别的器件和别的干扰源,在布线时我们希望受到的干扰尽量小。现将电路板简化成一个MN的矩阵,每个位置(单元格)的值表示其源干扰度。 如果单元格的值为0,表示此位置没有干扰源;如果单…...

Spring源码分析之事件机制——观察者模式(三)
目录 自定义事件 事件监听器 事件发布者(服务层) 使用示例controller层 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二)-CSDN博客 这两篇文章是这…...

C#实现画图,及实现图像运动,C#中GDI+图形图像技术(Graphics类、Pen类、Brush类)C#之快速入门GDI+绘图 C#实现快速画图功能
下载源码 <-------- 在C#的世界里,GDI如同一位多才多艺的艺术家,以其强大的绘图能力,让开发者能够轻松地在应用程序中挥洒创意,绘制出丰富多彩的图形世界。GDI不仅支持基本的几何图形绘制,还能处理复杂的图像处理任…...

【51单片机零基础-chapter6:LCD1602调试工具】
实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…...

算法题(24):只出现一次的数字(二)
审题: 数组中除了答案元素只出现一次外,其他元素都会出现三次,我们需要找到并返回答案元素 思路: 由于现在会出现三次,所以利用异或运算符的方法就会失效。而所有数据都在32位二进制范围内,所以我们采用依次…...

趣味编程:心形曲线
目录 1.序言 2.代码展示 3.代码详解 3.1 头文件包含 3.2 绘制坐标轴函数 3.3 main 函数主体部分 4. 小结 1.序言 2025年的第一篇博客就用这个笛卡尔心形图开篇吧,寓意着新年大家能够有心有所属,祝诸位程序猿 / 程序媛 能够早点遇到自己的另一半。…...

C# 设计模式(结构型模式):享元模式
C# 设计模式(结构型模式):享元模式 (Flyweight Pattern) 在软件开发中,尤其是在处理大量对象时,我们常常会面临内存和性能上的挑战。当多个对象具有相似的状态时,通常会占用大量的内存资源,从而…...

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

mysql 死锁案例及简略分析
准备数据 # 创一个测试表,存储引擎使用 innodb create table test_lock (id int primary key auto_increment,name varchar(20),age int )engine innodb;insert into test_lock (name,age) values (ionc001,10); insert into test_lock (name,age) values (ionc00…...

第四届计算机、人工智能与控制工程
第四届计算机、人工智能与控制工程 The 4th International Conference on Computer, Artificial Intelligence and Control Engineering 重要信息 大会官网:www.ic-caice.net 大会时间:2025年1月10-12日 大会地点:中国合肥 (安徽大学磬苑…...

RIP配置实验
RIP配置实验 案例简介 天一公司下属三个分公司,属于不同的地区,三个公司之间用路由器连接,路由器名称分别为分别为 Router0、Router1、Router2,请把一公司的部门pc0,通过二公司路由器,连接三公司的部门pc1,公司之间通…...

C# 整型、浮点型 数值范围原理分析
总目录 前言 一、整型、浮点型 数值范围列表 二、什么是大小、范围 在上面的列表中,每个数据类型都有自己的Range (范围) 和 Size (大小)。 1. 范围 范围好理解,就是对应数据类型的数据范围,如 sbtyte 的数据范围是 -128~127,超…...

Adobe Acrobat Pro DC 2023 下载安装教程,附详细图文
简介: Adobe Acrobat Pro DC 2023 是由 Adobe 公司推出的一款全面的 PDF 编辑、查看和管理软件。这款软件无论是个人用户还是企业级用户,都可以凭借其强大的功能满足不同的需求。作为一款业内领先的 PDF 处理工具,Adobe Acrobat Pro DC 不仅…...

stable diffusion秋叶启动器安装roop插件
方法简洁明了: 第一步:下载秋叶启动器 第二步:输入网址:https://visualstudio.microsoft.com/zh-hans/downloads/,下载vs安装程序,安装开始会自动弹出如下窗口,选择2个环境:Python开…...

7-14 统计工龄
给定公司多名员工的工龄,按输入工龄顺序输出每个工龄段有多少员工。 输入格式: 给出多个整数,即每个员工的工龄,范围在[0, 50]。 输出格式: 按输入工龄顺序输出每个工龄的员工个数,格式为:“工龄:人数”。 每项占一…...

OLED的显示
一、I2C I2C时序:时钟线SCL高电平下:SDA由高变低代表启动信号,开始发送数据;SCL高电平时,数据稳定,数据可以被读走,开始进行读操作,SCL低电平时,数据发生改变࿱…...

本地测试文件解析
PostMapping("/test") public void test() throws IOException {Path csvFile Paths.get("D:\\test/27.csv");//虚拟机退出时删除临时文件csvFile.toFile().deleteOnExit();List<String> list Files.readAllLines(csvFile, Charset.forName("…...

Elasticsearch JavaRestClient版
文章目录 初始化RestHighLeveClient(必要条件)索引库操作1.创建索引库(4步)2.删除索引库(3步)3.判断索引库是否存在(3步)4.总结:四步走 文档操作1.创建文档(4…...

ubuntu 使用s3fs配置自动挂载对象存储
一、环境准备 1.有访问对象存储权限的AKSK 2.服务器、对象存储 二、实施步骤 sudo apt update sudo apt install s3fs echo "AK:SK" >/home/ubuntu/.passwd-s3fs ---位置自定义 chmod 600 /home/ubuntu/.passwd-s3fs ---权限必须要有 mkdir /data sudo s3fs …...

SQL字符串截取函数——Left()、Right()、Substring()用法详解
SQL字符串截取函数——Left()、Right()、Substring()用法详解 1. LEFT() 函数:从字符串的左侧提取指定长度的子字符串。 LEFT(string, length)string:要操作的字符串。length&#x…...

关系分类(RC)模型和关系抽取(RE)模型的区别
目标不同 关系分类模型:对给定的实体对在给定句子中预测其关系类型。两阶段(RC) 关系抽取模型:从句子中识别出所有潜在实体对,并为其预测关系类型。一阶段(NERRE) 训练/预测阶段输入输出数据不…...

什么是索引
在数据库管理系统中,索引是一种数据结构,用于快速定位数据库表中的特定记录。索引类似于一本书的目录,可以帮助数据库引擎迅速找到所需的数据,而不必扫描整个表。 类型:常见的数据库索引类型包括B树索引、哈希索引、全…...

OJ随机链表的复制题目分析
题目内容: 138. 随机链表的复制 - 力扣(LeetCode) 分析: 这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析…...

UE5材质节点Distance
Distance可以计算两个物体间的距离,可以用来做过渡效果 当相机和物体距离3000的时候,就会渐渐从蓝过渡到红色,除以500是为了平滑过渡...

OSPF - SPF算法简述
SPF全称最短路径树算法,相信学过数据结构朋友应该看起来很熟悉 在一个区域内的路由器都会产生描述自己网络连接信息的LSA,包括两种信息,有路由信息和拓扑信息,简单的来说拓扑信息就是我连着谁,路由信息就是链路的地址…...