基于深度学习CsiNet的信道状态反馈网络模型研究
目录
1.CsiNet网络模型
CsiNet通过深度学习能显著提升CSI重建质量,即便在低压缩率下,也能保留足够信息以获得有效的波束成形增益。CsiNet模型中,用户侧接收空频域信道矩阵后,借助二维离散傅里叶变换(DFT)得到截断矩阵,随后通过编码器生成压缩码字s;之后码字s经反馈链路传输至基站,基站接收码字s后,利用译码器重建角度时延域的信道矩阵;最终,通过逆离散傅里叶变换(IDFT)获取空频域的恢复信道矩阵。
CsiNet模型的基本结构如下图所示:

从上述的CsiNet网络模型中可以看到CsiNet采用卷积神经网络作为编码器和译码器。卷积神经网络能够在相邻层的神经元之间,建立空间局部特征的连接,以此来挖掘覆盖范围内元素之间的关联性。
编码器
CsiNet的编码器不像压缩感知算法那样使用随机投影,而是通过训练数据的学习,将原始信道矩阵转换成压缩表示 (码字)。因此,该算法不依赖于人类对信道分布的已有知识,而是直接从训练数据中学习如何有效利用信道结构。
编码器的输入为生成的截断矩阵H ,由于H是复数矩阵,所以将其拆分为实部和虚部两层作为输入。编码器的第一层是卷积层,使用尺寸为3×3的核生成两个特征图。
译码器
CsiNet的译码器是通过学习,实现将码字重建为原始信道矩阵的逆变换。与压缩感知所需要的迭代算法相比,CsiNet的逆变换是不需要迭代的,因此比迭代算法快几个数量级,时间复杂度远小于压缩感知的时间复杂度。
译码器的第一层是全连接层,把接收到的M维码字s作为输入,输出两个维度为Nc×Nt的矩阵,作为H实部和虚部的初始估计值。之后将初始估计值输入RefineNet,这些单元持续优化重建的信道矩阵。每个RefineNet由4层CNN组成。在RefineNet单元中,第一层是输入层,剩下的3层均使用3×3的核来生成特征图。第二层和第三层分别生成8个和16个特征图。第四层的特征图数量与信道矩阵H的层数相同,并且通过适当的补零,使每一层的尺寸都保持为Nc×Nt的矩阵。
在RefineNet单元中,引入了直接将数据流传递到后续层的快捷连接,即把第一层的数据与最后一层的数据相加后再输出,该方法的灵感来自深度残差网络 ,它避免了因多次叠加非线性激励函数而导致的梯度消失问题。
2.CsiNet网络模型应用举例
假设大规模MIMO系统,假设Nc=32,Nt=32,压缩后码字维度M=256,编码器、译码器及 RefineNet的参数如下:
编码器输入为复数信道矩阵H∈C32×32,拆分为实部和虚部两层,因此输入维度为2×32×32。
卷积层参数
核尺寸:3×3
输入通道数:2(实部+虚部)
输出通道数:2(生成2个特征图)
特征图尺寸:32×32(无步幅、补零保持尺寸)
参数数量:3×3×2×2+2=38(权重3×3×2×2+偏置2)
维度调整与全连接层参数
卷积层输出特征图总元素数:2×32×32=2048
全连接层输入维度:2048
全连接层输出维度(码字s):M=256
参数数量:2048×256+256=524,544(权重2048×256+ 偏置256)
译码器以码字s∈R256为输入,逐步重建信道矩阵。
全连接层参数
输入维度:256
输出维度:2×32×32=2048(对应H实部和虚部的初始估计)
参数数量:256×2048+2048=526,592(权重256×2048+偏置2048)
RefineNet单元参数
第一层(输入层):维度为2×32×32(无参数,仅传递初始估计)。
第二层
核尺寸:3×3输入通道数:2
输出通道数:8特征图尺寸:32×32(补零保持尺寸)
参数数量:3×3×2×8+8=152(权重 + 偏置)。
第三层
核尺寸:3×3
输入通道数:8
输出通道数:16
特征图尺寸:32×32(补零保持尺寸)
参数数量:3×3×8×16+16=1,168(权重 + 偏置)。
第四层
核尺寸:3×3
输入通道数:16
输出通道数:2(与输入通道数一致,对应H的实部和虚部)
特征图尺寸:32×32(补零保持尺寸)
参数数量:3×3×16×2+2=290(权重 + 偏置)。
最后一层CNN参数
若采用2层RefineNet 单元,最终将信道矩阵输入最后一层CNN:
核尺寸:3×3
输入通道数:2
输出通道数:2
特征图尺寸:32×32
参数数量:3×3×2×2+2=38(权重 + 偏置),后接 Sigmoid 激活函数将输出缩放到[0,1]。
3.CsiNet网络模型的训练
训练CsiNet,对编码器和译码器的所有核与偏差进行端到端学习,训练参数集记为Θ={Θen,Θde}。当输入信道矩阵为Hi时,第i个重建信道矩阵可表示为:
![]()
与自编码器类似,CsiNet属于无监督学习算法,其训练参数由 ADAM 算法优化,损失函数采用均方误差,计算方式为:

4.MATLAB仿真实例
clear; clc; close all;
%% 1. 参数设置
% 信道参数(大规模MIMO场景)
Nt = 32; % 发射天线数
Nr = 32; % 接收天线数
M = 256; % 压缩码字维度(反馈开销)
num_refine = 2; % RefineNet单元数量
batch_size = 128; % 批处理大小
epochs = 50; % 训练轮数
lr = 1e-4; % 学习率
% 数据集参数(假设已生成复数信道矩阵数据集)
data_path = './csi_dataset.mat'; % 数据集路径(需自行准备)
load(data_path); % 加载数据集,假设包含:
% - train_H: 训练集复数信道矩阵 (Nt×Nr×num_train)
% - test_H: 测试集复数信道矩阵 (Nt×Nr×num_test)
%% 2. 数据预处理
% 将复数信道矩阵拆分为实部和虚部(输入格式:实部+虚部,维度:2×Nt×Nr)
[train_input, test_input] = preprocess_data(train_H, test_H, Nt, Nr);
%% 3. 构建CsiNet网络
net = build_CsiNet(Nt, Nr, M, num_refine);
%% 4. 网络训练
% 定义训练选项
options = trainingOptions('adam', ...
'MaxEpochs', epochs, ...
'MiniBatchSize', batch_size, ...
'InitialLearnRate', lr, ...
'Shuffle', 'every-epoch', ...
'ValidationData', {test_input, test_input}, ... % 无监督学习:输入=标签
'ValidationFrequency', 100, ...
'Verbose', true, ...
'Plots', 'training-progress');
% 训练网络
trained_net = trainNetwork(train_input, train_input, net, options);
%% 5. 测试与性能评估
% 重建测试集信道
recon_test = predict(trained_net, test_input);
% 计算均方误差(MSE)和归一化均方误差(NMSE)
[mse_val, nmse_val] = calculate_metrics(recon_test, test_input, Nt, Nr);
fprintf('测试集NMSE: %.4f dB\n', nmse_val);
% 可视化重建结果(随机选一个样本)
sample_idx = randi(size(test_input,4));
visualize_results(test_input(:,:,:,sample_idx), recon_test(:,:,:,sample_idx), Nt, Nr);
子函数如下:
%% 子函数:构建CsiNet网络
function net = build_CsiNet(Nt, Nr, M, num_refine)
% 输入层:实部+虚部(2通道,尺寸Nt×Nr)
input_layer = imageInputLayer([Nt, Nr, 2], 'Name', 'input');
%% 编码器
% 卷积层:3×3核,2个特征图
conv1 = convolution2dLayer(3, 2, 'Padding', 1, 'Name', 'conv1');
batch1 = batchNormalizationLayer('Name', 'batch1');
relu1 = reluLayer('Name', 'relu1');
% 展平特征图,全连接层生成码字s
flatten = flattenLayer('Name', 'flatten');
fc1 = fullyConnectedLayer(M, 'Name', 'fc_encoder'); % 输出维度M(码字)
%% 译码器
% 全连接层:将码字映射回初始估计(实部+虚部,尺寸Nt×Nr×2)
fc2 = fullyConnectedLayer(2*Nt*Nr, 'Name', 'fc_decoder'); % 2*Nt*Nr = 实部+虚部
reshape1 = reshapeLayer([Nt, Nr, 2], 'Name', 'reshape_initial'); % 恢复空间维度
batch2 = batchNormalizationLayer('Name', 'batch2');
% 堆叠RefineNet单元
layers = [input_layer; conv1; batch1; relu1; flatten; fc1; fc2; reshape1; batch2];
for i = 1:num_refine
[refine_layers, layer_names] = refine_net_unit(i, Nt, Nr);
layers = [layers; refine_layers];
end
% 最后一层CNN:输出与输入同维度(实部+虚部),Sigmoid激活
final_conv = convolution2dLayer(3, 2, 'Padding', 1, 'Name', 'final_conv');
sigmoid = sigmoidLayer('Name', 'sigmoid_output'); % 缩放至[0,1]
layers = [layers; final_conv; sigmoid];
% 构建网络
net = layerGraph(layers);
% 添加RefineNet单元的快捷连接(残差连接)
for i = 1:num_refine
input_name = ['refine_', num2str(i), '_input'];
output_name = ['refine_', num2str(i), '_output'];
net = addLayers(net, additionLayer(2, 'Name', ['add_', num2str(i)]));
net = connectLayers(net, input_name, ['add_', num2str(i), '/in1']);
net = connectLayers(net, ['refine_', num2str(i), '_conv4'], ['add_', num2str(i), '/in2']);
net = connectLayers(net, ['add_', num2str(i)], output_name);
end
end
%% 子函数:定义RefineNet单元
function [refine_layers, layer_names] = refine_net_unit(idx, Nt, Nr)
prefix = ['refine_', num2str(idx), '_'];
layer_names.input = [prefix, 'input'];
layer_names.output = [prefix, 'output'];
% RefineNet单元结构:4层CNN + 快捷连接
refine_layers = [
% 输入层(占位,实际由前层连接)
convolution2dLayer(1, 2, 'Padding', 0, 'Name', layer_names.input); % 仅作为连接节点
% 第二层:3×3核,8个特征图
convolution2dLayer(3, 8, 'Padding', 1, 'Name', [prefix, 'conv2']);
batchNormalizationLayer('Name', [prefix, 'batch2']);
reluLayer('Name', [prefix, 'relu2']);
% 第三层:3×3核,16个特征图
convolution2dLayer(3, 16, 'Padding', 1, 'Name', [prefix, 'conv3']);
batchNormalizationLayer('Name', [prefix, 'batch3']);
reluLayer('Name', [prefix, 'relu3']);
% 第四层:3×3核,2个特征图(与输入通道一致)
convolution2dLayer(3, 2, 'Padding', 1, 'Name', [prefix, 'conv4']);
batchNormalizationLayer('Name', [prefix, 'batch4']);
];
end
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)