【信号处理】绘制IQ信号时域图、星座图、功率谱

时域图

python 复制代码
# 导入相关的库
import pickle
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
import os

with open(r"C:\0-数据集\公开\RML2016\RML2016.10a_dict.pkl", 'rb') as file:
    Xd = pickle.load(file, encoding='bytes')
snrs, mods = map(lambda j: sorted(list(set(map(lambda x: x[j], Xd.keys())))), [1, 0])
print(snrs)
print(mods)

def time_domain_rml2016(select_mod=b'PAM4',select_snr=16, select_num=10):

    print(select_mod, select_snr)

    path = Path("./time/" + str(select_mod) + '_' + str(select_snr))
    # print(path)
    if not path.exists():
        os.makedirs(path)

    for i in range(select_num):
        fig = plt.figure()
        plt.plot(Xd[select_mod, select_snr][i, 0])
        plt.plot(Xd[select_mod, select_snr][i, 1])
        name = str(select_mod) + '_' + str(select_snr) + '_' + str(i) + '.png'
        print(name)
        plt.axis('off')  # 关闭坐标轴
        plt.gca().set_frame_on(False)  # 关闭图形边框
        # 只保存散点图
        plt.savefig(path/name)
        # plt.show()

time_domain_rml2016()

星座图

把输入的IQ信号定义为信号的实部和虚部(但实际上IQ两路信号都是实信号)将I和Q分别作为横轴和纵轴,那么在复平面上每两个IQ值可以对应一个固定的点,将坐标图画出来就叫做星座图。

python 复制代码
# 导入相关的库
import pickle
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
import os

with open(r"C:\0-数据集\公开\RML2016\RML2016.10a_dict.pkl", 'rb') as file:
    Xd = pickle.load(file, encoding='bytes')
snrs, mods = map(lambda j: sorted(list(set(map(lambda x: x[j], Xd.keys())))), [1, 0])
print(snrs)
print(mods)

def constellation_rml2016(select_mod=b'QPSK',select_snr=16, select_num=10):
    data = []
    # 遍历调制方式和信噪比,提取数据
    for mod in mods:
        for snr in snrs:
            if mod == select_mod and snr == select_snr:
                data.append(Xd[(mod,snr)])

    data = np.vstack(data)
    print(len(data))
    print(select_mod, select_snr)

    path = Path("./" + str(select_mod) + '_' + str(select_snr))
    # print(path)
    if not path.exists():
        os.makedirs(path)

    for i in range(select_num):
        x, y = data[i]
        fig = plt.figure()
        plt.scatter(x, y, c='blue')
        # plt.xlabel("I")
        # plt.ylabel("Q")
        name = str(select_mod) + '_' + str(select_snr) + '_' + str(i) + '.png'
        print(name)
        # 不显示坐标轴、标题等信息
        plt.axis('off')  # 关闭坐标轴
        plt.gca().set_frame_on(False)  # 关闭图形边框
        # 只保存散点图
        plt.savefig(path/name)
        # plt.show()

constellation_rml2016()

功率谱

python 复制代码
# 导入相关的库
import pickle
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
import os

with open(r"C:\0-数据集\公开\RML2016\RML2016.10a_dict.pkl", 'rb') as file:
    Xd = pickle.load(file, encoding='bytes')
snrs, mods = map(lambda j: sorted(list(set(map(lambda x: x[j], Xd.keys())))), [1, 0])
print(snrs)
print(mods)

def spectrum_power_rml2016(select_mod=b'AM-DSB',select_snr=0, select_num=10):

    print(select_mod, select_snr)

    path = Path("./spectrum/" + str(select_mod) + '_' + str(select_snr))
    # print(path)
    if not path.exists():
        os.makedirs(path)

    for i in range(select_num):
        fig = plt.figure()

        data_I = Xd[select_mod, select_snr][i, 0]
        data_Q = Xd[select_mod, select_snr][i, 1]

        # 合成IQ信号
        data_IQ = data_I + 1j*data_Q

        # 功率谱分析:对IQ信号进行FFT,计算功率谱
        power_spectrum = np.abs(np.fft.fft(data_IQ)) ** 2
        # 计算频率轴
        frequencies = np.fft.fftfreq(len(power_spectrum), 1)  # 假设 time_step 为 1
        idx = np.argsort(frequencies)

        plt.plot(frequencies[idx], power_spectrum[idx])

        name = str(select_mod) + '_' + str(select_snr) + '_' + str(i) + '.png'
        print(name)
        plt.axis('off')  # 关闭坐标轴
        plt.gca().set_frame_on(False)  # 关闭图形边框
        # 只保存散点图
        plt.savefig(path/name)
        # plt.show()

spectrum_power_rml2016()

参考链接

RML2016.10a数据集画星座图、频域图、时域图
JoshiShamika/Deep-learning-for-Modulation-Recognition-on-RML2016.10a_dict-dataset

相关推荐
奔跑吧邓邓子21 分钟前
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
爬虫·python·正则表达式·进阶·高级
码界筑梦坊44 分钟前
基于Flask的京东商品信息可视化分析系统的设计与实现
大数据·python·信息可视化·flask·毕业设计
软件开发技术局44 分钟前
撕碎QT面具(8):对控件采用自动增加函数(转到槽)的方式,发现函数不能被调用的解决方案
开发语言·qt
pianmian11 小时前
python绘图之箱型图
python·信息可视化·数据分析
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
周杰伦fans2 小时前
C#中修饰符
开发语言·c#
yngsqq2 小时前
c# —— StringBuilder 类
java·开发语言
赔罪3 小时前
Python 高级特性-切片
开发语言·python
伊一大数据&人工智能学习日志3 小时前
selenium爬取苏宁易购平台某产品的评论
爬虫·python·selenium·测试工具·网络爬虫
说是用户昵称已存在3 小时前
Pycharm+CodeGPT+Ollama+Deepseek
ide·python·ai·pycharm