基于循環神經網絡的一維信號降噪方法(簡單版本,Python)

代碼非常簡單。

import torch 
import torch.nn as nn
from torch.autograd import Variable
from scipy.io.wavfile import write
#need install pydub module
#pip install pydub
import numpy as np
import pydub 
from scipy import signal
import IPython
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D
# For running on GPU
#device = torch.device("cuda")# choose your device
device = torch.device("cpu")
a = torch.rand(5, 5, device=device)# change by either using the device argument
a = a.to(device)# or by .to()

Make data

fs = 512
x = np.linspace(0, 20*np.pi * (1-1/(10*fs)), fs*10)
y_sin = 0.5*np.sin(x)
plt.plot(x, y_sin)
plt.xlabel('Angle [rad]')
plt.ylabel('sin(x)')
plt.axis('tight')
plt.show()

y_triangle = 0.5*signal.sawtooth(x, 0.5)
plt.plot(x, y_triangle)
plt.xlabel('Phase [rad]')
plt.ylabel('triangle(x)')
plt.axis('tight')
plt.show()

y_saw = 0.5*signal.sawtooth(x, 1)plt.plot(x, y_saw)plt.xlabel('Phase [rad]')plt.ylabel('sawtooth(x)')plt.axis('tight')plt.show()

Add Gaussian Noise

Add noise


# Add guassian noise
y_sin_n = y_sin + 0.1*np.random.normal(size=len(x))
y_triangle_n = y_triangle + 0.1*np.random.normal(size=len(x))
y_saw_n = y_saw + 0.1*np.random.normal(size=len(x))plt.plot(x, y_sin_n)
plt.xlabel('Angle [rad]')
plt.ylabel('sin(x) + noise')
plt.axis('tight')
plt.show()

plt.plot(x, y_triangle_n)
plt.xlabel('Phase [rad]')
plt.ylabel('triangle(x) + noise')
plt.axis('tight')
plt.show()

plt.plot(x, y_saw_n)
plt.xlabel('Phase [rad]')
plt.ylabel('sawtooth(x) + noise')
plt.axis('tight')
plt.show()

Creating Dataset

def give_part_of_data(x, y, n_samples=10000, sample_size=100) :data_inp = np.zeros((n_samples, sample_size))data_out = np.zeros((n_samples, sample_size))for i in range(n_samples):random_offset = np.random.randint(0, len(x) - sample_size)sample_inp = x[random_offset:random_offset+sample_size]sample_out = y[random_offset:random_offset+sample_size]data_inp[i, :] = sample_inpdata_out[i, :] = sample_outreturn data_inp, data_out
# Train, Validationa, and Test
sin_train_in, sin_train_out = give_part_of_data(y_sin_n[0:int(7/10 * len(x))], y_sin[0:int(7/10 * len(x))], 2000, int(len(x)/6))
tri_train_in, tri_train_out = give_part_of_data(y_triangle_n[0:int(7/10 * len(x))], y_triangle[0:int(7/10 * len(x))], 2000, int(len(x)/6))
saw_train_in, saw_train_out = give_part_of_data(y_saw_n[0:int(7/10 * len(x))], y_saw[0:int(7/10 * len(x))], 2000, int(len(x)/6))sin_val_in, sin_val_out = y_sin_n[int(7/10 * len(x)):int(8/10 * len(x))], y_sin[int(7/10 * len(x)):int(8/10 * len(x))]
tri_val_in, tri_val_out = y_triangle_n[int(7/10 * len(x)):int(8/10 * len(x))], y_triangle[int(7/10 * len(x)):int(8/10 * len(x))]
saw_val_in, saw_val_out = y_saw_n[int(7/10 * len(x)):int(8/10 * len(x))], y_saw[int(7/10 * len(x)):int(8/10 * len(x))]sin_test_in, sin_test_out = y_sin_n[int(8/10 * len(x)):int(10/10 * len(x))], y_sin[int(8/10 * len(x)):int(10/10 * len(x))]
tri_test_in, tri_test_out = y_triangle_n[int(8/10 * len(x)):int(10/10 * len(x))], y_triangle[int(8/10 * len(x)):int(10/10 * len(x))]
saw_test_in, saw_test_out = y_saw_n[int(8/10 * len(x)):int(10/10 * len(x))], y_saw[int(8/10 * len(x)):int(10/10 * len(x))]
plt.plot(range(853), sin_train_in[3])
plt.plot(range(853), sin_train_out[3])plt.xlabel('Phase [rad]')
plt.ylabel('sin(x) + noise')
plt.axis('tight')
plt.show()

RNN + Sin

# RNN model
input_dim = 1
hidden_size_1 = 60
hidden_size_2 = 60
output_size = 1class CustomRNN(nn.Module):def __init__(self, input_size, hidden_size_1, hidden_size_2, output_size):super(CustomRNN, self).__init__()self.rnn = nn.RNN(input_size=input_size, hidden_size=hidden_size_1, batch_first=True)self.linear = nn.Linear(hidden_size_1, hidden_size_2, )self.act = nn.Tanh()self.linear = nn.Linear(hidden_size_2, output_size, )self.act = nn.Tanh()def forward(self, x):pred, hidden = self.rnn(x, None)pred = self.act(self.linear(pred)).view(pred.data.shape[0], -1, 1)return predmodel = CustomRNN(input_dim, hidden_size_1, hidden_size_2, output_size)
model = model.to(device)
optimizer = torch.optim.Adam(model.parameters())
loss_func = nn.MSELoss()lr = 1e-2for t in range(1000):inp = torch.Tensor(sin_train_in[..., np.newaxis] )inp.requires_grad = Trueinp = inp.to(device)out = torch.Tensor(sin_train_out[..., np.newaxis])out = out.to(device)pred = model(inp)optimizer.zero_grad()loss = loss_func(pred, out)if t%20==0:print(t, loss.data.item())lr = lr / 1.0001optimizer.param_groups[0]['lr'] = lrloss.backward()optimizer.step()
test_in = sin_test_in
inp = torch.Tensor(test_in[np.newaxis, ... , np.newaxis] )
inp = inp.to(device)
pred = model(inp).cpu().detach().numpy()
plt.plot(range(len(sin_test_in)), test_in)
plt.plot(range(len(sin_test_in)), pred[0, :,0])plt.showorginal_SNR = np.sum(np.abs(sin_test_out)**2) / np.sum(np.abs(sin_test_in - sin_test_out)**2)
orginal_SNR_db = 10*np.log(orginal_SNR)/np.log(10)
print('Original SNR : ', orginal_SNR)
print('Original SNR DB : ', orginal_SNR_db)network_SNR = np.sum(np.abs(sin_test_out)**2) / np.sum(np.abs(pred[0, :,0] - sin_test_out)**2)
network_SNR_db = 10*np.log(network_SNR)/np.log(10)
print('Network SNR : ', network_SNR)
print('Network SNR DB : ', network_SNR_db)
Original SNR :  12.951857235597608
Original SNR DB :  11.123320486750668
Network SNR :  107.29848229242438
Network SNR DB :  20.305935790331755

RNN + Triangular

# RNN model
input_dim = 1
hidden_size_1 = 60
hidden_size_2 = 60
output_size = 1class CustomRNN(nn.Module):def __init__(self, input_size, hidden_size_1, hidden_size_2, output_size):super(CustomRNN, self).__init__()self.rnn = nn.RNN(input_size=input_size, hidden_size=hidden_size_1, batch_first=True)self.linear = nn.Linear(hidden_size_1, hidden_size_2, )self.act = nn.Tanh()self.linear = nn.Linear(hidden_size_2, output_size, )self.act = nn.Tanh()def forward(self, x):pred, hidden = self.rnn(x, None)pred = self.act(self.linear(pred)).view(pred.data.shape[0], -1, 1)return predmodel = CustomRNN(input_dim, hidden_size_1, hidden_size_2, output_size)
model = model.to(device)
optimizer = torch.optim.Adam(model.parameters())
loss_func = nn.MSELoss()lr = 1e-2for t in range(1000):inp = torch.Tensor(tri_train_in[..., np.newaxis] )inp.requires_grad = Trueinp = inp.to(device)out = torch.Tensor(tri_train_out[..., np.newaxis])out = out.to(device)pred = model(inp)optimizer.zero_grad()loss = loss_func(pred, out)if t%20==0:print(t, loss.data.item())lr = lr / 1.0001optimizer.param_groups[0]['lr'] = lrloss.backward()optimizer.step()
test_in = tri_test_in
inp = torch.Tensor(test_in[np.newaxis, ... , np.newaxis] )
inp = inp.to(device)
pred = model(inp).cpu().detach().numpy()
plt.plot(range(len(tri_test_in)), test_in)
plt.plot(range(len(tri_test_in)), pred[0, :,0])plt.showorginal_SNR = np.sum(np.abs(tri_test_out)**2) / np.sum(np.abs(tri_test_in - tri_test_out)**2)
orginal_SNR_db = 10*np.log(orginal_SNR)/np.log(10)
print('Original SNR : ', orginal_SNR)
print('Original SNR DB : ', orginal_SNR_db)network_SNR = np.sum(np.abs(tri_test_out)**2) / np.sum(np.abs(pred[0, :,0] - tri_test_out)**2)
network_SNR_db = 10*np.log(network_SNR)/np.log(10)
print('Network SNR : ', network_SNR)
print('Network SNR DB : ', network_SNR_db)
Original SNR :  9.06282337035853
Original SNR DB :  9.572635159053185
Network SNR :  46.622532666082044
Network SNR DB :  16.685958619136

RNN + Sawtooth

# RNN model
input_dim = 1
hidden_size_1 = 60
hidden_size_2 = 60
output_size = 1class CustomRNN(nn.Module):def __init__(self, input_size, hidden_size_1, hidden_size_2, output_size):super(CustomRNN, self).__init__()self.rnn = nn.RNN(input_size=input_size, hidden_size=hidden_size_1, batch_first=True)self.linear = nn.Linear(hidden_size_1, hidden_size_2, )self.act = nn.Tanh()self.linear = nn.Linear(hidden_size_2, output_size, )self.act = nn.Tanh()def forward(self, x):pred, hidden = self.rnn(x, None)pred = self.act(self.linear(pred)).view(pred.data.shape[0], -1, 1)return predmodel = CustomRNN(input_dim, hidden_size_1, hidden_size_2, output_size)
model = model.to(device)
optimizer = torch.optim.Adam(model.parameters())
loss_func = nn.MSELoss()lr = 1e-2for t in range(1000):inp = torch.Tensor(tri_train_in[..., np.newaxis] )inp.requires_grad = Trueinp = inp.to(device)out = torch.Tensor(tri_train_out[..., np.newaxis])out = out.to(device)pred = model(inp)optimizer.zero_grad()loss = loss_func(pred, out)if t%20==0:print(t, loss.data.item())lr = lr / 1.0001optimizer.param_groups[0]['lr'] = lrloss.backward()optimizer.step()
test_in = saw_test_in
inp = torch.Tensor(test_in[np.newaxis, ... , np.newaxis] )
inp = inp.to(device)
pred = model(inp).cpu().detach().numpy()
plt.plot(range(len(saw_test_in)), test_in)
plt.plot(range(len(saw_test_in)), pred[0, :,0])plt.showorginal_SNR = np.sum(np.abs(saw_test_out)**2) / np.sum(np.abs(saw_test_in - saw_test_out)**2)
orginal_SNR_db = 10*np.log(orginal_SNR)/np.log(10)
print('Original SNR : ', orginal_SNR)
print('Original SNR DB : ', orginal_SNR_db)network_SNR = np.sum(np.abs(saw_test_out)**2) / np.sum(np.abs(pred[0, :,0] - saw_test_out)**2)
network_SNR_db = 10*np.log(network_SNR)/np.log(10)
print('Network SNR : ', network_SNR)
print('Network SNR DB : ', network_SNR_db)
Original SNR :  8.918716305325825
Original SNR DB :  9.50302349708762
Network SNR :  26.97065260659425
Network SNR DB :  14.308914551667852

知乎學術咨詢:
https://www.zhihu.com/consult/people/792359672131756032?isMe=1

工學博士,擔任《Mechanical System and Signal Processing》《中國電機工程學報》《控制與決策》等期刊審稿專家,擅長領域:現代信號處理,機器學習,深度學習,數字孿生,時間序列分析,設備缺陷檢測、設備異常檢測、設備智能故障診斷與健康管理PHM等。

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

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

相關文章

C語言學習記錄(十二)——指針與數組及字符串

文章目錄 前言一、指針和數組二、指針和二維數組**行指針(數組指針)** 三、 字符指針和字符串四、指針數組 前言 一個學習嵌入式的小白~ 有問題評論區或私信指出~ 提示:以下是本篇文章正文內容,下面案例可供參考 一、指針和數組 在C語言中 &#xff0…

【vscode插件】多行注釋

最近在編寫C程序的過程中,筆者發現,vscode默認的多行注釋是使用單行注釋拼起來的,對于筆者想要突出多行注釋,同時便于后續修改的需求無法滿足,隨體驗一下自己開發VSCODE插件。 可以說,整個插件的開發和上線…

軟件開發生命周期(Software Development Life Cycle, SDLC)

目錄 簡介 簡介 軟件開發生命周期(Software Development Life Cycle, SDLC)是軟件從概念到正式交付和維護的一系列階段。每個階段都有其特定的目標和活動,以下是軟件開發生命周期中常見的幾個階段: 需求收集與分析(R…

IndexError: image index out of range

IndexError: image index out of range 這個錯誤通常意味著你嘗試訪問的圖像索引超出了圖像的實際尺寸范圍。在你給出的代碼行: s_img_point_color_list.append(s_pixels[coordinate[0], coordinate[1]])你正在嘗試從 s_pixels 這個變量(很可能是一個圖…

Android系統為什么lmkd殺到adj 100就代表有低內存?

在Android系統中,lmkd(Low Memory Killer Daemon,低內存終止守護進程)負責監控系統的內存狀態,并在內存壓力較高時通過終止不必要的進程來釋放內存,以維持系統的穩定運行。關于lmkd為何在殺到adj&#xff0…

Nginx負載均衡及動靜分離

目錄 一、Nginx負載均衡【重點】 1.1 輪詢 1.2 權重 1.3 ip_hash 二、Nginx動靜分離【重點】 2.1 動態資源代理 2.2 靜態資源代理 官方文檔 nginx 一、Nginx負載均衡【重點】 Nginx為我們默認提供了三種負載均衡的策略: 輪詢:將客戶端發起的請求…

【chatgpt】pytorch中requires_grad=True

在 PyTorch 中,requires_gradTrue 是一個非常重要的標志,它指示 PyTorch 是否需要為某個張量計算梯度。這在訓練神經網絡時尤為關鍵,因為我們通常需要通過反向傳播來更新模型參數,以最小化損失函數。 requires_gradTrue 的作用 …

Perl變量作用域全解析:掌握變量的可見之旅

Perl變量作用域全解析:掌握變量的可見之旅 Perl是一種靈活的腳本語言,以其對文本處理的強大能力而聞名。在Perl編程中,變量作用域的概念至關重要,它決定了變量在代碼中的可見性和生命周期。本文將深入探討Perl中變量作用域的定義…

AI降重,不再難:降AI率的實用技巧大揭秘

如何有效降低AIGC論文的重復率,也就是我們說的aigc如何降重?AIGC疑似度過高確實是個比較愁人的問題。如果你用AI幫忙寫了論文,就一定要在交稿之前做一下AIGC降重的檢查。一般來說,如果論文的AIGC超過30%,很可能會被判定…

CAS操作

CAS 全稱:Compare and swap,能夠比較和交換某個寄存器中的值和內存中的值,看是否相等,如果相等,則把另外一個寄存器中的值和內存進行交換. (這是一個偽代碼,所以這里的&address實際上是想要表示取出address中的值) 那么我們可以看到,CAS就是這樣一個簡單的交換操作,那么…

基于SpringBoot房屋租賃管理系統設計和實現(源碼+LW+調試文檔+講解等)

💗博主介紹:?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者,博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?💗 Java精品實戰案例《1000套》 2025-2026年最值得選擇的Java畢業設計選題大全&#xff…

TVBox自定義配置+軟件密碼版本

apk地址 : https://gitee.com/wheat-wheat/kekeda-duck-apk 1、安裝安卓SDK Android SDK Windows 安裝及環境配置教程_sdk manager windows-CSDN博客 修改點: 基礎配置: java版本:

在系統已經存在postgres時,安裝gitlab

以下作廢,感覺直接裝gitlab太不穩定了,現在轉而使用dockers安裝gitlab https://cloud.tencent.com/developer/article/2309562 https://www.cnblogs.com/lvzhenjiang/p/14949722.html https://cloud.tencent.com/developer/article/2256871 https://blo…

新火種AI|國產大模型展開決戰,是資本游戲還是技術革命?

作者:一號 編輯:美美 資本角逐與技術革新,國產大模型的雙線戰場已然開啟。 隨著人工智能技術的不斷進步,國產大模型正迅速成為行業關注的焦點。在這個由數據驅動的時代,資本的注入和技術創新的加速,讓國…

Spring Cloud中的服務路由與過濾技術實現

Spring Cloud中的服務路由與過濾技術實現 大家好,我是微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 在微服務架構中,服務路由與過濾是確保服務之間通信有效性和安全性的重要技術。Spring Cloud作為…

Python28-6 隨機森林

隨機森林算法詳細介紹 1. 理論背景 隨機森林(Random Forest)是一種由Leo Breiman和Adele Cutler在2001年提出的集成學習方法。它結合了多個決策樹的預測結果,以提高模型的準確性和魯棒性。 2. 算法細節 隨機森林的構建過程可以分為以下幾…

Qt——升級系列(Level Eight):界面優化

目錄 QSS 背景介紹 基本語法 QSS設置方式 指定控件樣式設置 全局樣式設置 從文件加載樣式表 使用Qt Designer 編輯樣式 選擇器 選擇器概況 子控件選擇器 偽類選擇器 樣式屬性 盒模型 控件樣式示例 按鈕 復選框、單選框 輸入框 列表 菜單欄 登錄界面 繪圖 基本概念 繪制各種形…

[Go 微服務] Kratos 使用的簡單總結

文章目錄 1.Kratos 簡介2.傳輸協議3.日志4.錯誤處理5.配置管理6.wire 1.Kratos 簡介 Kratos并不綁定于特定的基礎設施,不限定于某種注冊中心,或數據庫ORM等,所以您可以十分輕松地將任意庫集成進項目里,與Kratos共同運作。 API -&…

Linux內網端口轉公網端口映射

由于服務商做安全演練,把原先服務器內網的端口映射到外網端口全都關閉了,每次維護服務器特別麻煩,像數據庫查詢如果用原生的mysql 去連接,查詢返回的結果亂了,非常不方便。 查了服務還是可以正常訪問部分外網的&#x…

知識圖譜查詢語言的表示

文章目錄 SPARQL知識圖譜查詢基本構成常見的SPARQL查詢算子語義Markup表示語言SPARQL知識圖譜查詢基本構成 RDF 支持類似數據庫的查詢語言,叫作SPARQL,它提供了查詢RDF 數據的標準語法、處理SPARQL查詢的規則以及結果返回形式。 變量,RDF中的資源,以“?”或者“$”指示;…