《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

news2025/5/9 20:09:48

《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 常用的信道模型

  1. 3GPP TR 38.901模型:标准化模型,适合系统级仿真
  2. NYUSIM模型:纽约大学开发的基于测量的模型
  3. 射线追踪模型:基于几何光学原理,精度高但计算复杂

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:numReflections
        d = 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);
    end
    
    alpha = [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);
end

function [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));
end

function 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)'));
end

figure;
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 scenario
        case 'UMi'
            % 城市微蜂窝场景
            if d <= 18
                PL = 32.4 + 21*log10(d) + 20*log10(fc/1e9);
            else
                PL = 32.4 + 40*log10(d) + 20*log10(fc/1e9) ...
                    - 9.5*log10(18^2 + (txPos(3)-rxPos(3))^2);
            end
        case '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');
        end
    end
    
    % 保存当前状态
    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;          % 载波频率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)'));
    end
    
    figure;
    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:numReflections
        d = 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);
    end
    
    alpha = [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);
end

function [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));
end

function 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信道模型,包括:

  1. 多径效应建模:考虑了LOS和NLOS路径
  2. 空间特性建模:使用阵列响应向量捕捉空间特性
  3. 时变特性:模拟了移动场景下的信道变化
  4. 可视化分析:功率时延谱、角度谱、信道矩阵等

要进一步改进模型,可以考虑:

  • 加入更精确的3GPP信道模型
  • 实现更复杂的空间一致性模型
  • 考虑极化效应和天线方向图
  • 加入阻塞(blockage)效应建模

希望这篇教程能帮助你快速入门5G毫米波信道建模!如果有任何问题,欢迎留言讨论。Happy coding! 🚀👨‍💻

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

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

相关文章

工程师 - 汽车分类

欧洲和中国按字母对汽车分类&#xff1a; **轴距**&#xff1a;简单来说&#xff0c;就是前轮中心点到后轮中心点之间的距离&#xff0c;也就是前轮轴和后轮轴之间的长度。根据轴距的大小&#xff0c;国际上通常把轿车分为以下几类&#xff08;德国大众汽车习惯用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 什么是金丝雀发布&#xff1f; 金丝雀发布&#xff08;Canary Release&#xff09;是一种渐进式部署策略&#xff0c;通过逐步将生产流量从旧版本迁移至新版本&#xff0c;结合实时指标验证&#xff0c;在最小化风险的前提下完成版本迭代。其核心逻辑…

Qt中数据结构使用自定义类————附带详细示例

文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较&#xff…

数据可视化与分析

数据可视化的目的是为了数据分析&#xff0c;而非仅仅是数据的图形化展示。 项目介绍 项目案例为电商双11美妆数据分析&#xff0c;分析品牌销售量、性价比等。 数据集包括更新日期、ID、title、品牌名、克数容量、价格、销售数量、评论数量、店名等信息。 1、数据初步了解…

旅游设备生产企业的痛点 质检系统在旅游设备生产企业的应用

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

使用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&#xff08;总平方和&#xff09;&#xff1a;公式、意义与应用 在机器学习与统计建模领域&#xff0c;评价模型好坏的重要指标之一就是方差与误差分析。其中&#xff0c;TSS&#xff08;Total Sum of Squares&#xff0c;总平方和&#xff09;扮演着非常关键的角…

DeepSeek多尺度数据:无监督与原则性诊断方案全解析

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

Spring Framework 6:虚拟线程支持与性能增强

文章目录 引言一、虚拟线程支持&#xff1a;并发模型的革命二、AOT编译与原生镜像优化三、响应式编程与可观测性增强四、HTTP接口客户端与声明式HTTP五、性能比较与实际应用总结 引言 Spring Framework 6作为Spring生态系统的基础框架&#xff0c;随着Java 21的正式发布&#…

一场静悄悄的革命:AI大模型如何重构中国产业版图?

一场静悄悄的革命:AI大模型如何重构中国产业版图? 当ChatGPT在2022年掀起全球AI热潮时,很少有人意识到,这场技术变革正在中国产业界掀起更深层次的革命。在浙江宁波,一个纺织企业老板打开"产业链智能创新平台",30秒内就获得了原料采购、设备升级、海外拓客的全…

CentOS网络之network和NetworkManager深度解析

文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段&#xff08;CentOS 5-6&#xff09;1.2 过渡期&#xff08;CentOS 7&#xff09;1.3 新时代&#xff08;CentOS 8&#xff09; 2. network和NetworkManager的核心区别3. ne…

当当狸智能天文望远镜 TW2 | 用科技触摸星辰,让探索触手可及

当科技邂逅星空&#xff0c;每个普通人都能成为宇宙的追光者 伽利略用望远镜揭开宇宙面纱的 400 年后&#xff0c;当当狸以颠覆传统的设计&#xff0c;让天文观测从专业领域走入千家万户。当当狸智能天文望远镜 TW2&#xff0c;重新定义「观星自由」—— 无需专业知识&#xff…

科学发现 | 源于生活的启示与突破计划的创新

注&#xff1a;本文为“科学发现”相关文章合辑。 略作重排&#xff0c;未全整理。 哪些重大科学发现&#xff0c;来自生活的启示 ︱ 科学史 2020/10/29 导读 好奇心是最好的向导和老师。 撰文 | 陈敬全&#xff08;东华大学人文学院教授&#xff09; 英国进化论者赫胥黎…

【ArcGIS微课1000例】0145:如何按照自定义形状裁剪数据框?

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

网络安全防火墙技术有哪些?网络防火墙的主要作用

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

数据集-目标检测系列- 印度人脸 检测数据集 indian face >> DataBall

数据集-目标检测系列- 印度人脸 检测数据集 indian face >> DataBall DataBall 助力快速掌握数据集的信息和使用方式。 贵在坚持&#xff01; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;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…

【工具教程】批量提取PDF指定内容并重命名,PDF文档根据指定识别文字改名,基于java的实现方案

物流单据处理​​&#xff1a;每天处理大量发货单PDF&#xff0c;提取订单编号、发货方信息等关键字段重命名文件 合同管理​​&#xff1a;从合同PDF中提取合同编号、签署方名称等作为文件名 ​​学术论文整理​​&#xff1a;根据论文标题或作者信息重命名PDF文件 财务票据…

苍穹外卖(用户下单、订单支付)

用户下单、订单支付 导入地址簿功能代码 接口设计 数据库设计&#xff08;address_book表&#xff09; 代码导入 功能测试 用户下单 接口设计 数据库设计 订单表 orders 订单明细表 order_detail 代码开发 根据用户下单接口的参数设计DTO 根据用户下单接口的…