2020全国人工智能大赛AI+无线通信 复赛算法分享

赛题说明

基于深度学习的无线通信接收机设计

赛题背景

当今 5G面临着在复杂无线环境中对接收信号进行高效检测的巨大挑战。由于无线信道的随机衰落、多径、干扰、环境噪声和通信接收机噪声等因素的影响,无线通信信号的检测变得非常困难。传统的信号相干检测方法对于日益复杂的无线通信场景存在信道知识获取困难和检测误码率高等诸多难题。无线通信中的信号检测问题可以等效处理为图像的分类识别问题,这是因为无线通信系统中的发送信号是发送端采用一定信号调制模式下产生的信号。换言之,它是来自于有限的信号集合, 在无线通信领域里的术语是信号星座图,由此无线通信信号的检测问题就转变为信号星座图的分类识别问题。 近年来,深度学习模型已被广泛应用于图像识别领域。通过对图像样本的收集、模型选择、模型和训练算法的改进,来达到图像的分类识别和目标检测的目的。该赛题面向真实无线通信场景需求,以大数据驱动为牵引,通过深度神经网络对于任意复杂函数的拟合和对于隐含特征的提取,来实现无线通信信号的实时高效检测。与传统无线通信接收机相比,基于深度学习的无线通信接收机在对抗复杂、难以建模的信道环境以及非线性干扰因素上具有显著优势。

图1 2x2 MIMO AI接收机链路图
2x2 MIMO AI接收机链路图

赛题任务

大赛将提供给选手面向真实无线通信场景的信道数据和相应的无线通信收发链路,鼓励参赛选手设计和利用深度学习模型对接收到的信号训练和检测(即分类识别),实现从接收信号中恢复发送信号,以此降低在不同场景下的信号检测比特误码率。

该赛题主要考察在每种无线通信场景信号检测的比特正确率。

数据简介

真实无线信道场景为典型城区街道, 工作频段为 1.85GHz,移动速度:1.5m/s; 采样间隔:1ms; 采样信道数据:Ns=320000 样本数(信道组数)

信道数据:从典型城区街道场景采集的数据,共 32 万个数据样本,每个样本包含了4x32个复数(对应2x2个信道,每个信道包含32点复数信道冲击响应)

通信链路:大赛提供MIMO-OFDM 通信仿真程序。发送端包含对发送比特X进行QAM调制、加入发送导频、IFFT、加入循环前缀Cyclic Prefix(可选,具体由z值设定,见大赛提供的仿真链路程序)、峰值裁剪Clipping(可选,具体由z值设定)。接收端对接收数据进行FFT得到Y。

训练数据:选手将信道数据和随机发送比特 X(选手自定义)输入无线通信链路中,在无线通信接收端得到信号 Y。如图2 (a),Y有两个时隙,分别为导频时隙(黑色圆圈)和数据时隙(白色圆圈),各占256子载波,其中导频时隙中在256子载波上均匀插入8个或32个导频Pilot,其余子载波位置置0(即不插入导频Pilot)。如图2 (b),仿真链路中输出的Y已经排成一列,顺序如下:天线1导频虚部1PQ、天线1导频实部1PI、天线1数据虚部1DQ、天线1数据实部1DI、天线2导频虚部2PQ、天线2导频实部2PI、天线2数据虚部2DQ、天线2数据实部2DI……

(a) 接收信号的时频格式
(a) 接收信号的时频格式
(b) 仿真链路输出Y的格式 图2 接收信号格式
(b) 仿真链路输出Y的格式 图2 接收信号格式

数据说明

大赛提供给选手如下数据集。
在这里插入图片描述

数据下载

所有所需文件均在以下压缩包中

download.zip

评测标准

最终得分= W 1 A C C 1 + W 2 A C C 2 W1ACC1+W2ACC2 W1ACC1+W2ACC2

其中 ACCi 对应第 i 场景下的比特正确率,计算如下:
在这里插入图片描述
其中, N为场景i下的传送送的总比特数,即100000*1024。
在这里插入图片描述

赛题分析

这道题涉及到MIMO-OFDM的技术。本赛题中,发射端每次发送两个OFDM符号,其中第一个是导频符号,第二个是数据符号,其中导频符号的发射信号在接收端是已知的,而数据符号的发射信号在接收端是未知的。由于无线通信到的衰落和干扰,信号在接收端已经发生了畸变,可以表示成 Y k = H k X k + n k Y_{k}=H_kX_{k}+n_k Yk=HkXk+nk ,其中 k k k表示第 k k k个子载波, n k n_k nk表示加性高斯白噪声。

信道估计:信道状态信息 H k H_k Hk可以通过导频符号获取,对于导频符号来说, H k H_k Hk是未知的是我们要求取的目标, X k X_{k} Xk是已知的固定的信号, Y k Y_{k} Yk在接收端可以获取,我们则可以通过 Y k Y_{k} Yk X k X_{k} Xk估计出信道状态信息 H ^ k \hat H_k H^k

信道均衡与解调:如果能够获取信道矩阵 H k H_k Hk,就可以通过接收端接收到的 Y k Y_{k} Yk估计出发射信号 X ^ k \hat X_{k} X^k,这个过程称作为信道均衡,最后在进行判决解调获取比特流信息。

可能被坑的细节:发射端有两根天线,两根天线插入导频的位置是不一样的,以插入32导频为例,总共有256个子载波因此每个8个子载波插一个导频。天线1的插入导频位置是0,8,16…;天线2的插入导频位置是4,12,20,…,两根天线的导频位置错开了半个导频间距,这就保证了在一根天线发送导频的子载波位置另一根天线是不发送导频的,因此两根天线的导频是正交互不干扰的,在做信道估计时要注意到这一点。

赛题难点

数据在mode1和mode2下是没有循环前缀的,会造成载波间干扰,采用传统方法难以消除这种干扰。

题目给出的数据有两种插入导频的模式,一种是32导频,而另一种则是8导频。在OFDM中我们通常需要保证均匀插入导频的数量大于等于信道时延长度才能满足奈奎斯特采样定律能够较好地恢复信道。然而题目中给定的信道最大时延长度为32,8导频显然小于32,采用传统的算法我们是很难恢复出原始的信道的。

由于信道估计的精度有很大的损失,我们的信道均衡与信号解调地精度也会受到很大的影响。

传统算法的思路

信道估计:可以直接采用LS估计获得导频位置处的信道,随后采用DFT插值获得完整的估计信道,这里需要注意的是天线2的导频位置是和天线1错开的。在做DFT插值时,我们会首先将导频位置频域信号IFFT到时域然后做补零操作补零补到最终插完值后的长度,对于天线2由于频域位置错开,遵循频移定理我们需要对变换到时域后的信号每个时域点额外乘上一个相位。以32导频为例,天线2错开了4个导频位置,因此变换到时域时需要额外做一个变换。对于天线1发射导频时任意一个接收天线变换到时域可以表示为DFT变换 x ( n ) = 1 32 ∑ k = 0 32 X ( k ) e j 2 π n k 32 x(n)=\frac{1}{32} \sum_{k=0}^{32}X(k)e^{\frac{j2\pi nk}{32}} x(n)=321k=032X(k)e32j2πnk,对于天线2应用频移性质得到 x ( n ) = 1 32 ∑ k = 0 32 X ( k ) e j 2 π n k 32 e j π n 32 x(n)=\frac{1}{32} \sum_{k=0}^{32}X(k)e^{\frac{j2\pi nk}{32}}e^{\frac{j\pi n}{32}} x(n)=321k=032X(k)e32j2πnke32jπn

信道均衡:可以采用ZF均衡 X ^ k = p i n v ( H k ) X k {\hat X}_{k}={\rm pinv}(H_k)X_{k} X^k=pinv(Hk)Xk,pinv( ⋅ \cdot )表示矩阵求伪逆。此外由于信噪比大致为10dB,因此也可以采用LMMSE信道均衡 X ^ k = H H ( H H H + σ n 2 I M ) − 1 X k {\hat X}_{k}=H^{\rm H}(HH^{\rm H}+\sigma_n^2I_M)^{-1}X_{k} X^k=HH(HHH+σn2IM)1Xk,其中 σ n 2 \sigma_n^2 σn2表示每根接收天线的噪声功率,我们假设了每个发射天线的功率为1。

信号解调:可以信道均衡之后采用硬判决进行解调。

最大似然解调:最大似然解调不需要进行信道均衡,最大似然解调要求我们最优化一个目标 X ~ k , M L = a r g m i n ∥ Y k − H k X k ∥ {\tilde X}_{k,{\rm ML}}=argmin \left \| Y_k-H_k X_k \right \| X~k,ML=argminYkHkXk,我们遍历所有包含在QPSK星座图中的可能的 X k X_k Xk寻找最优的估计值,这种方法在已知信道的情况下是最优的,但是显然我们做不到完美的恢复信道,因此应用最大似然解调也难以得到较好的结果。

复赛算法分享

由于导频的数量受到限制,因此直接信道估计后进行最大似然解调是难以获得较号的结果的,因此我们考虑一种端到端的算法,不进行显式的信道估计而是进行隐式的信道估计,直接采用端到端的方式直接利用神经网络,获得最终的比特流信息。

预分类网络

首先生成大量mode 0,1,2均匀分布的样本信道,以mode作为标签,以接收导频为输入进行分类预测,采用DNN训练,准确率对于32导频本地验证集可达0.98,而8导频可达0.9。网络结构采用普通DNN。随后对给定的测试测试集数据中的导频进行分类预测,可以观察到绝大多数样本mode都为0,因此我们在下一步对信号解调网络进行训练时训练集全部采用mode0。

端到端信号解调网络

输入输出

采用端到端训练方案,神经网络的输入为接受信号Y(包含导频符号和数据符号),输出为解调后的估计信号 X ^ {\hat X} X^,其中对于输入的导频部分我们做了一些处理,只保留了插入导频子载波位置的接收信号,对于32导频的就是每8个子载波插入一个导频,由于错开半个导频间隔的位置,因此在接收端每隔4个子载波提取一个导频,其他位置视作噪声丢弃可以减少无用噪声的影响。

网络结构

将输入的接收信号 Y Y Y拆分成两部分,第一部分为导频信号 Y p ∈ R 1 × 2 P × 4 Y_p \in \mathbb{R}^{1\times 2P\times 4} YpR1×2P×4,第二个为数据信号 Y d ∈ R 1 × N c × 4 Y_d \in \mathbb{R}^{1\times N_c\times 4} YdR1×Nc×4,导频信号 Y p Y_p Yp首先展开经过一次dense层维度增大一倍并重构成维度为 1 × N c × 16 1\times N_c \times 16 1×Nc×16的数据流,可以将其看作是初步隐式的信道估计,随后采用补零的维度不变的卷积残差网络进一步细化我们的隐式估计信道,为了之后的神经网络模拟信道均衡与解调的过程因此将这个数据流看作是非显示的估计信道并且为了能提供更多信息比真实频域信道扩大一倍,真实信道维度应为 1 × N c × 8 1\times N_c \times 8 1×Nc×8分别为 2 × 2 2\times 2 2×2MIMO和实部虚部表示成的8个通道,这里我们将维度扩大到了16通道是为了获取更多的信息。卷积残差块的表示如图所示,可以理解成经过多次维度不变的卷积学习出输入的噪声,并用输入与学习出的噪声相减以进一步精精细化输入的信道:在这里插入图片描述

然后将此数据流与数据信号在第三个维度即通道维度拼接,其中数据信道的维度为 1 × N c × 4 1\times N_c \times 4 1×Nc×4分别表示天线1和天线2接收到的实部数据和虚部数据,将其与先前隐式估计的信道拼接维度变为 1 × N c × 20 1\times N_c \times 20 1×Nc×20并经过一次卷积将通道数扩大以获取更多的特征。随后并经过第二个卷积残差网络,最后再经过一次卷积层将输出通道数缩小为4,最后的输出维度就变成了 1 × N c × 4 1\times N_c \times 4 1×Nc×4表示每个子载波上要传输的四个比特符号,最后经过sigmoid激活函数并判决即为输出的预测比特流,将其按照天线与子载波与调制顺序的关系重新排列成长度为1024的比特流。

P_8 =8 * 2
pilotCarriers_8 = np.arange(0, K, K // P_8)
pilotCarriers_8 = tf.cast(pilotCarriers_8, dtype=tf.int32)
def MyModel_8(x):
    ini = x + 0
    #x_ini = layers.Reshape((1, 256, 8))(x)
    Y_pilot = x[:,0,:,0:4]
    #将导频符号中非导频位置的噪声干扰去除
    Y_pilot= tf.gather(Y_pilot,pilotCarriers_8,axis=1)
    x = layers.Flatten()(Y_pilot)
    x = layers.Dense(4096, activation='linear')(x)
    x = layers.BatchNormalization()(x)
    x = Mish(x)
    x_ini = layers.Reshape((1, 256, 16))(x)
    for i in range(1):
        x = layers.Conv2D(32, (1,7), padding = 'SAME', activation='linear')(x_ini)
        x = layers.BatchNormalization()(x)
        #x = layers.LeakyReLU()(x)
        x = Mish(x)
        x = layers.Conv2D(64,(1,7), padding = 'SAME',activation="linear")(x)
        x = layers.BatchNormalization()(x)
        #x = layers.LeakyReLU()(x)
        x = Mish(x)
        x = layers.Conv2D(16, (1,7), padding = 'SAME',activation="linear")(x)
        x = layers.BatchNormalization()(x)
        x = channel_attention(x)
        x_ini = keras.layers.Add()([x_ini, x])
        #x_ini = layers.LeakyReLU()(x_ini)
        x_ini = Mish(x_ini)
    
    x_ini = tf.concat([x_ini,ini[:,:,:,4:8]],3)
    x_ini = layers.Conv2D(256, (1,7), padding = 'SAME', activation='linear')(x_ini)
    x_ini = layers.BatchNormalization()(x_ini)
    #x = layers.LeakyReLU()(x)
    x_ini = Mish(x_ini)
    for i in range(6):
        x = layers.Conv2D(512, (1,7), padding = 'SAME', activation='linear')(x_ini)
        x = layers.BatchNormalization()(x)
        #x = layers.LeakyReLU()(x)
        x = Mish(x)
        x = layers.Conv2D(1024,(1,7), padding = 'SAME',activation="linear")(x)
        x = layers.BatchNormalization()(x)
        #x = layers.LeakyReLU()(x)
        x = Mish(x)
        x = layers.Conv2D(256, (1,7), padding = 'SAME',activation="linear")(x)
        x = layers.BatchNormalization()(x)
        x = channel_attention(x)
        x_ini = keras.layers.Add()([x_ini, x])
        #x_ini = layers.LeakyReLU()(x_ini)
        x_ini = Mish(x_ini)
    x = layers.Conv2D(4, (1,7), padding = 'SAME',activation="sigmoid")(x_ini)
    x = tf.concat([x[:,:,:,0:2],x[:,:,:,2:4]],2)
    x = layers.Flatten()(x)
    return x

网络中总共有两大块卷积残差网络,第一块是为了隐式估计信道,第二块是为了解调数据考虑子载波间的相关性,其中第二块对于通道采用channel_attention机制。

训练过程

直接用生成器,并用H.bin文件的320000个信道不断生成训练数据进行训练。并用H _ \_ _val.bin的信道作为生成验证集的信道进行验证不断保存验证集精度最高的模型。

参数设置

第一个残差块维度较小,分别为16,32,64层以精细化隐式估计信道。第二个残差块为了解调数据维度较大,每个残差块内有3个卷积层,输出通道数分别为512,1024,256。两组残差块卷积核大小都为 1 × 7 1\times 7 1×7,相当于一维卷积,padding采用`same’。采用Adam优化器进行优化。每30个epoches学习率 × 0.7 , b a t c h _ s i z e \times 0.7 ,{ batch\_ size} ×0.7batch_size=128。

分集与最大似然合并

我们采用相似的网络参数进行多次训练,训练出多个性能与结构相似但是独立的网络,采用多个网络对接收信号进行解调,得到多个数据流。这些独立的数据流承载着相同的信息,可以看成是一种信号的分集,我们可以利用分集增益提升我们的性能。这里我们采用最大似然合并来处理这些数据流,即对于每个比特的判决根据该位置上0和1出现在各个数据流的次数的多少来判决为1或者为0.

github分享

https://github.com/wuminghui123/AI_com_semifinal
已通过主办方审核,改成public了,可以下载

  • 15
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值