基于深度学习CsiNet-LSTM的信道状态反馈网络模型研究

该文章已生成可运行项目,

目录

1.CsiNet-LSTM模型原理

1.1 编码器——空间特征压缩

1.2 LSTM时间序列处理模型

1.3 解码器——CSI重构

2.CsiNet-LSTM网络模型的训练

3.matlab核心程序


       CsiNet-LSTM模型在CsiNet基础上引入长短期记忆网络(LSTM),通过融合空间特征与时间序列信息,提升动态信道下的反馈精度与鲁棒性。其核心思想是:利用编码器压缩当前CSI的空间特征,同时通过LSTM挖掘历史CSI的时间关联性,解码器结合空间压缩特征与时间依赖信息重构 CSI,实现低开销、高精度的动态信道反馈。

1.CsiNet-LSTM模型原理

       CsiNet-LSTM的整体架构分为编码器(Encoder)、LSTM时间序列处理器和解码器(Decoder)三部分,CsiNet-LSTM整体架构如下图所示:

具体原理如下:

空间特征提取与压缩(编码器)无线CSI通常以复数矩阵形式表示(如MIMO系统中的信道矩阵),包含丰富的空间域信息(如路径损耗、多径效应)。编码器通过卷积神经网络(CNN)提取CSI的空间特征,并将高维CSI矩阵压缩为低维反馈向量,降低传输开销。

时间依赖建模(LSTM模块)无线信道具有时间连续性(如车辆移动场景下的信道变化),历史CSI包含当前信道的演化趋势信息。LSTM模块通过记忆单元捕捉历史CSI的时间序列特征,生成时间关联向量,辅助当前CSI的重构。

CSI重构(解码器)解码器将编码器输出的空间压缩向量与LSTM输出的时间关联向量融合,通过反卷积操作重构高维CSI矩阵,实现高精度恢复。

1.1 编码器——空间特征压缩

编码器由3层卷积层(Conv)和1层全连接层(FC)组成,逐步提取空间特征并压缩维度:

第1卷积层

第2卷积层

第3卷积层

全连接压缩层

1.2 LSTM时间序列处理模型

LSTM模块输入历史T个时刻的压缩向量{zt−T​,…,zt−1​},输出当前时刻的时间关联向量ht​,具体计算如下:

遗忘门

输入门

细胞状态更新

输出门

1.3 解码器——CSI重构

解码器将编码器输出的zt​与LSTM输出的ht​融合,通过反卷积重构CSI:

特征融合

全连接扩展层

第1反卷积层

第2反卷积层

输出层

复数转换

2.CsiNet-LSTM网络模型的训练

采用均方误差(MSE)衡量重构CSI与原始CSI的差异:

其中N为训练样本数,∥⋅∥F​为Frobenius范数。

使用Adam优化器最小化损失函数,更新参数:

其中θ为模型所有参数(卷积核、偏置、LSTM权重等),η为学习率,∇θ​L为参数的梯度。

3.matlab核心程序

% 基于深度学习的CsiNet-LSTM信道状态反馈网络模型
% 适用场景:MIMO系统信道状态信息(CSI)压缩反馈
% 版本:MATLAB R2023a及以上(需Deep Learning Toolbox)

clear; clc; close all;
rng(0);  % 固定随机种子,保证结果可复现


%% 1. 数据准备与预处理
% 1.1 生成模拟CSI数据(实际应用中可替换为实测数据)
% 设定MIMO系统参数:Nr=32接收天线,Nt=32发射天线,采样点数=10000,时间序列长度=10
Nr = 32;         % 接收天线数
Nt = 32;         % 发射天线数
numSamples = 10000;  % 总样本数
timeSteps = 10;   % 时间序列长度(每个样本包含10个时间步的CSI)

% 生成复信道矩阵H:Nr×Nt×timeSteps×numSamples(复数)
% 模拟瑞利衰落信道,加入时间相关性(相邻时间步相关系数0.8)
H = zeros(Nr, Nt, timeSteps, numSamples);
for s = 1:numSamples
    % 初始时间步信道(瑞利分布)
    H(:, :, 1, s) = (randn(Nr, Nt) + 1i*randn(Nr, Nt))/sqrt(2);
    % 后续时间步(基于前一时间步添加高斯噪声,模拟时间相关性)
    for t = 2:timeSteps
        H(:, :, t, s) = 0.8*H(:, :, t-1, s) + 0.6*(randn(Nr, Nt) + 1i*randn(Nr, Nt))/sqrt(2);
    end
end

% 1.2 数据格式转换:复数→实值矩阵(实部+虚部拼接)
% 输入维度:(2*Nr)×Nt×timeSteps×numSamples(实值)
X = zeros(2*Nr, Nt, timeSteps, numSamples);
for s = 1:numSamples
    for t = 1:timeSteps
        X(:, :, t, s) = [real(H(:, :, t, s)); imag(H(:, :, t, s))];  % 实部在上,虚部在下
    end
end

% 1.3 归一化处理(按样本维度标准化)
X_mean = mean(X, 4);  % 计算均值(沿样本维度)
X_std = std(X, [], 4) + 1e-8;  % 计算标准差(加小值避免除零)
X_norm = (X - X_mean) ./ X_std;  % 归一化到N(0,1)

% 1.4 划分训练集、验证集、测试集(7:1:2)
trainIdx = 1:7000;
valIdx = 7001:8000;
testIdx = 8001:10000;

X_train = X_norm(:, :, :, trainIdx);
X_val = X_norm(:, :, :, valIdx);
X_test = X_norm(:, :, :, testIdx);

% 标签与输入相同(自编码器任务:重构输入)
Y_train = X_train;
Y_val = X_val;
Y_test = X_test;


%% 2. 模型构建:CsiNet-LSTM(编码器+LSTM时间处理器+解码器)
% 2.1 超参数设置
feedbackBits = 128;  % 反馈比特数(压缩向量长度)
lstmHiddenSize = 64; % LSTM隐藏层维度
numFilters = [32, 64, 128];  % 卷积层滤波器数量
filterSize = [3, 3, 3];      % 卷积核尺寸
stride = [1, 1, 1];          % 卷积步长

% 2.2 编码器(空间特征提取与压缩)
encoderInput = sequenceInputLayer([2*Nr, Nt, 1], 'Name', 'encoder_input');  % 输入层(含时间序列)

% 卷积层1:提取低级空间特征
conv1 = convolution2dLayer(filterSize(1), numFilters(1), ...
    'Stride', stride(1), 'Padding', 'same', 'Name', 'conv1');
relu1 = reluLayer('Name', 'relu1');

% 卷积层2:提取中级空间特征
conv2 = convolution2dLayer(filterSize(2), numFilters(2), ...
    'Stride', stride(2), 'Padding', 'same', 'Name', 'conv2');
relu2 = reluLayer('Name', 'relu2');

% 卷积层3:提取高级空间特征
conv3 = convolution2dLayer(filterSize(3), numFilters(3), ...
    'Stride', stride(3), 'Padding', 'same', 'Name', 'conv3');
relu3 = reluLayer('Name', 'relu3');

% 全连接层:压缩为反馈向量(长度=feedbackBits)
% 先计算卷积输出的扁平化维度
conv3OutputSize = [2*Nr, Nt, numFilters(3)];  % 卷积3输出尺寸(因Padding='same')
flattenSize = prod(conv3OutputSize);          % 扁平化后维度
fcCompress = fullyConnectedLayer(feedbackBits, 'Name', 'fc_compress');

% 编码器层序列
encoderLayers = [
    encoderInput
    conv1
    relu1
    conv2
    relu2
    conv3
    relu3
    flattenLayer('Name', 'flatten')  % 展平特征图
    fcCompress
];

% 2.3 LSTM时间序列处理器(建模时间相关性)
% LSTM层:输入为编码器输出的反馈向量序列
lstmLayer = lstmLayer(lstmHiddenSize, ...
    'OutputMode', 'sequence', ...  输出每个时间步的隐藏状态
    'Name', 'lstm_time');

% 2.4 解码器(融合时空特征并重构CSI)
% 全连接层:将融合特征扩展为卷积3输出尺寸
fcExpand = fullyConnectedLayer(flattenSize, 'Name', 'fc_expand');
reluExpand = reluLayer('Name', 'relu_expand');

% 重塑层:将向量恢复为卷积3输出的特征图形状
reshapeLayer = reshapeLayer(conv3OutputSize, 'Name', 'reshape');

% 反卷积层1:上采样特征
deconv1 = transposedConvolution2dLayer(filterSize(3), numFilters(2), ...
    'Stride', stride(3), 'Padding', 'same', 'Name', 'deconv1');
relu4 = reluLayer('Name', 'relu4');

% 反卷积层2:进一步上采样
deconv2 = transposedConvolution2dLayer(filterSize(2), numFilters(1), ...
    'Stride', stride(2), 'Padding', 'same', 'Name', 'deconv2');
relu5 = reluLayer('Name', 'relu5');

% 反卷积输出层:重构CSI(实值矩阵,维度=输入)
deconv3 = transposedConvolution2dLayer(filterSize(1), 1, ...
    'Stride', stride(1), 'Padding', 'same', 'Name', 'deconv3');
tanhLayer = tanhLayer('Name', 'tanh_output');  % 限制输出范围[-1,1]

% 解码器层序列(需先融合编码器输出与LSTM输出)
decoderLayers = [
    % 融合层:拼接当前时间步压缩向量与LSTM时间特征
    concatenationLayer(1, 2, 'Name', 'fusion')  % 沿特征维度拼接
    
    fcExpand
    reluExpand
    reshapeLayer
    deconv1
    relu4
    deconv2
    relu5
    deconv3
    tanhLayer
    regressionLayer('Name', 'output')  % 回归任务(重构误差)
];

% 2.5 构建完整模型(连接编码器、LSTM、解码器)
% 使用层图(layerGraph)实现复杂连接
lgraph = layerGraph(encoderLayers);

% 添加LSTM层(输入为编码器的压缩向量)
lgraph = addLayers(lgraph, lstmLayer);
lgraph = connectLayers(lgraph, 'fc_compress', 'lstm_time');

% 添加解码器层并连接
lgraph = addLayers(lgraph, decoderLayers);
% 融合层输入1:当前时间步压缩向量(编码器输出)
lgraph = connectLayers(lgraph, 'fc_compress', 'fusion/in1');
% 融合层输入2:LSTM输出的时间特征
lgraph = connectLayers(lgraph, 'lstm_time', 'fusion/in2');

% 显示模型结构
figure;
plot(lgraph);
title('CsiNet-LSTM模型结构');


%% 3. 模型训练
% 3.1 训练参数设置
options = trainingOptions('adam', ...
    'MaxEpochs', 50, ...                % 最大训练轮数
    'MiniBatchSize', 32, ...            % 批处理大小
    'InitialLearnRate', 1e-4, ...       % 初始学习率
    'LearnRateSchedule', 'piecewise', ...% 学习率调度
    'LearnRateDropFactor', 0.5, ...     % 学习率衰减因子
    'LearnRateDropPeriod', 10, ...      % 每10轮衰减一次
    'ValidationData', {X_val, Y_val}, ...% 验证集
    'ValidationFrequency', 50, ...      % 每50步验证一次
    'Plots', 'training-progress', ...   % 显示训练过程
    'Verbose', true, ...                % 显示训练日志
    'Shuffle', 'every-epoch', ...       % 每轮打乱数据
    'GPU', 'yes');                     % 使用GPU加速(若无GPU可改为'no')

% 3.2 训练模型
[trainedModel, trainInfo] = trainNetwork(X_train, Y_train, lgraph, options);


%% 4. 模型评估
% 4.1 在测试集上预测
Y_pred = predict(trainedModel, X_test);

% 4.2 反归一化(恢复原始尺度)
Y_pred_denorm = Y_pred .* X_std + X_mean;  % 预测值反归一化
Y_test_denorm = Y_test .* X_std + X_mean;  % 真实值反归一化

% 4.3 计算重构误差:归一化均方误差(NMSE)
% 转换为复数CSI矩阵
nmse = zeros(1, numel(testIdx));
for s = 1:numel(testIdx)
    for t = 1:timeSteps
        % 真实CSI(复数)
        H_true = Y_test_denorm(1:Nr, :, t, s) + 1i*Y_test_denorm(Nr+1:end, :, t, s);
        % 预测CSI(复数)
        H_pred = Y_pred_denorm(1:Nr, :, t, s) + 1i*Y_pred_denorm(Nr+1:end, :, t, s);
        % 计算NMSE(单位:dB)
        nmse(s) = 10*log10(norm(H_true - H_pred, 'fro')^2 / norm(H_true, 'fro')^2);
    end
end
meanNMSE = mean(nmse);
fprintf('测试集平均NMSE: %.2f dB\n', meanNMSE);

% 4.4 可视化部分结果(第1个测试样本的第5个时间步)
s_idx = 1;  % 样本索引
t_idx = 5;  % 时间步索引

% 真实CSI的幅度
H_true_abs = abs(Y_test_denorm(1:Nr, :, t_idx, s_idx) + 1i*Y_test_denorm(Nr+1:end, :, t_idx, s_idx));
% 预测CSI的幅度
H_pred_abs = abs(Y_pred_denorm(1:Nr, :, t_idx, s_idx) + 1i*Y_pred_denorm(Nr+1:end, :, t_idx, s_idx));

figure;
subplot(1,2,1);
imagesc(H_true_abs); colorbar; title('真实CSI幅度');
subplot(1,2,2);
imagesc(H_pred_abs); colorbar; title('重构CSI幅度');
suptitle(['样本' num2str(s_idx) ' 时间步' num2str(t_idx) ' (NMSE: ' sprintf('%.2f', nmse(s_idx)) ' dB)']);


%% 5. 模型保存
save('CsiNet_LSTM_Model.mat', 'trainedModel', 'X_mean', 'X_std', 'Nr', 'Nt');
fprintf('模型已保存至CsiNet_LSTM_Model.mat\n');

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值