《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》
《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-5G通信速成:MATLAB毫米波信道建模仿真指南 🚀📡
大家好!今天我将带大家进入5G通信的奇妙世界,我们一起探索5G通信中最激动人心的部分之一——毫米波信道建模!本文将从基础概念讲起,带你一步步用MATLAB2016b实现完整的毫米波信道仿真。准备好你的MATLAB,让我们开始这段技术之旅吧!🚀
1. 为什么选择毫米波?🌊
1.1 为什么毫米波如此重要?
毫米波(30-300GHz)是5G通信的关键技术之一,它能提供超大带宽(想想Gb/s的速率!),超低延迟,是未来VR/AR、自动驾驶等应用的基石。
有趣的事实:毫米波之所以叫"毫米"波,是因为它的波长在1-10毫米之间,比传统微波(厘米级)短得多!📏
1.2 毫米波信道的特点
5G网络之所以能提供超高速率和超低时延,很大程度上得益于毫米波(mmWave)技术的应用。毫米波通常指30GHz至300GHz频段的电磁波,具有以下特点:
- 超大带宽:可提供高达2GHz的连续带宽
- 超高速率:理论速率可达10Gbps以上
- 极小时延:空口时延可低至1ms
- 小型天线:毫米波波长短,天线尺寸小
不过,毫米波也面临一些挑战:
- 传播损耗大:氧气吸收、雨衰等影响显著,特定频段(如60GHz)受氧气吸收影响
- 穿透能力差:信号衰减快,容易被建筑物、人体等阻挡
- 覆盖范围小:需要密集部署小基站
- 方向性传输:不同于传统信道的丰富散射,需要波束成形
2. 毫米波信道建模基础 📚
在开始编码前,我们需要了解一些基本概念:
2.1 信道冲激响应 (Channel Impulse Response)
毫米波信道可以表示为:
h ( t , τ ) = ∑ α n ( t ) δ ( τ − τ n ( t ) ) h(t,\tau) = \sum \alpha_n(t) \delta(\tau - \tau_n(t)) h(t,τ)=∑αn(t)δ(τ−τn(t))
其中αₙ是第n条路径的复增益,τₙ是时延。
2.2 毫米波信道特性
- 空间选择性:由于使用大规模MIMO,信道具有明显的空间特性
- 时间选择性:用户移动导致信道时变
- 频率选择性:宽带信号在不同频段经历不同衰落
2.3 常用的信道模型
- 3GPP TR 38.901模型:标准化模型,适合系统级仿真
- NYUSIM模型:纽约大学开发的基于测量的模型
- 射线追踪模型:基于几何光学原理,精度高但计算复杂
3. MATLAB实现步骤 🛠️
现在让我们动手实现一个简化的毫米波信道模型!我们将基于3GPP TR 38.901的室内办公室(Indoor Office)场景。
3.1 环境设置
首先,我们需要设置仿真参数:
clear all; close all; clc;% 基本参数设置
fc = 28e9; % 载波频率28GHz
BW = 100e6; % 系统带宽100MHz
Ts = 1/BW; % 采样间隔
c = 3e8; % 光速
lambda = c/fc; % 波长% 天线配置
Nt = 8; % 发射天线数
Nr = 8; % 接收天线数
antennaSpacing = lambda/2; % 天线间距% 场景参数
roomSize = [20, 20, 3]; % 房间尺寸(长,宽,高)m
txPos = [2, 2, 1.5]; % 发射机位置
rxPos = [18, 18, 1.5]; % 接收机位置
3.2 生成信道系数
接下来,我们实现一个简化的空间信道模型:
function [h, tau, AoD, AoA] = generateMmWaveChannel(Nt, Nr, fc, txPos, rxPos, roomSize)% 生成毫米波信道系数% 输入:% Nt - 发射天线数% Nr - 接收天线数% fc - 载波频率(Hz)% txPos - 发射机位置[x,y,z]% rxPos - 接收机位置[x,y,z]% roomSize - 房间尺寸[x,y,z]% 输出:% h - 信道冲激响应% tau - 路径时延% AoD - 离开角(方位角,仰角)% AoA - 到达角(方位角,仰角)c = 3e8; % 光速lambda = c/fc; % 波长% 1. 计算直射路径(LOS)d_los = norm(txPos - rxPos);tau_los = d_los / c;% 2. 生成反射路径(NLOS) - 这里简化为4条反射路径numReflections = 4;tau_nlos = zeros(1, numReflections);for i = 1:numReflections% 简化的反射路径计算reflectPoint = roomSize .* rand(1,3); % 随机反射点d_nlos = norm(txPos - reflectPoint) + norm(reflectPoint - rxPos);tau_nlos(i) = d_nlos / c;end% 合并所有路径时延tau = [tau_los, tau_nlos];[tau, idx] = sort(tau); % 按时延排序% 3. 生成路径增益(简化模型)PL_los = freeSpacePathLoss(fc, d_los); % 自由空间路径损耗alpha_los = (randn(1) + 1i*randn(1)) / sqrt(2) * 10^(-PL_los/20);alpha_nlos = zeros(1, numReflections);for i = 1:numReflectionsd = tau_nlos(i) * c;PL_nlos = freeSpacePathLoss(fc, d) + 10; % NLOS比LOS多10dB损耗alpha_nlos(i) = (randn(1) + 1i*randn(1)) / sqrt(2) * 10^(-PL_nlos/20);endalpha = [alpha_los, alpha_nlos];alpha = alpha(idx); % 按时延排序增益% 4. 生成角度信息(简化)AoD = zeros(2, length(tau)); % 每列是一个路径的[方位角;仰角]AoA = zeros(2, length(tau));% LOS路径角度[az_los, el_los] = computeAngles(txPos, rxPos);AoD(:,1) = [az_los; el_los];AoA(:,1) = [-az_los; -el_los];% NLOS路径角度for i = 2:length(tau)AoD(:,i) = [rand()*2*pi-pi; rand()*pi-pi/2]; % 随机角度AoA(:,i) = [rand()*2*pi-pi; rand()*pi-pi/2];end% 5. 构建MIMO信道矩阵h = zeros(Nr, Nt, length(tau));for p = 1:length(tau)% 发射端阵列响应向量a_t = getArrayResponse(AoD(:,p), Nt, lambda);% 接收端阵列响应向量a_r = getArrayResponse(AoA(:,p), Nr, lambda);h(:,:,p) = alpha(p) * (a_r * a_t');end
endfunction PL = freeSpacePathLoss(fc, d)% 自由空间路径损耗计算lambda = 3e8/fc;PL = 20*log10(4*pi*d/lambda);
endfunction [az, el] = computeAngles(txPos, rxPos)% 计算从tx到rx的方位角和仰角vec = rxPos - txPos;az = atan2(vec(2), vec(1));el = atan2(vec(3), sqrt(vec(1)^2 + vec(2)^2));
endfunction a = getArrayResponse(angle, N, lambda)% 生成阵列响应向量% angle: [方位角; 仰角]% N: 天线数% lambda: 波长az = angle(1); % 方位角el = angle(2); % 仰角d = lambda/2; % 天线间距positions = (0:N-1)*d;% 阵列响应向量a = exp(-1i*2*pi*positions'*sin(az)*cos(el)/lambda);a = a / sqrt(N); % 归一化
end
3.3 信道可视化
现在让我们可视化生成的信道:
% 生成信道
[h, tau, AoD, AoA] = generateMmWaveChannel(Nt, Nr, fc, txPos, rxPos, roomSize);% 绘制功率时延谱
figure;
powers = squeeze(sum(sum(abs(h).^2, 1), 2));
stem(tau*1e9, 10*log10(powers), 'filled');
xlabel('时延 (ns)');
ylabel('功率 (dB)');
title('功率时延谱 (PDP)');
grid on;% 绘制角度谱
figure;
subplot(1,2,1);
polarscatter(AoD(1,:), AoD(2,:), 50, 'filled');
title('发射端角度谱 (AoD)');subplot(1,2,2);
polarscatter(AoA(1,:), AoA(2,:), 50, 'filled');
title('接收端角度谱 (AoA)');% 绘制信道矩阵幅度
figure;
H = sum(h, 3); % 对所有路径求和
imagesc(abs(H));
colorbar;
xlabel('发射天线');
ylabel('接收天线');
title('MIMO信道矩阵幅度');
4. 完整仿真示例 📊
让我们把这些整合成一个完整的仿真示例,包括移动性建模和信道时变性:
% 5G毫米波信道建模完整示例 - MATLAB 2016b兼容版本
clear all; close all; clc;%% 1. 参数设置
fc = 28e9; % 载波频率28GHz
BW = 100e6; % 系统带宽100MHz
Ts = 1/BW; % 采样间隔
c = 3e8; % 光速
lambda = c/fc; % 波长% 天线配置
Nt = 8; % 发射天线数
Nr = 8; % 接收天线数
antennaSpacing = lambda/2; % 天线间距% 场景参数
roomSize = [20, 20, 3]; % 房间尺寸(长,宽,高)m
txPos = [2, 2, 1.5]; % 发射机位置
rxSpeed = 1; % 接收机移动速度 m/s
rxDirection = [1, 1, 0]; % 接收机移动方向
rxDirection = rxDirection/norm(rxDirection); % 归一化% 仿真参数
numSnapshots = 100; % 快拍数
snapshotInterval = 0.01; % 快拍间隔(s)%% 2. 信道仿真循环
H = zeros(Nr, Nt, numSnapshots); % 存储每个时刻的信道矩阵
rxPositions = zeros(3, numSnapshots); % 存储接收机位置rxPos = 0;
for t = 1:numSnapshots% 更新接收机位置rxPos = rxPos + rxSpeed * rxDirection * snapshotInterval;rxPositions(:,t) = rxPos;% 确保接收机在房间内rxPos = max([0.5, 0.5, 1], min(roomSize-[0.5,0.5,1], rxPos));% 生成信道[h, tau, AoD, AoA] = generateMmWaveChannel(Nt, Nr, fc, txPos, rxPos, roomSize);% 存储信道矩阵(对所有路径求和)H(:,:,t) = sum(h, 3);
end%% 3. 结果可视化
% 3.1 接收机轨迹
figure;
plot3(rxPositions(1,:), rxPositions(2,:), rxPositions(3,:), 'b-o');
hold on;
plot3(txPos(1), txPos(2), txPos(3), 'rp', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)');
title('收发机位置和移动轨迹');
legend('接收机轨迹', '发射机位置');
grid on; axis equal;% 3.2 信道容量随时间变化
SNR_dB = 20; % 假设信噪比
capacity = zeros(1, numSnapshots);
for t = 1:numSnapshots% 计算信道容量sigma2 = 1/(10^(SNR_dB/10)); % 噪声功率capacity(t) = log2(det(eye(Nr) + (1/sigma2)*H(:,:,t)*H(:,:,t)'));
endfigure;
plot((1:numSnapshots)*snapshotInterval, capacity, 'LineWidth', 2);
xlabel('时间 (s)');
ylabel('信道容量 (bps/Hz)');
title('毫米波MIMO信道容量随时间变化');
grid on;% 3.3 最后一个快拍的信道矩阵幅度和相位
figure;
subplot(1,2,1);
imagesc(abs(H(:,:,end)));
colorbar;
xlabel('发射天线');
ylabel('接收天线');
title('信道矩阵幅度');subplot(1,2,2);
imagesc(angle(H(:,:,end)));
colorbar;
xlabel('发射天线');
ylabel('接收天线');
title('信道矩阵相位');
5. 进阶扩展 🚀
现在你已经掌握了基本的毫米波信道建模方法,可以尝试以下扩展:
5.1 加入更真实的路径损耗模型
function PL = mmWavePathLoss(fc, d, scenario)% 3GPP TR 38.901路径损耗模型% scenario: 'UMi' (城市微蜂窝), 'UMa' (城市宏蜂窝), 'InH' (室内热点)c = 3e8;lambda = c/fc;switch scenariocase 'UMi'% 城市微蜂窝场景if d <= 18PL = 32.4 + 21*log10(d) + 20*log10(fc/1e9);elsePL = 32.4 + 40*log10(d) + 20*log10(fc/1e9) ...- 9.5*log10(18^2 + (txPos(3)-rxPos(3))^2);endcase 'InH'% 室内热点场景PL = 32.4 + 17.3*log10(d) + 20*log10(fc/1e9) ...+ 0.5*d*randn(); % 加入随机阴影衰落otherwise% 默认使用自由空间路径损耗PL = 20*log10(4*pi*d/lambda);end
end
5.2 加入空间一致性
在移动场景中,相邻时刻的信道应该具有相关性。我们可以通过以下方式实现:
% 在信道生成函数中加入空间一致性
function [h, tau, AoD, AoA] = generateMmWaveChannelWithSC(...)% 参数与之前相同,但加入空间一致性persistent last_AoD last_AoA last_tau;if isempty(last_AoD)% 第一次调用,随机生成[h, tau, AoD, AoA] = generateMmWaveChannel(...);else% 基于上次结果生成,加入小扰动AoD = last_AoD + 0.1*randn(size(last_AoD));AoA = last_AoA + 0.1*randn(size(last_AoA));tau = last_tau + 1e-9*randn(size(last_tau));% 重新生成信道系数h = zeros(Nr, Nt, length(tau));for p = 1:length(tau)a_t = getArrayResponse(AoD(:,p), Nt, lambda);a_r = getArrayResponse(AoA(:,p), Nr, lambda);h(:,:,p) = alpha(p) * (a_r * a_t');endend% 保存当前状态last_AoD = AoD;last_AoA = AoA;last_tau = tau;
end
6. 完整代码整合 📜
以下是完整可运行的MATLAB 2016b兼容代码:
% 5G毫米波信道建模完整仿真 - MATLAB 2016b兼容
function mmWaveChannelModeling()%% 主函数clear all; close all; clc;%% 1. 参数设置fc = 28e9; % 载波频率28GHzBW = 100e6; % 系统带宽100MHzTs = 1/BW; % 采样间隔c = 3e8; % 光速lambda = c/fc; % 波长% 天线配置Nt = 8; % 发射天线数Nr = 8; % 接收天线数antennaSpacing = lambda/2; % 天线间距% 场景参数roomSize = [20, 20, 3]; % 房间尺寸(长,宽,高)mtxPos = [2, 2, 1.5]; % 发射机位置rxSpeed = 1; % 接收机移动速度 m/srxDirection = [1, 1, 0]; % 接收机移动方向rxDirection = rxDirection/norm(rxDirection); % 归一化% 仿真参数numSnapshots = 100; % 快拍数snapshotInterval = 0.01; % 快拍间隔(s)%% 2. 信道仿真循环H = zeros(Nr, Nt, numSnapshots); % 存储每个时刻的信道矩阵rxPositions = zeros(3, numSnapshots); % 存储接收机位置rxPos = 0;for t = 1:numSnapshots% 更新接收机位置rxPos = rxPos + rxSpeed * rxDirection * snapshotInterval;rxPositions(:,t) = rxPos;% 确保接收机在房间内rxPos = max([0.5, 0.5, 1], min(roomSize-[0.5,0.5,1], rxPos));% 生成信道[h, tau, AoD, AoA] = generateMmWaveChannel(Nt, Nr, fc, txPos, rxPos, roomSize);% 存储信道矩阵(对所有路径求和)H(:,:,t) = sum(h, 3);end%% 3. 结果可视化% 3.1 接收机轨迹figure;plot3(rxPositions(1,:), rxPositions(2,:), rxPositions(3,:), 'b-o');hold on;plot3(txPos(1), txPos(2), txPos(3), 'rp', 'MarkerSize', 10, 'MarkerFaceColor', 'r');xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)');title('收发机位置和移动轨迹');legend('接收机轨迹', '发射机位置');grid on; axis equal;% 3.2 信道容量随时间变化SNR_dB = 20; % 假设信噪比capacity = zeros(1, numSnapshots);for t = 1:numSnapshots% 计算信道容量sigma2 = 1/(10^(SNR_dB/10)); % 噪声功率capacity(t) = log2(det(eye(Nr) + (1/sigma2)*H(:,:,t)*H(:,:,t)'));endfigure;plot((1:numSnapshots)*snapshotInterval, capacity, 'LineWidth', 2);xlabel('时间 (s)');ylabel('信道容量 (bps/Hz)');title('毫米波MIMO信道容量随时间变化');grid on;% 3.3 最后一个快拍的信道矩阵幅度和相位figure;subplot(1,2,1);imagesc(abs(H(:,:,end)));colorbar;xlabel('发射天线');ylabel('接收天线');title('信道矩阵幅度');subplot(1,2,2);imagesc(angle(H(:,:,end)));colorbar;xlabel('发射天线');ylabel('接收天线');title('信道矩阵相位');
end%% 信道生成函数
function [h, tau, AoD, AoA] = generateMmWaveChannel(Nt, Nr, fc, txPos, rxPos, roomSize)c = 3e8; % 光速lambda = c/fc; % 波长% 1. 计算直射路径(LOS)d_los = norm(txPos - rxPos);tau_los = d_los / c;% 2. 生成反射路径(NLOS) - 这里简化为4条反射路径numReflections = 4;tau_nlos = zeros(1, numReflections);for i = 1:numReflections% 简化的反射路径计算reflectPoint = roomSize .* rand(1,3); % 随机反射点d_nlos = norm(txPos - reflectPoint) + norm(reflectPoint - rxPos);tau_nlos(i) = d_nlos / c;end% 合并所有路径时延tau = [tau_los, tau_nlos];[tau, idx] = sort(tau); % 按时延排序% 3. 生成路径增益(简化模型)PL_los = freeSpacePathLoss(fc, d_los); % 自由空间路径损耗alpha_los = (randn(1) + 1i*randn(1)) / sqrt(2) * 10^(-PL_los/20);alpha_nlos = zeros(1, numReflections);for i = 1:numReflectionsd = tau_nlos(i) * c;PL_nlos = freeSpacePathLoss(fc, d) + 10; % NLOS比LOS多10dB损耗alpha_nlos(i) = (randn(1) + 1i*randn(1)) / sqrt(2) * 10^(-PL_nlos/20);endalpha = [alpha_los, alpha_nlos];alpha = alpha(idx); % 按时延排序增益% 4. 生成角度信息(简化)AoD = zeros(2, length(tau)); % 每列是一个路径的[方位角;仰角]AoA = zeros(2, length(tau));% LOS路径角度[az_los, el_los] = computeAngles(txPos, rxPos);AoD(:,1) = [az_los; el_los];AoA(:,1) = [-az_los; -el_los];% NLOS路径角度for i = 2:length(tau)AoD(:,i) = [rand()*2*pi-pi; rand()*pi-pi/2]; % 随机角度AoA(:,i) = [rand()*2*pi-pi; rand()*pi-pi/2];end% 5. 构建MIMO信道矩阵h = zeros(Nr, Nt, length(tau));for p = 1:length(tau)% 发射端阵列响应向量a_t = getArrayResponse(AoD(:,p), Nt, lambda);% 接收端阵列响应向量a_r = getArrayResponse(AoA(:,p), Nr, lambda);h(:,:,p) = alpha(p) * (a_r * a_t');end
end%% 辅助函数
function PL = freeSpacePathLoss(fc, d)% 自由空间路径损耗计算lambda = 3e8/fc;PL = 20*log10(4*pi*d/lambda);
endfunction [az, el] = computeAngles(txPos, rxPos)% 计算从tx到rx的方位角和仰角vec = rxPos - txPos;az = atan2(vec(2), vec(1));el = atan2(vec(3), sqrt(vec(1)^2 + vec(2)^2));
endfunction a = getArrayResponse(angle, N, lambda)% 生成阵列响应向量% angle: [方位角; 仰角]% N: 天线数% lambda: 波长az = angle(1); % 方位角el = angle(2); % 仰角d = lambda/2; % 天线间距positions = (0:N-1)*d;% 阵列响应向量a = exp(-1i*2*pi*positions'*sin(az)*cos(el)/lambda);a = a / sqrt(N); % 归一化
end
7. 总结与展望 🎯
通过本教程,我们实现了一个简化的毫米波MIMO信道模型,包括:
- 多径效应建模:考虑了LOS和NLOS路径
- 空间特性建模:使用阵列响应向量捕捉空间特性
- 时变特性:模拟了移动场景下的信道变化
- 可视化分析:功率时延谱、角度谱、信道矩阵等
要进一步改进模型,可以考虑:
- 加入更精确的3GPP信道模型
- 实现更复杂的空间一致性模型
- 考虑极化效应和天线方向图
- 加入阻塞(blockage)效应建模
希望这篇教程能帮助你快速入门5G毫米波信道建模!如果有任何问题,欢迎留言讨论。Happy coding! 🚀👨💻
相关文章:

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》
《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-5G通信速成:MATLAB毫米波信道建模仿真指南 🚀📡 大家好!今天我将带大家进入5G通信的奇妙世界,我们一起探索5G通信中最激动人心的部分之一——毫米波信…...

工程师 - 汽车分类
欧洲和中国按字母对汽车分类: **轴距**:简单来说,就是前轮中心点到后轮中心点之间的距离,也就是前轮轴和后轮轴之间的长度。根据轴距的大小,国际上通常把轿车分为以下几类(德国大众汽车习惯用A\B\C\D分类&a…...

57.[前端开发-前端工程化]Day04-webpack插件模式-搭建本地服务器
Webpack常见的插件和模式 1 认识插件Plugin 认识Plugin 2 CleanWebpackPlugin CleanWebpackPlugin 3 HtmlWebpackPlugin HtmlWebpackPlugin 生成index.html分析 自定义HTML模板 自定义模板数据填充 4 DefinePlugin DefinePlugin的介绍 DefinePlugin的使用 5 mode模式配置…...

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析
一、金丝雀发布概述 1.1 什么是金丝雀发布? 金丝雀发布(Canary Release)是一种渐进式部署策略,通过逐步将生产流量从旧版本迁移至新版本,结合实时指标验证,在最小化风险的前提下完成版本迭代。其核心逻辑…...

Qt中数据结构使用自定义类————附带详细示例
文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较ÿ…...

数据可视化与分析
数据可视化的目的是为了数据分析,而非仅仅是数据的图形化展示。 项目介绍 项目案例为电商双11美妆数据分析,分析品牌销售量、性价比等。 数据集包括更新日期、ID、title、品牌名、克数容量、价格、销售数量、评论数量、店名等信息。 1、数据初步了解…...
基于大模型预测的产钳助产分娩全方位研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、产钳助产分娩概述 2.1 产钳助产定义与历史 2.2 适用情况与临床意义 三、大模型预测原理与数据基础 3.1 大模型技术原理 3.2 数据收集与处理 3.3 模型训练与验证 四、术前预测与准备 4.1 大模型术前风险预…...
通过混合机器学习和 TOPSIS 实现智能手机身份验证的稳健行为生物识别框架
1. 简介 随着日常工作、个人生活和金融操作对智能手机的依赖性不断增强,对弹性安全身份验证系统的需求也日益增长。尽管 PIN 码、密码和静态生物识别等传统身份验证方法仍可为系统提供一定的安全级别,但事实证明,它们容易受到多种威胁,包括敏感数据泄露、网络钓鱼、盗窃和…...

旅游设备生产企业的痛点 质检系统在旅游设备生产企业的应用
在旅游设备制造行业,产品质量直接关系到用户体验与企业口碑。从景区缆车、观光车到水上娱乐设施,每一件设备的安全性与可靠性都需经过严苛检测。然而,传统质检模式常面临数据分散、流程不透明、合规风险高等痛点,难以满足旅游设备…...

使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant
文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…...
【漫话机器学习系列】237. TSS总平方和
深度理解 TSS(总平方和):公式、意义与应用 在机器学习与统计建模领域,评价模型好坏的重要指标之一就是方差与误差分析。其中,TSS(Total Sum of Squares,总平方和)扮演着非常关键的角…...

DeepSeek多尺度数据:无监督与原则性诊断方案全解析
DeepSeek 多尺度数据诊断方案的重要性 在当今的 IT 领域,数据如同石油,是驱动各类智能应用发展的核心资源。随着技术的飞速发展,数据的规模和复杂性呈爆炸式增长,多尺度数据处理成为了众多领域面临的关键挑战。以计算机视觉为例,在目标检测任务中,小目标可能只有几个像素…...

Spring Framework 6:虚拟线程支持与性能增强
文章目录 引言一、虚拟线程支持:并发模型的革命二、AOT编译与原生镜像优化三、响应式编程与可观测性增强四、HTTP接口客户端与声明式HTTP五、性能比较与实际应用总结 引言 Spring Framework 6作为Spring生态系统的基础框架,随着Java 21的正式发布&#…...
用Redisson实现库存扣减的方法
Redisson是一个在Redis基础上实现的Java客户端,提供了许多高级功能,包括分布式锁、计数器、集合等。使用Redisson实现库存扣减可以保证操作的原子性和高效性。本文将详细介绍如何使用Redisson实现一个简单的库存扣减功能。 一、初始化Redisson客户端 首…...
视频转GIF
视频转GIF 以下是一个使用 Python 将视频转换为 GIF 的脚本,使用了 imageio 和 opencv-python 库: import cv2 import imageio import numpy as np """将视频转换为GIF图参数:video_path -- 输入视频的路径gif_path -- 输出GIF的路径fp…...

一场静悄悄的革命:AI大模型如何重构中国产业版图?
一场静悄悄的革命:AI大模型如何重构中国产业版图? 当ChatGPT在2022年掀起全球AI热潮时,很少有人意识到,这场技术变革正在中国产业界掀起更深层次的革命。在浙江宁波,一个纺织企业老板打开"产业链智能创新平台",30秒内就获得了原料采购、设备升级、海外拓客的全…...
kotlin 02flow-sharedFlow 完整教程
一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流(Hot Flow),用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件(如导航、弹窗、Toast、刷新通知等),而不是持续状态。 ✅ …...

CentOS网络之network和NetworkManager深度解析
文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段(CentOS 5-6)1.2 过渡期(CentOS 7)1.3 新时代(CentOS 8) 2. network和NetworkManager的核心区别3. ne…...
【AI】模型与权重的基本概念
在 ModelScope 平台上,「模型」和「权重」的定义与工程实践紧密结合,理解它们的区别需要从实际的文件结构和加载逻辑入手。以下是一个典型 ModelScope 模型仓库的组成及其概念解析: 1. ModelScope 模型仓库的典型结构 以 deepseek-ai/deepse…...
设计模式-基础概念学习总结(继承、多态、虚方法、方法重写)
概念使用例子的方式介绍(继承,多态,虚方法,方法重写),实现代码python 1. 继承(Inheritance) 概念:子类继承父类的属性和方法,可以直接复用父类的代码&#…...
2025年小程序DDoS与CC攻击防御全指南:构建智能安全生态
2025年,小程序已成为企业数字化转型的核心载体,但随之而来的DDoS与CC攻击也愈发复杂化、智能化。攻击者利用AI伪造用户行为、劫持物联网设备发起T级流量冲击,甚至通过漏洞窃取敏感数据。如何在高并发业务场景下保障小程序的稳定与安全&#x…...

当当狸智能天文望远镜 TW2 | 用科技触摸星辰,让探索触手可及
当科技邂逅星空,每个普通人都能成为宇宙的追光者 伽利略用望远镜揭开宇宙面纱的 400 年后,当当狸以颠覆传统的设计,让天文观测从专业领域走入千家万户。当当狸智能天文望远镜 TW2,重新定义「观星自由」—— 无需专业知识ÿ…...
QT实现曲线图缩放、拖拽以及框选放大
.h文件 protected: void saveAxisRange();void wheelEvent(QWheelEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;private:QPoint m_…...
C# | 基于C#实现的BDS NMEA-0183数据解析上位机
以下是一个基于C#实现的BDS NMEA-0183数据解析上位机的示例代码,包含基础功能和界面: using System; using System.Collections.Generic; using System.IO.Ports; using System.Windows.Forms; using System.Drawing; using System.Globalization;namespace BDS_NMEA_Viewer…...

科学发现 | 源于生活的启示与突破计划的创新
注:本文为“科学发现”相关文章合辑。 略作重排,未全整理。 哪些重大科学发现,来自生活的启示 ︱ 科学史 2020/10/29 导读 好奇心是最好的向导和老师。 撰文 | 陈敬全(东华大学人文学院教授) 英国进化论者赫胥黎…...

【ArcGIS微课1000例】0145:如何按照自定义形状裁剪数据框?
文章目录 一、添加数据二、绘制形状三、裁剪格网和经纬网一、添加数据 打开软件,添加配套实验数据包中0145.rar中的影像数据,如下图所示: 二、绘制形状 1. 在数据视图中,使用绘图 工具条上的新建圆工具 可创建一个椭圆,使其包含要在该数据框中显示的数据范围。 修改椭圆…...

网络安全防火墙技术有哪些?网络防火墙的主要作用
网络安全防火墙技术有哪些?网络防火墙的主要作用 网络安全防火墙技术是保护网络免受未经授权访问和攻击的关键工具。以下是常见的防火墙技术及其主要作用: 一、网络安全防火墙技术分类 包过滤防火墙(Packet Filtering Firewall) 原理&#x…...

数据集-目标检测系列- 印度人脸 检测数据集 indian face >> DataBall
数据集-目标检测系列- 印度人脸 检测数据集 indian face >> DataBall DataBall 助力快速掌握数据集的信息和使用方式。 贵在坚持! * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s…...

Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.
版本: 原因 在 Dart Sass 3.0.0 中, @import 规则将被弃用,推荐使用 @use 和 @forward 规则来替代。 1.@use替代@import @use 规则允许你引入其他 Sass 文件中的变量、混合器和函数,并且可以避免命名冲突。 示例: style.scss @use variables;body {color: variables.$pr…...
通过CIDR推出子网掩码和广播地址等
写在前面 不知道你遇到过这种面试题没,给你CIDR,让你推理子网掩码等信息。如果你不会,那本文刚好适合你。 1:一个面试题16.158.165.91/22 这个 CIDR。求一下这个网络的第一个地址、子网掩码和广播地址。 一般如果你对CIDR知识有…...