RML2016.10a数据集读取和处理

目录

  • 一、RadioML2016.10a数据集介绍
  • 二、读取方式
    • 2.1读取数据
    • 2.2打印数据
  • 三、原作者处理方式及代码
    • 调制识别数据集相关阅读

一、RadioML2016.10a数据集介绍

相信能看到这个博客的一定已经得到数据集了,网上资源也很多。
该数据集生成的代码:RML2016.10a生成代码
要使用这代码生成自己的数据集代码有点麻烦,除了需要下GNURadio,还需要下载一些包建立一些依赖(比如import gnuradio需要gr-mediatools),方法在该文章中给出。除了RML2016a外,该作者的其余公开数据集可见文章。
上述具体内容整理如下,也包括了博主整理的这些年有名的神经网络参考文献:

内容 链接
数据集来源 Radio Machine Learning Dataset Generation with GNU Radio
数据集生成代码 RML2016.10a生成代码
GNURadio配置 环境搭建
RML数据集 除了RML2016a外该作者的其余公开数据集
各类神经网络参考文献 链接

以下是RML2016.10a的主要配置

RML2016.10a内容 具体信息
数据源 数字调制信号:莎士比亚的古腾堡作品;模拟调制信号:连续剧《Serial Episode》
生成方式 Gnuradio+Python
数据格式 IQ(In-phaseand Quadrature)数据格式:2×128
样本总量 220000(22万)
调制方式 8个数字调制方式: 8PSK, BPSK, CPFSK, GFSK, PAM4, 16QAM, 64QAM, QPSK;3个模拟调制方式:AM-DSB, AM-SSB, WBFM
信噪比范围 -20dB~18dB,间隔2dB
采样率 200kHZ
延迟设置 [0.0, 0.9, 1.7]
噪声 加性高斯白噪声(Additive White Gaussian Noise,AWGN)
信道环境 加性高斯白噪声、选择性衰落(莱斯(Rician)+瑞利(Rayleigh))、中心频率偏移(Center Frequency Offset, CFO) 、采样率偏移(Sample Rate Offset, SRO)

二、读取方式

由于RML2016.10a_dict.pkl的编码是latin-1(以此为例,其他的也可以类似,实在查不到,也可以最笨的方法,一个个编码格式试出来= =)

2.1读取数据

with open(r'**路径**', 'rb') as p_f:
    s = pickle.load(p_f,encoding="latin-1")

2.2打印数据

举个例子,看你要读取什么,根据自己要求读取(截取了部分图。。因为太长了)

for i in s.keys():
#     print(i,s[i])
#     print(s[i])  # 输出字典数据
    print(i)   # 输出数据前类似于('QPSK', 2)的格式
    k=k+1
print(k)

RML2016.10a数据集读取和处理_第1张图片

三、原作者处理方式及代码

以下是原文作者的处理方式,但仍有不足
①对数据集的划分不严谨(分为训练集和测试集,理论上应该还有个验证集,由于是keras,比较轻便,使用validation_split就可以实现训练集中拆分出验证集)
②他是将数据以整体形式划分为训练集和测试集,因此单个类(调制方式)的划分的比例不均匀,这里建议分层抽样。

Xd = pickle.load(open("./database/RML2016.10a_dict.pkl", 'rb'), encoding='latin')
snrs, mods = map(lambda j: sorted(list(set(map(lambda x: x[j], Xd.keys())))), [1, 0])
X = []
lbl = []
for mod in mods:
    for snr in snrs:
        X.append(Xd[(mod, snr)])
        for i in range(Xd[(mod, snr)].shape[0]):  lbl.append((mod, snr))
            
X = np.vstack(X)
# %%
np.random.seed(2016)  # 对预处理好的数据进行打包,制作成投入网络训练的格式,并进行one-hot编码
n_examples = X.shape[0]
n_train = n_examples * 0.7  
train_idx = np.random.choice(range(0, n_examples), size=int(n_train), replace=False)
test_idx = list(set(range(0, n_examples)) - set(train_idx))  # label
X_train = X[train_idx]
X_test = X[test_idx]

def to_onehot(yy):
    yy1 = np.zeros([len(yy), max(yy) + 1])
    yy1[np.arange(len(yy)), yy] = 1
    return yy1


trainy = list(map(lambda x: mods.index(lbl[x][0]), train_idx))
Y_train = to_onehot(trainy)
Y_test = to_onehot(list(map(lambda x: mods.index(lbl[x][0]), test_idx)))

至此,已经获得了处理好的训练集和测试集(都包含单子载波的IQ信号数据和相应经过热编码的标签),后面就是设计属于自己的网络了。

投论文的建议(瞎聊):发论文的话,别只从模型角度调,魔改的模型前几年还好,现在专家看了就想吐= =如果没有特别的创意,建议最高识别精度超过91%,用准确率来弥补,另外看到一文献最高识别精度最高有93+%(不过感觉有点假,混淆矩阵都给不出)。对于RML2016a,本身算是该作者公开数据集中数据量最小的,比较难提升(博主是结合了许多方法才达到的);2016C数据量更小,几乎没人用,在这数据集上的模型精度提升比较困难;RML2016b由于数据量比较丰富,模型训练充分,一般都能到92%-94%;RML2018a由于数据量和数据大小的缘故,对硬件的要求比较比较大,当然发文相对比较容易(可能是出的图比较高大上的缘故)。
说了一堆废话,具体可以为:
①提升识别率:包括提升总体识别率、低信噪比下识别率(很有意义)、高阶调制方式的识别率
②结合算法:结合一些机器学习算法、预处理算法啥的,别仅依靠魔改无法解释的神经网络去提高性能(真的很low);
③扩展数据集:作者的数据集其实比较简单,可以进行扩展,比如创建128QAM 256QAM的5G条件(RML2018a数据集);构建多子载波信号就很有意义,当然实现也会有难度;研究其他信道缓解;模型在实测环境的信号中的表现等等~~~~(数据集生成的代码及Gnuradio配置方法在底部给出,祝各位科研顺利!)

平均准确率图:
RML2016.10a数据集读取和处理_第2张图片

各调制方式准确率图:
RML2016.10a数据集读取和处理_第3张图片

三种模拟调制都比较特殊,这里发现AMSSB识别率不受信噪比影响。

混淆矩阵(两种统计方式):
RML2016.10a数据集读取和处理_第4张图片
RML2016.10a数据集读取和处理_第5张图片
可以利用一些方法改善整体的识别性能:比如两种高阶16QAM和64QAM的识别率。
RML2016.10a数据集读取和处理_第6张图片

RML2016.10a数据集读取和处理_第7张图片

调制识别数据集相关阅读

调制识别相关数据集(RML2016a/b/c+2018a)

RML数据集制作代码

Gnuradio包导入的问题

各种神经网络及对应文献

你可能感兴趣的