目录
一、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 免费内容:
4.2 付费内容(可节约大量时间成本,有需要可了解):
2018数据集的相关实现↓
深度学习框架 | Tensorflow+Keras |
---|---|
模型 | 相关代码 |
CNN/ResNet | 使用CNN/ResNet实现自动调制识别(RML2018.01a) |
LSTM | 使用LSTM实现自动调制识别(RML2018.01a)) |
CLDNN | 使用CLDNN实现自动调制识别(RML2018.01a)) |
Transformer | 使用Transformer实现自动调制识别(RML2016.10a,90%+精度(未调参优化)) |