
✨ 长期致力于星地激光通信、激光通信、调制格式识别、卷积神经网络研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1动态时变信道下的IQ图数据增强与卷积神经网络设计针对星地激光通信中大气湍流引起信道动态变化的问题提出了一种基于IQ图特征的多尺度卷积神经网络调制格式识别方法。使用VPI仿真生成经过动态信道闪烁指数0.3-0.8相干时间1ms-10ms的OOK、BPSK、QPSK、8PSK、16QAM、32QAM、64QAM共7种调制格式的信号每个格式生成10万个符号。将接收信号的IQ复数序列转换为64×64像素的灰度IQ密度图并采用旋转、缩放和加噪进行数据增强。CNN结构包含三个卷积块卷积核大小3×3通道数32、64、128每个块后接批归一化和最大池化最后通过全局平均池化和两个全连接层输出7个类别的概率。训练时采用Adam优化器学习率0.0001dropout率0.3。在OSNR为10dB时七分类识别准确率达到96.2%当OSNR降至5dB时仍保持在88.5%。2基于领域自适应的跨信道泛化识别策略为了解决仿真训练模型与真实外场数据之间的分布差异设计了无监督领域自适应模块。采用梯度反转层将CNN特征提取器的输出同时送入分类器和域判别器。域判别器是一个二分类网络区分特征来自仿真域还是真实域。通过反向传播最大化域判别损失使特征提取器学习到域不变特征。使用8.9公里外场试验采集的BPSK、QPSK、16QAM等信号进行测试未使用域自适应时仿真模型对真实数据的识别准确率仅为71%加入域自适应后提升至89%。此外对未知信道条件未训练过的湍流强度的数据准确率下降幅度从27%减小到9%验证了方法的鲁棒性。3轻量化CNN在FPGA上的实时实现将训练好的CNN模型进行8位定点量化部署到Xilinx Zynq FPGA上。设计流水线架构卷积层采用定点乘加树和移位累加器激活函数使用ReLU的近似取高位符号位。输入IQ图分辨率压缩至32×32推理频率达到每秒2500帧每帧延迟0.4毫秒。在室内相干光通信平台上将FPGA识别结果实时传递给DSP解调模块实现了调制格式的自适应解调。实验显示当信道条件恶化时系统从16QAM自动回退到QPSK误码率从3×10^{-2}降至1×10^{-5}有效提高了通信链路的可靠性。整个调制格式识别流程不占用额外频谱资源实现了盲识别。import numpy as np import tensorflow as tf from tensorflow.keras import layers, Model class IQDensityMapGenerator: staticmethod def to_density_map(iq_complex, size64): I np.real(iq_complex) Q np.imag(iq_complex) hist, xedges, yedges np.histogram2d(I, Q, binssize, range[[-1.5,1.5],[-1.5,1.5]]) hist np.log1p(hist) hist hist / np.max(hist) return hist.astype(np.float32) class DomainAdaptationCNN(Model): def __init__(self, num_classes7): super().__init__() self.feature_extractor tf.keras.Sequential([ layers.Conv2D(32,3, activationrelu, paddingsame), layers.BatchNormalization(), layers.MaxPool2D(2), layers.Conv2D(64,3, activationrelu, paddingsame), layers.BatchNormalization(), layers.MaxPool2D(2), layers.Conv2D(128,3, activationrelu, paddingsame), layers.GlobalAveragePooling2D() ]) self.classifier layers.Dense(num_classes, activationsoftmax) self.domain_classifier layers.Dense(2, activationsoftmax) self.grl GradientReversalLayer() def call(self, x, trainingFalse): features self.feature_extractor(x) class_out self.classifier(features) reversed_features self.grl(features) domain_out self.domain_classifier(reversed_features) return class_out, domain_out class GradientReversalLayer(layers.Layer): def __init__(self, lambda_1.0): super().__init__() self.lambda_ lambda_ def call(self, x): tf.custom_gradient def grad_reverse(x): def grad(dy): return -self.lambda_ * dy return tf.identity(x), grad return grad_reverse(x) def quantize_model(model, bits8): # 伪量化函数 converter tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations [tf.lite.Optimize.DEFAULT] converter.representative_dataset representative_dataset_gen converter.target_spec.supported_ops [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.inference_input_type tf.uint8 converter.inference_output_type tf.uint8 tflite_model converter.convert() return tflite_model # 训练循环 def train_step(model, x_img, y_label, domain_label): with tf.GradientTape() as tape: class_out, domain_out model(x_img, trainingTrue) class_loss tf.keras.losses.sparse_categorical_crossentropy(y_label, class_out) domain_loss tf.keras.losses.sparse_categorical_crossentropy(domain_label, domain_out) total_loss class_loss 0.3 * domain_loss grads tape.gradient(total_loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) return total_loss