Matlab信號添加噪聲及信噪比SNR的計算

一、MATLAB中自帶的高斯白噪聲的兩個函數

 

MATLAB中產生高斯白噪聲非常方便,可以直接應用兩個函數,一個是WGN,另一個是AWGN。WGN用於產生高斯白噪聲,AWGN則用於在某一信號中加入高斯白噪聲。

 

1. WGN:產生高斯白噪聲

y = wgn(m,n,p) 產生一個m行n列的高斯白噪聲的矩陣,p以dBW爲單位指定輸出噪聲的強度。

y = wgn(m,n,p,imp) 以歐姆(Ohm)爲單位指定負載阻抗。

y = wgn(m,n,p,imp,state) 重置RANDN的狀態。

 

在數值變量後還可附加一些標誌性參數:

y = wgn(…,POWERTYPE) 指定p的單位。POWERTYPE可以是'dBW', 'dBm'或'linear'。線性強度(linear power)以瓦特(Watt)爲單位。

y = wgn(…,OUTPUTTYPE) 指定輸出類型。OUTPUTTYPE可以是'real'或'complex'。

2. AWGN:在某一信號中加入高斯白噪聲

y = awgn(x,SNR) 在信號x中加入高斯白噪聲。信噪比SNR以dB爲單位。x的強度假定爲0dBW。如果x是複數,就加入復噪聲。

y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是數值,則其代表以dBW爲單位的信號強度;如果SIGPOWER爲'measured',則函數將在加入噪聲之前測定信號強度。

y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的狀態。

y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的單位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那麼SNR以dB爲單位,而SIGPOWER以dBW爲單位。如果POWERTYPE是'linear',那麼SNR作爲比值來度量,而SIGPOWER以瓦特爲單位。

 

二、通過相關概念自編函數實現任意噪聲的疊加及信噪比的計算

 

       在信號處理中經常需要把噪聲疊加到信號上去,在疊加噪聲時往往需要滿足一定的信噪比,這樣產生二個問題,其一噪聲是否按指定的信噪比疊加,其二怎麼樣檢驗帶噪信號中信噪比滿足指定的信噪比。
在MATLAB中可以用randn產生均值爲0方差爲1的正態分佈白噪聲,但在任意長度下x=randn(1,N),x不一定是均值爲0方差爲1(有些小小的偏差),這樣對後續的計算會產生影響。在這裏提供3個函數用於按一定的信噪比把噪聲疊加到信號上去,同時可檢驗帶噪信號中信噪比。
1,把白噪聲疊加到信號上去:
function [Y,NOISE] = noisegen(X,SNR)
% noisegen add white Gaussian noise to a signal.
% [Y, NOISE] = NOISEGEN(X,SNR) adds white Gaussian NOISE to X.  The SNR is in dB.
NOISE=randn(size(X));
NOISE=NOISE-mean(NOISE);
signal_power = 1/length(X)*sum(X.*X);
noise_variance = signal_power / ( 10^(SNR/10) );
NOISE=sqrt(noise_variance)/std(NOISE)*NOISE;
Y=X+NOISE;
其中X是純信號,SNR是要求的信噪比,Y是帶噪信號,NOISE是疊加在信號上的噪聲。

2,把指定的噪聲疊加到信號上去
有標準噪聲庫NOISEX-92,其中帶有白噪聲、辦公室噪聲、工廠噪聲、汽車噪聲、坦克噪聲等等,在信號處理中往往需要把庫中的噪聲疊加到信號中去,而噪聲的採樣頻率與純信號的採樣頻率往往不一致,需要採樣頻率的校準。
function [Y,NOISE] = add_noisem(X,filepath_name,SNR,fs)
% add_noisem add determinated noise to a signal.
% X is signal, and its sample frequency is fs;
% filepath_name is NOISE's path and name, and the SNR is signal to noise ratio in dB.
[wavin,fs1,nbits]=wavread(filepath_name);
if fs1~=fs
    wavin1=resample(wavin,fs,fs1);
end
nx=size(X,1);
NOISE=wavin1(1:nx);
NOISE=NOISE-mean(NOISE);
signal_power = 1/nx*sum(X.*X);
noise_variance = signal_power / ( 10^(SNR/10) );
NOISE=sqrt(noise_variance)/std(NOISE)*NOISE;
Y=X+NOISE;
其中X是純信號,filepath_name是指定噪聲文件(.wav)的路徑和文件名,SNR是要求的信噪比,fs是信號X的採樣頻率,Y是帶噪信號,NOISE是疊加在信號上的噪聲。

3,檢驗帶噪信號的信噪比
信噪比的定義爲
           信號能量              (純信號)^2
SNR=-----------------=--------------------------
           噪聲能量        (帶噪信號-純信號)^2

function snr=SNR_singlech(I,In)
% 計算信噪比函數
% I :original signal
% In:noisy signal(ie. original signal + noise signal)
snr=0;
Ps=sum(sum((I-mean(mean(I))).^2));%signal power
Pn=sum(sum((I-In).^2));           %noise power
snr=10*log10(Ps/Pn);
其中I是純信號,In是帶噪信號,snr是信噪比

以下給出調用上函數的例子可作參考:
例一
clear all; clc; close all;
[filename,pathname]=uigetfile('*.wav','請選擇語音文件:');
[X,fs]=wavread([pathname filename]);
[Y,NOISE] = noisegen(X,10);
subplot 311; plot(X);
subplot 312; plot(NOISE);
subplot 313; plot(Y);
mn=mean(NOISE)
snr=SNR_singlech(X,Y)

例二
clear all; clc; close all;
[filename,pathname]=uigetfile('*.wav','請選擇語音文件:');
[filename1,pathname1]=uigetfile('*.wav','請選擇噪聲文件:');
filepath_name=[pathname1 filename1];
[X,fs]=wavread([pathname filename]);
[Y,NOISE] = add_noisem(X,filepath_name,10,fs);
subplot 311; plot(X);
subplot 312; plot(NOISE);
subplot 313; plot(Y);
mn=mean(NOISE)
snr=SNR_singlech(X,Y)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章