基于深度學習的無線電調制識別系統

基于深度學習的無線電調制識別系統

本項目實現了一個基于深度學習的無線電調制識別系統,使用LSTM(長短期記憶網絡)模型對不同類型的
無線電信號進行自動分類識別。該系統能夠在不同信噪比(SNR)條件下,準確識別多種調制類型,如BPSK、
QPSK、QAM16等。無線電調制識別是認知無線電、頻譜監測和信號情報等領域的關鍵技術。傳統方法依賴
專家設計的特征提取,而深度學習方法可以自動學習信號特征,提高識別準確率和魯棒性。

在這里插入圖片描述

數據集:本項目使用RadioML2016.10a數據集,這是一個廣泛用于無線電調制識別研究的標準數據集。
數據集特點:包含10種調制類型,20種信噪比條件(從-20dB到18dB)
信號特征:每個樣本包含128個時間步長,每個時間步長有I/Q兩個通道
數據格式:輸入形狀為[樣本數, 128, 2]
數據分割:數據集被分為訓練集、驗證集和測試集
在本項目中,選擇以下調制類型進行識別:
GFSK (2FSK)、PAM4 (2ASK)、BPSK、QPSK、QAM16、QAM64、CPFSK、8PSK
模型架構
本項目使用了兩層LSTM網絡結構,具體如下:
CopyInsert
輸入層: [128, 2](128個時間步長,每步2個特征:I/Q兩個通道)
LSTM層1: 128個單元,return_sequences=True
LSTM層2: 128個單元
全連接層: 神經元數量等于調制類型數量
Softmax激活: 輸出各調制類型的概率
LSTM模型的優勢在于能夠捕捉信號中的時序特征,這對于調制識別非常重要,因為不同調制方式的時域特征差異明顯。

模型定義代碼

CopyInsert
def LSTMModel(weights=None, input_shape=[128, 2], classes=11):if weights is not None and not os.path.exists(weights):raise ValueError('Invalid weights path.')
input_layer = Input(shape=input_shape, name='input')# 替代 CuDNNLSTM
x = LSTM(128, return_sequences=True, activation='tanh', recurrent_activation='sigmoid')(input_layer)
x = LSTM(128, activation='tanh', recurrent_activation='sigmoid')(x)output_layer = Dense(classes, activation='softmax', name='softmax')(x)model = Model(inputs=input_layer, outputs=output_layer)if weights:model.load_weights(weights)return model

5. 數據預處理
數據預處理是提高模型性能的關鍵步驟:
數據加載:從pickle文件加載RadioML2016.10a數據集
數據標準化:對每個樣本進行L2歸一化,提高模型的泛化能力

def norm_pad_zeros(X_train, nsamples):for i in range(X_train.shape[0]):X_train[i,:,0] = X_train[i,:,0]/la.norm(X_train[i,:,0],2)return X_train

幅度-相位轉換:將I/Q數據轉換為幅度和相位表示

def to_amp_phase(X_train, X_val, X_test, nsamples):X_train_cmplx = X_train[:,0,:] + 1j* X_train[:,1,:]X_train_amp = np.abs(X_train_cmplx)X_train_ang = np.arctan2(X_train[:,1,:], X_train[:,0,:]) / np.pi# ...

數據篩選:從所有調制類型中篩選出目標調制類型

selected_mods = ['GFSK', 'PAM4', 'BPSK', 'QPSK', 'QAM16', 'QAM64', 'CPFSK', '8PSK']
train_selected = [i for i in range(len(Y_train)) if mods[np.argmax(Y_train[i])] in selected_mods]
X_train_selected = X_train[train_selected]

標簽重編碼:將標簽轉換為獨熱編碼(one-hot)形式

Y_train_selected_new = np.zeros((len(train_selected), len(selected_mods)))
for i, idx in enumerate(train_selected):mod = mods[np.argmax(Y_train[idx])]Y_train_selected_new[i, selected_mods_dict[mod]] = 1

6. 訓練過程
損失函數:分類交叉熵(categorical_crossentropy)
優化器:Adam優化器
批量大小:400
訓練輪數:最多100輪,配合早停策略
回調函數:
ModelCheckpoint:保存最佳模型
ReduceLROnPlateau:在驗證損失停滯時降低學習率
EarlyStopping:在驗證損失長時間不改善時提前停止訓練
訓練代碼:

model = LSTMModel(weights=None, input_shape=[128, 2], classes=len(selected_mods))
model.compile(loss='categorical_crossentropy', metrics=['acc'], optimizer='adam')filepath = 'weights/weights.h5'
history = model.fit(X_train_selected,Y_train_selected_new,batch_size=batch_size,epochs=nb_epoch,verbose=2,validation_data=(X_val_selected, Y_val_selected_new),callbacks=[ModelCheckpoint(filepath, monitor='val_loss', save_best_only=True),ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-6),EarlyStopping(monitor='val_loss', patience=50)])

7. 性能評估
模型評估采用多種方法:
混淆矩陣:直觀展示各調制類型的識別準確率和錯誤類型

confnorm, _, _ = mltools.calculate_confusion_matrix(Y_test_selected_new, test_Y_hat, display_classes)
mltools.plot_confusion_matrix(confnorm, labels=display_classes, save_filename='picture/lstm_total_confusion.png')

不同信噪比下的性能:分析模型在不同信噪比條件下的表現

for i, snr in enumerate(snrs):indices = [j for j, s in enumerate(test_SNRs_selected) if s == snr]test_X_i = X_test_selected[indices]test_Y_i = Y_test_selected_new[indices]test_Y_i_hat = model.predict(test_X_i)confnorm_i, cor, ncor = mltools.calculate_confusion_matrix(test_Y_i, test_Y_i_hat, display_classes)acc[snr] = cor / (cor + ncor)
# 構建數據集
X = []
lbl = []
train_idx = []
val_idx = []
np.random.seed(2016)
a = 0# 遍歷所有調制類型和信噪比
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))# 劃分訓練集和驗證集train_idx += list(np.random.choice(range(a*1000,(a+1)*1000), size=600, replace=False))val_idx += list(np.random.choice(list(set(range(a*1000,(a+1)*1000))-set(train_idx)), size=200, replace=False))a += 1# 堆疊數據
X = np.vstack(X)
n_examples = X.shape[0]# 劃分測試集
test_idx = list(set(range(0,n_examples))-set(train_idx)-set(val_idx))
np.random.shuffle(train_idx)
np.random.shuffle(val_idx)
np.random.shuffle(test_idx)# 提取數據子集
X_train = X[train_idx]
X_val = X[val_idx]
X_test = X[test_idx]# 轉換為獨熱編碼
def to_onehot(yy):yy1 = np.zeros([len(yy), len(mods)])yy1[np.arange(len(yy)), yy] = 1return yy1# 生成標簽
Y_train = to_onehot(list(map(lambda x: mods.index(lbl[x][0]), train_idx)))
Y_val = to_onehot(list(map(lambda x: mods.index(lbl[x][0]), val_idx)))
Y_test = to_onehot(list(map(lambda x: mods.index(lbl[x][0]), test_idx)))# 轉換為幅度-相位表示
X_train, X_val, X_test = to_amp_phase(X_train, X_val, X_test, 128)# 截斷到最大長度
X_train = X_train[:,:maxlen,:]
X_val = X_val[:,:maxlen,:]
X_test = X_test[:,:maxlen,:]# 標準化
X_train = norm_pad_zeros(X_train, maxlen)
X_val = norm_pad_zeros(X_val, maxlen)
X_test = norm_pad_zeros(X_test, maxlen)return (mods, snrs, lbl), (X_train, Y_train), (X_val, Y_val), (X_test, Y_test), (train_idx, val_idx, test_idx)
selected_mods = ['GFSK', 'PAM4', 'BPSK', 'QPSK', 'QAM16', 'QAM64', 'CPFSK', '8PSK']
selected_mods_dict = {mod: i for i, mod in enumerate(selected_mods)}
display_classes = selected_mods

篩選與重新編碼訓練集

train_selected = [i for i in range(len(Y_train)) if mods[np.argmax(Y_train[i])] in selected_mods]
X_train_selected = X_train[train_selected]
Y_train_selected_new = np.zeros((len(train_selected), len(selected_mods)))
for i, idx in enumerate(train_selected):mod = mods[np.argmax(Y_train[idx])]Y_train_selected_new[i, selected_mods_dict[mod]] = 1

創建模型

model = culstm.LSTMModel(weights=None, input_shape=[128, 2], classes=len(selected_mods))
model.compile(loss='categorical_crossentropy', metrics=['acc'], optimizer='adam')

訓練模型

filepath = 'weights/weights.h5'
history = model.fit(X_train_selected,Y_train_selected_new,batch_size=batch_size,epochs=nb_epoch,verbose=2,validation_data=(X_val_selected, Y_val_selected_new),callbacks=[ModelCheckpoint(filepath, monitor='val_loss', save_best_only=True),ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-6),EarlyStopping(monitor='val_loss', patience=50)])

模型評估

score = model.evaluate(X_test_selected, Y_test_selected_new, verbose=1, batch_size=batch_size)
print("測試集性能:", score)

預測與繪圖函數

def predict(model):# 加載最佳模型權重model.load_weights(filepath)# 預測測試集test_Y_hat = model.predict(X_test_selected, batch_size=batch_size)# 計算總體混淆矩陣confnorm, _, _ = mltools.calculate_confusion_matrix(Y_test_selected_new, test_Y_hat, display_classes)mltools.plot_confusion_matrix(confnorm,labels=display_classes,save_filename='picture/lstm_total_confusion.png')# 計算每個信噪比下的性能acc = {}acc_mod_snr = np.zeros((len(selected_mods), len(snrs)))test_SNRs_selected = [lbl[test_idx[i]][1] for i in test_selected]for i, snr in enumerate(snrs):# 篩選特定信噪比的樣本indices = [j for j, s in enumerate(test_SNRs_selected) if s == snr]test_X_i = X_test_selected[indices]test_Y_i = Y_test_selected_new[indices]# 預測test_Y_i_hat = model.predict(test_X_i)# 計算混淆矩陣和準確率confnorm_i, cor, ncor = mltools.calculate_confusion_matrix(test_Y_i, test_Y_i_hat, display_classes)acc[snr] = cor / (cor + ncor)# 保存準確率with open('acc111.csv', 'a', newline='') as f:csv.writer(f).writerow([acc[snr]])# 繪制混淆矩陣mltools.plot_confusion_matrix(confnorm_i,labels=display_classes,title="Confusion Matrix SNR={}".format(snr),save_filename="picture/Confusion(SNR={})(ACC={:.2f}).png".format(snr, 100.0 * acc[snr]))# 計算每種調制類型在當前信噪比下的準確率acc_mod_snr[:, i] = np.round(np.diag(confnorm_i) / np.sum(confnorm_i, axis=1), 3)# 繪制所有調制方式準確率曲線plt.figure(figsize=(12, 8))for i in range(len(selected_mods)):plt.plot(snrs, acc_mod_snr[i], marker='o', label=display_classes[i])for x, y in zip(snrs, acc_mod_snr[i]):plt.text(x, y, '{:.2f}'.format(y), fontsize=8, ha='center', va='bottom')plt.xlabel("SNR (dB)")plt.ylabel("Accuracy")plt.title("Per-Modulation Classification Accuracy vs SNR (All Mods)")plt.legend(loc='best')plt.grid(True)plt.tight_layout()plt.savefig("picture/all_mods_acc.png", dpi=300)plt.close()# 保存結果數據with open('predictresult/acc_for_mod_on_lstm.dat', 'wb') as f:pickle.dump(acc_mod_snr, f)with open('predictresult/lstm.dat', 'wb') as f:pickle.dump(acc, f)# 繪制總體準確率曲線plt.plot(snrs, [acc[snr] for snr in snrs])plt.xlabel("SNR")plt.ylabel("Overall Accuracy")plt.title("Overall Classification Accuracy on RadioML2016.10a")plt.grid()plt.tight_layout()plt.savefig('picture/each_acc.png')

主要貢獻:

使用深度學習方法自動提取信號特征,避免了傳統方法中復雜的特征工程在不同信噪比條件下對多種調制類型進行識別,并分析了各調制類型的識別難度提供了完整的數據處理、模型訓練和評估流程,便于后續研究和應用通過本項目,我們可以看到深度學習在信號處理領域的巨大潛力,它不僅簡化了傳統的特征工程過程,還能在復雜環境下取得更好的性能。隨著深度學習技術的不斷發展,我們可以期待更多創新應用在無線通信領域涌現。
https://pan.baidu.com/s/16FN0BR0LUkfpcxZizn43xw

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82072.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 爬蟲之requests 模塊的應用

requests 是用 python 語言編寫的一個開源的HTTP庫,可以通過 requests 庫編寫 python 代碼發送網絡請求,其簡單易用,是編寫爬蟲程序時必知必會的一個模塊。 requests 模塊的作用 發送網絡請求,獲取響應數據。 中文文檔&#xf…

隨機森林(Random Forest)學習

隨機森林是一種基于集成學習的機器學習算法,屬于Bagging(Bootstrap Aggregating)方法的一種擴展。它通過組合多個決策樹來提升模型的泛化能力和魯棒性,廣泛用于分類、回歸和特征選擇任務。 1.隨機森林核心思想 1.1少數服從多數 在…

從 0 到 1!Java 并發編程基礎全解析,零基礎入門必看!

寫在前面 博主在之前寫了很多關于并發編程深入理解的系列文章,有博友反饋說對博主的文章表示非常有收獲但是對作者文章的某些基礎描述有些模糊,所以博主再根據最能接觸到的基礎,為這類博友進行掃盲!當然,后續仍然會接…

el-input寬度自適應方法總結

使用 style 或 class 直接設置寬度 可以通過內聯樣式或 CSS 類來直接設置 el-input 的寬度為 100%&#xff0c;使其自適應父容器的寬度 <template><div style"width: 100%;"><el-input style"width: 100%;" v-model"input">…

解決 Supabase “permission denied for table XXX“ 錯誤

解決 Supabase “permission denied for table” 錯誤 問題描述 在使用 Supabase 開發應用時&#xff0c;你可能會遇到以下錯誤&#xff1a; [Nest] ERROR [ExceptionsHandler] Object(4) {code: 42501,details: null,hint: null,message: permission denied for table user…

java每日精進 5.20【MyBatis 聯表分頁查詢】

1. MyBatis XML 實現分頁查詢 1.1 實現方式 MyBatis XML 是一種傳統的 MyBatis 使用方式&#xff0c;通過在 XML 文件中編寫 SQL 語句&#xff0c;并結合 Mapper 接口和 Service 層實現分頁查詢。分頁需要手動編寫兩條 SQL 語句&#xff1a;一條查詢分頁數據列表&#xff0c;…

linux taskset 查詢或設置進程綁定CPU

1、安裝 taskset larkubuntu&#xff1a;~$ sudo apt-get install util-linux larkubuntu&#xff1a;~$ taskset --help 用法&#xff1a; taskset [選項] [mask | cpu-list] [pid|cmd [args...]] 顯示或更改進程的 CPU 關聯性。 選項&#xff1a; -a&#xff0c; --all-tasks…

Python應用字符串格式化初解

大家好!在 Python 編程中&#xff0c;字符串格式化是一項基礎且實用的技能。它能讓你更靈活地拼接字符串與變量&#xff0c;使輸出信息更符合需求。本文將為和我一樣的初學者詳細介紹 Python 字符串格式化的常用方法。 定義: 字符串格式化就是將變量或數據插入到字符串中的特定…

EasyRTC嵌入式音視頻通信SDK一對一音視頻通信,打造遠程辦公/醫療/教育等場景解決方案

一、方案概述? 數字技術發展促使在線教育、遠程醫療等行業對一對一實時音視頻通信需求激增。傳統方式存在低延遲、高畫質及多場景適配不足等問題&#xff0c;而EasyRTC憑借音視頻處理、高效信令交互與智能網絡適配技術&#xff0c;打造穩定低延遲通信&#xff0c;滿足基礎通信…

SEO長尾詞優化精準布局

內容概要 長尾關鍵詞作為SEO策略的核心要素&#xff0c;其價值在于精準捕捉細分需求與低競爭流量入口。相較于短尾詞的高泛化性&#xff0c;長尾詞通過語義擴展與場景化組合&#xff0c;能夠更高效地匹配用戶搜索意圖&#xff0c;降低優化成本的同時提升轉化潛力。本文將從詞庫…

【MySQL】第7節|Mysql鎖機制與優化實踐以及MVCC底層原理剖析

鎖等待分析 我們通過檢查InnoDB_row_lock相關的狀態變量來分析系統上的行鎖的爭奪情況 示例場景 假設有兩個用戶同時操作賬戶表 accounts&#xff08;主鍵為 id&#xff09;&#xff1a; 1. 用戶A&#xff1a;執行轉賬&#xff0c;鎖定賬戶 id1 并等待3秒&#xff1a; BEG…

基于規則引擎與機器學習的智能Web應用防火墻設計與實現

基于規則引擎與機器學習的智能Web應用防火墻設計與實現 引言&#xff1a;智能防御的必然選擇 在2023年OWASP最新報告中&#xff0c;傳統Web應用防火墻&#xff08;WAF&#xff09;對新型API攻擊的漏報率高達67%&#xff0c;而誤報導致的正常業務攔截損失每年超過2.3億美元。面…

GIM發布新版本了 (附rust CLI制作brew bottle流程)

GIM 發布新版本了&#xff01;現在1.3.0版本可用了 可以通過brew upgrade git-intelligence-message升級。 初次安裝需要先執行 brew tap davelet/gim GIM 是一個根據git倉庫內文件變更自動生成git提交消息的命令行工具&#xff0c;參考前文《GIM: 根據代碼變更自動生成git提交…

PyQt5高效布局指南:QTabWidget與QStackedWidget實戰解析

&#x1f50d; 問題背景 當界面控件過多時&#xff0c;直接平鋪會導致窗口擁擠、用戶體驗下降。PyQt5提供了兩種高效容器控件&#xff1a; QTabWidget&#xff1a;選項卡式布局&#xff0c;支持直接切換不同功能模塊QStackedWidget&#xff1a;堆棧式布局&#xff0c;需配合導…

《2.2.1順序表的定義|精講篇》

上一節學習了線性表的邏輯結構&#xff0c;線性表需要實現哪些基本運算/操作&#xff1f;在本節中&#xff0c;我們將學習順序表的定義、順序表的特性&#xff0c;以及如何用代碼來實現順序表。下個小節我們會介紹基于順序存儲&#xff08;這種存儲結構&#xff09;如何用代碼具…

【 大模型技術驅動智能網聯汽車革命:關鍵技術解析與未來趨勢】

大模型技術驅動智能網聯汽車革命&#xff1a;關鍵技術解析與未來趨勢 關鍵詞總結&#xff1a; 大模型技術&#xff1a;LLM、VLM、MLLM、Transformer架構核心場景&#xff1a;智能駕駛、智能座艙、智能網聯關鍵技術&#xff1a;端到端系統、BEVOCC網絡、多模態融合、強化學習挑…

Rocketmq broker 是主從架構還是集群架構,可以故障自動轉移嗎

RocketMQ Broker的架構與故障轉移機制 RocketMQ的Broker架構同時采用了主從架構和集群架構&#xff0c;并且支持故障自動轉移。下面詳細說明&#xff1a; 一、架構類型 1. 集群架構 RocketMQ天然支持分布式集群部署 一個RocketMQ集群包含多個Broker組(每組有主從) 不同Bro…

從零開始建立個人品牌并驗證定位變現性的方法論——基于開源AI大模型、AI智能名片與S2B2C商城生態的實證研究

摘要&#xff1a;本文提出一種融合開源AI大模型、AI智能名片與S2B2C商城小程序源碼的"最小測試閉環"方法論&#xff0c;通過技術賦能實現個人品牌定位的精準驗證與變現路徑優化。以某美妝領域自由職業者為例&#xff0c;其通過開源AI大模型完成能力圖譜構建與資源匹配…

SQL進階之旅 Day 2:高效的表設計與規范:從基礎到實戰

【SQL進階之旅 Day 2】高效的表設計與規范&#xff1a;從基礎到實戰 開篇 在數據庫開發中&#xff0c;一個良好的表設計不僅能夠提高查詢效率&#xff0c;還能避免冗余數據和一致性問題。本文作為"SQL進階之旅"系列的第2天&#xff0c;將重點介紹高效的表設計與規范…

Java—— IO流的應用

帶權重的點名系統 案例要求 文件中有學生的信息&#xff0c;每個學生的信息獨占一行。包括學生的姓名&#xff0c;性別&#xff0c;權重 要求每次被抽中的學生&#xff0c;再次被抽中的概率在原先的基礎上降低一半。 本題的核心就是帶權重的隨機 分析 權重&#xff0c;權重和…