1. 程式人生 > >音訊噪聲抑制(5):含輔助觀測資料的LMS噪聲抑制

音訊噪聲抑制(5):含輔助觀測資料的LMS噪聲抑制

以前有類似主題的文章。

這一篇講的是,如果有輔助資料,用LMS演算法對訊號濾波去噪的一個應用示例。

注意,現在的信噪比已經只有-40dB了!噪聲功率是訊號功率的1萬倍!

模型還是這樣的。v2是在離噪聲源很近的地方,採集到的噪聲(因此可以假設它就是v)。

v1是因為噪聲源發出的噪聲v,經過了一段通道傳輸以後,發生了一些變化,因此變成了v1。


%% 基於LMS演算法,有輔助資料的噪聲消除
% 作者:qcy
% 版本:v1.0
% 時間:2016年10月30日15:39:25

%% 
close all;clear; clc; 

%% 匯入音訊

filedir=[];                             % 設定路徑
filename='bluesky1.wav';                % 設定檔名
fle=[filedir filename];                 % 構成完整的路徑和檔名
[s, fs] = audioread(fle);               % 讀入資料檔案
s=s-mean(s);                            % 消除直流分量
s=s/max(abs(s));                        % 幅值歸一
N=length(s);                            % 語音長度
time=(0:N-1)/fs;                        % 設定時間刻度

%% 生成噪聲
SNR = -40;                              % 設定信噪比
r2=randn(size(s));                      % 產生隨機噪聲
b=fir1(31,0.5);                         % 設計FIR濾波器,代替H
r21=filter(b,1,r2);                     % FIR濾波
[r1,r22]=add_noisedata(s,r21,fs,fs,SNR);% 產生帶噪語音,信噪比為SNR 

%% LMS濾波

h_length = 35;
h = zeros(h_length,1); % 濾波器的初始化
miu = 8e-4;

v1_hat = zeros(size(s));
err2 = zeros(size(s));
y_output = r1;

% 開始濾波
for kk = 1:1 % 這裡設定濾波過程需要重複幾次。
    for k = h_length : N
        idx = k: -1 :(k-h_length+1);
        r2_in_sub = r2(idx); % 參考噪聲 --> 原始噪聲
        v1_hat_out = h.' * r2_in_sub; % 由 原始噪聲估計的 --> 訊號中的噪聲
        v1_hat(k) = v1_hat_out;
        dk = r1(k); % 觀察到的含噪語音,是參考訊號
        err = dk - v1_hat_out;
        err2(k) = err^2;
        h = h + miu * err * r2_in_sub;
        y_output(k) = y_output(k) - v1_hat_out;
    end
end

% 誤差平方
figure;
plot(err2);

%% 濾波器的幅頻特性
[H,w] = freqz(h,1,1e4);
figure;
plot(w/2/pi*fs,20*log10(abs(H)/max(abs(H))+eps));
xlabel('頻率(Hz)');

%% 計算信噪比的提升
snr1=SNR_singlech(s,r1);                % 計算初始信噪比
snr2=SNR_singlech(s,y_output);            % 計算濾波後的信噪比
snr=snr2-snr1;
SN1=snr1; SN2=snr2; SN3=snr;

%% 列印SNR
fprintf('[LMS]\n',snr1);
fprintf('濾波前 SNR = %f [dB] \n',snr1);
fprintf('濾波後 SNR = %f [dB] \n',snr2);
fprintf('提升 %f [dB] \n',snr);

%% 聽效果
% sound(s,fs); % 乾淨的語音
% sound(r1,fs); % 含噪的語音
sound(y_output,fs); % 濾波後的語音

%% 作圖
figure;
subplot 311; plot(time,s); ylabel('幅值') 
ylim([-1 1 ]); title('原始語音訊號');
subplot 312; plot(time,r1); ylabel('幅值') 
ylim([-100 100]); title('帶噪語音訊號');
subplot 313; plot(time,y_output); 
ylim([-1 1 ]); title('LMS濾波輸出語音訊號');
xlabel('時間/s'); ylabel('幅值');

可以看出,原始語音訊號已經完全淹沒在噪聲中了。在這麼惡劣的條件下,竟然能分辨出微弱的有用訊號,

在以前簡直是不可想象的。感謝偉大的科學家與工程師們。


LMS演算法對濾波器進行更新,當濾波器係數收斂(基本不變)後,


可以看看這個濾波器的幅頻特性。

由於有用訊號是語音訊號(300 Hz - 3400 Hz),我們的最優濾波器也很符合邏輯地顯示出其低通特性。


聽一聽效果,真是不錯。

但,還是以前說的,

1. 需要另外增加一個訊號採集裝置,增加成本;

2. 這個額外的訊號採集裝置還要能很好地接收到基本純淨的噪聲或通過一定線性通道(我們用的FIR濾波器)的噪聲;

這兩個因素,能不能實現,就要具體情況具體分析了。

相關推薦

音訊噪聲抑制5輔助觀測資料LMS噪聲抑制

以前有類似主題的文章。這一篇講的是,如果有輔助資料,用LMS演算法對訊號濾波去噪的一個應用示例。注意,現在的信噪比已經只有-40dB了!噪聲功率是訊號功率的1萬倍!模型還是這樣的。v2是在離噪聲源很近的地方,採集到的噪聲(因此可以假設它就是v)。v1是因為噪聲源發出的噪聲v,

Asp.Net MVC4入門指南5從控制器訪問資料模型

在本節中,您將建立一個新的MoviesController類,並在這個Controller類裡編寫程式碼來取得電影資料,並使用檢視模板將資料展示在瀏覽器裡。 在開始下一步前,先Build一下應用程式(生成應用程式)(確保應用程式編譯沒有問題) 用滑鼠右鍵單擊Controller資料夾,並建立一個新的

音訊噪聲抑制1經典濾波器篇

好久沒有寫音訊訊號處理的文章了……因為我從零開始學C++去了……前面有一些文章簡要介紹了IIR和FIR濾波器的設計方法。Review:IIRReview:FIR濾波器是一種工具,可以完成許多事情。用濾波器去除噪聲,是很常見的。用經典濾波器抑制噪聲,非常簡單。如果噪聲的功率譜P

音訊噪聲抑制4普通最小均方誤差LMS演算法

引言前面講了基於Weiner濾波器的噪聲抑制方法。維納濾波器有一些假設條件,比如訊號平穩(這就導致解方程算濾波器係數的時候,自相關矩陣與絕對時間無關)、噪聲和有用訊號不相關…其實,這些條件在實際中並不是那麼容易滿足的。因此,用維納濾波器來實現訊號去噪,效果不是特別理想。於是就

音訊噪聲抑制2維納Wiener濾波器篇

之前的文章講了使用經典濾波器來抑制噪聲。裡面提到,“用經典濾波器抑制噪聲,非常簡單。如果噪聲的功率譜PSD和有用訊號功率譜PSD沒有重疊的話,那可以實現非常好的效果。但是,如果有重疊,去噪的效果就不是特別理想了。因為在復指數訊號空間裡面,沒辦法把有用訊號和噪聲訊號分離啊。”正

C++傳智筆記5C++完整demo

內部 urn else clas spa char log getx system MyPoint.h #pragma once class MyPoint { private: double x0, y0; //點坐標 public: void setPoint(d

Windows Phone開發5室內裝修

表示 index can 進行 解釋 技術 面板 啟動 垂直 為什麽叫室內裝修呢?呵呵,其實說的是布局,具體些嘛,就是在一個頁面中,你如何去擺放你的控件,如何管理它們,你說,像不像我們剛搬進新住所,要“裝修”一番?買一套什麽樣的茶幾和杯具(我說的“杯具”指的是原意,不要理解

Swift學習筆記5集合類型

nbsp roc 三種 一個 刪除指定元素 edge 空值 port 自定義 目錄: 數組:Array 集合:Set 字典:Dictionary Swift提供Array(有序集合數據)、Set(無序無重復集合)和Dictionary(無序鍵值對集合)三

WAS集群系列5集群搭建步驟3安裝IHS軟件

line col jsb eight none data 相關 blog mil 選擇“安裝IBM HTTPServer”選項,點擊“安裝向導”。例如以下圖提示: 安裝提示,逐步點擊“下一步”,當中偶有幾處細節註意就可以。列舉例如以下: (1)、產品安裝路徑與先

使用bottle進行web開發5Generating Content

方便 () strings 系統 end byte 導致 res 名稱 在純粹的 WSGI中,你的應用能返回的數據類型是十分有限的,你必須返回可叠代的字符串,你能返回字符串是因為字符串是可以叠代的,但是這導致服務器將你的內容按一字符一字符的傳送,這個時候,Unicode 字

springCloud5Eureka的元數據與Eureka Server的rest端點

springcloud eureka的元數據 eureka server的rest端點 一、Eureka的元數據1.1、簡介Eureka的元數據有兩種:標準元數據和自定義元數據。標準元數據指的是主機名、IP地址、端口號、狀態頁和健康檢查等信息,這些信息都會被發布在服務註冊表中,用於服務之間的調用。

python基礎5數字和字符串類型

digi 數字 身高 isalnum 下標 spl 大小寫 () ljust 今天總結一下數據類型中的數字和字符串型。 預習: # 寫代碼,有如下變量,請按照要求實現每個功能 (共6分,每小題各0.5分) name = " aleX" # 1) 移除 name 變

轉每天一個linux命令5rm 命令

每天 幫助信息 rbo 總計 com 刪除 強行 高度 linux中 昨天學習了創建文件和目錄的命令mkdir ,今天學習一下linux中刪除文件和目錄的命令: rm命令。rm是常用的命令,該命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文

多線程面試題系列5經典線程同步 關鍵段CS

得到 bug oar -- 多線程同步 實現 unsigned 初始化 alt 上一篇提出了一個經典的多線程同步互斥問題,本篇將用關鍵段CRITICAL_SECTION來嘗試解決這個問題。本文首先介紹下如何使用關鍵段,然後再深層次的分析下關鍵段的實現機制與原理。關鍵段CRI

SDP5ScalikeJDBC- JDBC-EngineStreaming

結果 out apply text 數據 npr object cas lte 作為一種通用的數據庫編程引擎,用Streaming來應對海量數據的處理是必備功能。同樣,我們還是通過一種Context傳遞產生流的要求。因為StreamingContext比較簡單,而且還涉

SpringBoot學習筆記5處理前端JSON返回的日期的格式

處理 date() ring row 學習筆記 post 直觀 val rtt SpringBoot學習筆記(4):處理前端JSON返回的日期的格式 問題描述   前端頁面顯示的時間為毫秒格式,不利於直觀顯示! 解決方法1——後端解決 public class Flow

Linux自學筆記5Linux基礎命令

linux 基礎命令 基礎命令:date:date --help用法:date [選項]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][-ss]]date [MMDDhhmm[[cc]yy][-ss]]:設置MM:月DD:日hh:時m

《Linux學習並不難》用戶管理5修改Linux用戶賬戶

Linux 用戶 usermod 9.4 《Linux學習並不難》用戶管理(5):修改Linux用戶賬戶使用usermod命令可以更改用戶的Shell類型、所屬的組群、用戶密碼的有效期,還能更改用戶的登錄名。命令語法:usermod [選項] [用戶名]命令中各選項的含義如表所示。選項 選項含義

《Linux學習並不難》文件/目錄管理5 ls命令列出目錄和文件信息

Linux ls 7.5 《Linux學習並不難》文件/目錄管理(5): ls命令列出目錄和文件信息使用ls命令,對於目錄而言將列出其中的所有子目錄與文件信息;對於文件而言將輸出其文件名以及所要求的其它信息。 命令語法:ls [選項] [目錄|文件]命令中各選項的含義如表所示。選項 選項含義

Python從菜鳥到高手5數字

優先級 菜鳥 這一 轉換 介紹 href .com hex 包含 1 基礎知識 ??Python語言與其他編程語言一樣,也支持四則運算(加、減、乘、除),以及圓括號運算符。在Python語言中,數字分為整數和浮點數。整數就是無小數部分的數,浮點數就是有小數部分的數。例如,下