1. 项目背景与核心目标
在无线通信系统中,信号调制类型的自动识别(Automatic Modulation Classification, AMC)是一项关键技术。传统方法依赖专家经验和手动特征提取,而机器学习方法能够直接从信号数据中学习特征。这个项目尝试用五种不同复杂度的分类器(逻辑回归、决策树、随机森林、全连接网络和CNN)来解决AMC问题,特别关注不同信噪比(SNR)条件下的性能表现。
注:信噪比是衡量信号质量的重要指标,实际通信中常遇到-5dB到30dB范围的SNR环境
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据集准备与特征工程
2.1 信号数据生成
使用Python的numpy和scipy生成8种常见数字调制信号:
- 线性调制:BPSK, QPSK, 8PSK
- 正交幅度调制:16QAM, 64QAM
- 频移键控:2FSK, 4FSK
- 高斯频移键控:GFSK
python复制def generate_modulated_signal(mod_type, snr_db, N=1024):
# 载波频率
fc = 1000
# 采样率
fs = 8000
t = np.arange(N) / fs
# 随机比特序列
bits = np.random.randint(0, 2, int(np.log2(mod_type)*N/4))
if mod_type == 'BPSK':
# BPSK调制实现代码
...
elif mod_type == 'QPSK':
# QPSK调制实现代码
...
# 其他调制类型生成代码
...
# 添加高斯白噪声
signal_power = np.mean(signal**2)
noise_power = signal_power / (10 ** (snr_db / 10))
noise = np.random.normal(0, np.sqrt(noise_power), signal.shape)
return signal + noise
2.2 特征提取
为传统机器学习方法提取时频域特征:
- 瞬时幅度统计量(均值、方差、偏度、峰度)
- 瞬时相位非线性分量
- 瞬时频率导数
- 谱特征(谱中心、带宽等)
- 高阶累积量(2阶、4阶、6阶)
python复制def extract_features(signal):
features = []
# 瞬时幅度特征
amplitude = np.abs(signal)
features.extend([np.mean(amplitude), np.var(amplitude),
scipy.stats.skew(amplitude), scipy.stats.kurtosis(amplitude)])
# 瞬时相位特征
phase = np.unwrap(np.angle(signal))
phase_nonlinear = phase - 2*np.pi*1000*t # 去除线性分量
features.append(np.std(phase_nonlinear))
# 谱特征计算
...
return np.array(features)
3. 分类器实现与对比
3.1 传统机器学习模型
3.1.1 逻辑回归分类器
适合作为基准模型,实现简单但特征线性可分性要求高:
python复制from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
# 数据标准化很重要
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
lr = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000)
lr.fit(X_train_scaled, y_train)
3.1.2 决策树分类器
无需特征缩放,可解释性强:
python复制from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(
max_depth=8,
min_samples_split=10,
criterion='gini'
)
dt.fit(X_train, y_train)
# 可视化决策树
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(20,10))
plot_tree(dt, filled=True, feature_names=feature_names)
plt.show()
3.1.3 随机森林
集成方法,抗过拟合能力强:
python复制from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=100,
max_depth=10,
min_samples_leaf=3,
class_weight='balanced' # 处理类别不平衡
)
rf.fit(X_train, y_train)
# 特征重要性分析
importances = rf.feature_importances_
plt.barh(feature_names, importances)
3.2 深度学习模型
3.2.1 全连接密集网络
将信号I/Q数据直接展平输入:
python复制from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
model = Sequential([
Dense(256, activation='relu', input_shape=(2048,)), # 1024个采样点×2(I/Q)
Dropout(0.3),
Dense(128, activation='relu'),
Dense(64, activation='relu'),
Dense(8, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
3.2.2 卷积神经网络(CNN)
利用局部相关性,自动提取时频特征:
python复制from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten
# 输入形状:(batch, 1024, 2) - I/Q两通道
model = Sequential([
Conv1D(32, 3, activation='relu', input_shape=(1024, 2)),
MaxPooling1D(2),
Conv1D(64, 3, activation='relu'),
MaxPooling1D(2),
Conv1D(128, 3, activation='relu'),
GlobalAveragePooling1D(),
Dense(64, activation='relu'),
Dense(8, activation='softmax')
])
4. 训练策略与优化
4.1 数据增强技术
针对无线信号特点的数据增强:
- 添加随机频偏(模拟多普勒效应)
- 添加随机时延(模拟多径)
- 随机采样点丢弃(模拟脉冲噪声)
python复制class SignalAugmenter:
def __init__(self, max_freq_shift=100, max_delay=0.1):
self.max_freq_shift = max_freq_shift # Hz
self.max_delay = max_delay # 秒
def __call__(self, signal, fs=8000):
# 随机频偏
freq_shift = np.random.uniform(-self.max_freq_shift, self.max_freq_shift)
t = np.arange(len(signal))/fs
signal = signal * np.exp(1j*2*np.pi*freq_shift*t)
# 随机时延
delay_samples = int(np.random.uniform(0, self.max_delay*fs))
signal = np.roll(signal, delay_samples)
# 随机丢弃
if np.random.rand() > 0.7:
drop_start = np.random.randint(0, len(signal)-100)
signal[drop_start:drop_start+100] = 0
return signal
4.2 信噪比自适应训练
将SNR作为模型输入之一,增强模型鲁棒性:
python复制# 修改模型输入
input_signal = Input(shape=(1024, 2))
input_snr = Input(shape=(1,))
x = Conv1D(32, 3)(input_signal)
...
x = concatenate([Flatten()(x), input_snr])
x = Dense(64)(x)
...
5. 性能评估与分析
5.1 评估指标
除常规准确率外,需关注:
- 各类别的查准率、查全率
- 混淆矩阵
- 不同SNR区间的性能
- 模型推理时间
5.2 结果对比
在测试集(SNR -5dB到30dB)上的表现:
| 模型 | 整体准确率 | 高SNR(>20dB)准确率 | 低SNR(<5dB)准确率 | 参数量 |
|---|---|---|---|---|
| 逻辑回归 | 52.3% | 68.2% | 32.1% | 8K |
| 决策树 | 61.7% | 75.4% | 45.2% | - |
| 随机森林 | 73.2% | 86.7% | 56.3% | - |
| 全连接网络 | 68.5% | 82.1% | 51.2% | 550K |
| CNN | 82.4% | 94.3% | 67.8% | 210K |
5.3 实际部署考虑
- 计算资源:CNN需要GPU加速,传统方法可在CPU实时运行
- 可解释性:决策树可提供分类依据,CNN决策过程难以解释
- 适应性:深度学习对新调制类型需重新训练,随机森林可增量学习
6. 关键问题与解决方案
6.1 类别不平衡问题
某些调制类型(如64QAM)在低SNR下难以区分:
- 采用分层抽样确保训练数据均衡
- 使用类别权重(class_weight)参数
- 数据增强时针对难样本增加生成比例
6.2 过拟合处理
-
对传统模型:
- 决策树剪枝(max_depth, min_samples_split)
- 随机森林限制树深度
-
对深度学习:
- Dropout层(0.3-0.5比例)
- 早停法(patience=10)
- L2正则化
6.3 实时性优化
CNN模型优化技巧:
- 使用深度可分离卷积减少参数量
- 量化模型到int8精度
- 使用TensorRT加速
python复制# 深度可分离卷积改造
from tensorflow.keras.layers import SeparableConv1D
model.add(SeparableConv1D(64, 3, activation='relu'))
7. 扩展方向
- 混合模型:CNN特征提取+随机森林分类
- 时频分析:先进行STFT变换,输入时频图
- 注意力机制:加入Transformer模块捕捉长程依赖
- 硬件部署:将轻量模型部署到SDR设备(如USRP)
python复制# 注意力机制实现示例
from tensorflow.keras.layers import MultiHeadAttention
inputs = Input(shape=(1024, 2))
x = Conv1D(64, 3)(inputs)
x = MultiHeadAttention(num_heads=4, key_dim=64)(x, x)
...
实际工程中发现:在SNR>15dB时,简单模型与复杂模型差距不大,但在恶劣信道条件下CNN优势明显。建议根据实际应用场景的SNR分布选择合适的模型复杂度。
