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

一、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万)
采样率偏移标准偏差0.01Hz
最大采样率偏移50Hz
载波频率偏移标准差0.01Hz
最大载波频率偏移500Hz
频率选择性衰落中使用的正弦波数8
调制方式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]
每个延迟时间对应的幅度[1, 0.8, 0.3]
噪声加性高斯白噪声(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)

在这里插入图片描述

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

以下是原文作者的处理方式,但仍有不足
①对数据集的划分不严谨(分为训练集和测试集,理论上应该还有个验证集,由于是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%,用准确率来弥补。对于RML2016a,算是该作者公开数据集中数据量最小的,比较难提升;2016C数据量更小,几乎没人用;RML2016b由于数据量比较丰富,模型训练充分,一般都能到92%-94%;RML2018a由于数据量和数据大小的缘故,对硬件的要求比较比较大,当然发文相对比较容易(可能是出的图比较高大上的缘故)。
说了一堆废话,具体可以为:
①提升识别率:包括提升总体识别率、低信噪比下识别率(很有意义)、高阶调制方式的识别率
②结合算法:结合一些机器学习算法、预处理算法啥的,别仅依靠魔改无法解释的神经网络去提高性能(真的很low);
③扩展数据集:作者的数据集其实比较简单,可以进行扩展,比如创建128QAM 256QAM的5G条件(RML2018a数据集);构建多子载波信号就很有意义,当然实现也会有难度;研究其他信道环境;模型在实测环境的信号中的表现等等~~~~(数据集生成的代码及Gnuradio配置方法在底部给出,祝各位科研顺利!)

平均准确率图:
在这里插入图片描述

各调制方式准确率图:
在这里插入图片描述

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

混淆矩阵(两种统计方式):
在这里插入图片描述
在这里插入图片描述
可以利用一些方法改善整体的识别性能:比如两种高阶16QAM和64QAM的识别率。
在这里插入图片描述

在这里插入图片描述

四、调制识别数据集相关阅读

4.1 免费内容:

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

RML数据集制作代码

Gnuradio包导入的问题

各种神经网络及对应文献

4.2 付费内容(可节约大量时间成本,有需要可了解):

调制识别参考文献(随专栏赠送)

绘制调制识别中那些看起来高大上的图

2018数据集的相关实现↓

深度学习框架Tensorflow+Keras
模型相关代码
CNN/ResNet使用CNN/ResNet实现自动调制识别(RML2018.01a)
LSTM使用LSTM实现自动调制识别(RML2018.01a))
CLDNN使用CLDNN实现自动调制识别(RML2018.01a))
Transformer使用Transformer实现自动调制识别(RML2016.10a,90%+精度(未调参优化))
  • 33
    点赞
  • 301
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 138
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sinysama

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

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

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

打赏作者

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

抵扣说明:

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

余额充值