信噪比、添加高斯白噪声
信噪比(Signal-to-noise ratio,縮寫為 SNR 或 S/N),也稱作信雜比或訊雜比。
信噪比,為有用信號功率(Power of Signal)與噪聲功率(Power
of Noise)的比。因此為幅度(Amplitude)比的平方:
?
matlab中噪聲功率、噪聲方差關系
以matlab中awgn函數為例說明:
????在matlab中無論是wgn還是awgn函數,實質都是由randn函數產生的噪聲。即:wgn函數中調用了randn函數,而awgn函數中調用了wgn函數。
????根據awgn的實現代碼可以知道”向已知信號添加某個信噪比(SNR)的高斯白噪聲“,即:awgn(x,snr,’measured’,'linear’),命令的作用是對原信號x添加信噪比(比值)為SNR的噪聲,在添加之前先估計信號x的強度。
????這里涉及三個問題:在awgn這個函數中,SNR是如何計算的?什么是信號的強度?awgn函數具體是如何添加噪聲的?
????事實上,前兩個問題是相關的,因為根據定義,SNR就是信號的強度除以噪聲的強度(或者信號功率與噪聲功率之比),所以,首先來講講信號的強度。其實信號的強度指的就是信號的能量,在連續的情形就是對x平方后求積分,而在離散的情形自然是求和代替積分了。在matlab中也是這樣實現的,只不過多了一個規范化步驟罷了:
???????????????????????????????????????????????????????sigPower= sum(abs(sig(: )).^2)/length(sig(: ))
這就是信號的強度,這里sig(: )為信號。
????至此,SNR的具體實現也不用多說了(注:由于采用的是比值而非db,所以與下面“計算信噪比”所使用的方式不同,即沒有求對數步驟)。
????最后說說awgn函數具體是如何添加噪聲的。事實上也很簡單,在求出x的強度后,結合指定的信噪比,就可以求出需要添加的噪聲的強度noisePower=sigPower/SNR。由于使用的是高斯白噪聲即randn函數,而randn的結果是一個強度為1的隨機序列(自己試試sum(randn(1000,1).^2)/1000就知道了,注意信號的長度不能太小)。于是,所要添加的噪聲信號顯然就是: ???????????????????
???????????????????????????????????????????????????????sqrt(noisePower)*randn(n,1)
其中n為信號長度。?
????自然要求的白噪聲的方差也可以求出來了!
?
更新程序如下:
function snr=SNR(I,In)
% 計算信號噪聲比函數
% I :original signal,原始信號
% In:noisy signal(ie. original signal +noise signal),加噪聲后的信號
% snr=10*log10(sigma2(I2)/sigma2(I2-I1))
[row,col,nchannel]=size(I);
snr=0;
if nchannel==1%gray image
Ps=sum(sum((I-mean(mean(I))).^2));%signalpower
Pn=sum(sum((I-In).^2));%noise power
snr=10*log10(Ps/Pn);
elseif nchannel==3%color image
for i=1:3
Ps=sum(sum((I(:,:,i)-mean(mean(I(:,:,i)))).^2));%signalpower
Pn=sum(sum((I(:,:,i)-In(:,:,i)).^2));%noisepower
snr=snr+10*log10(Ps/Pn);
end
snr=snr/3;
end
****************************************************************************************************************************************
一個例子:
X = sqrt(2)*sin(0:pi/1000000:6*pi);???????????????%產生正弦信號
Y = awgn(X,10,'measured'); ?????????????????????????%加入信噪比為10db的噪聲,加入前預估信號的功率(強度)
sigPower = sum(abs(X).^2)/length(X)???????????%求出信號功率
noisePower=sum(abs(Y-X).^2)/length(Y-X)??%求出噪聲功率
SNR=10*log10(sigPower/noisePower) ?????????%由信噪比定義求出信噪比,單位為db
*******************************************************************************************************************************************
關于wgn
WGN(m,n,p)產生功率為p dBW的m*n的高斯白噪聲矩陣,其中p是以dbW為單位的輸出強度。?
若要產生一個均值0,方差為0.0965?的高斯白噪聲,不可直接用WGN(N,1,0.0965)產生,而應該如下:
1. N=1000;
????x=sqrt(0.0965)*randn(N,1);
????Px=(x.'*x)/N ??% 驗證,這里Px的求法與上面noisePower=sum(abs(Y-X).^2)/length(Y-X)的求法是一致的
2. N=1000;
????y=wgn(N,1,10*log10(0.0965));
????Py=(y.'*y)/N ??% 驗證
?
一點說明,對高斯白噪聲,其方差和功率(單位為W)是一樣的。因此,對方差,要做的只是將w變換成dbw,即dbw=10log(w)。
**************************************************************************************************************************************
信噪比,英文名稱叫做SNR或S/N(Signal Noise Ratio),是指系統中信號與噪聲的比例。信號指的是來自設備外部需要通過這臺設備進行處理的電子信號,噪聲是指經過該設備后產生的原信號中并不存在的無規則的額外信號(或信息),并且該種信號并不隨原信號的變化而變化。
信噪比的計量單位是dB,其計算方法是10LOG(Ps/Pn),其中Ps和Pn分別代表信號和噪聲的有效功率,也可以換算成電壓幅值的比率關系:20LOG(Vs/Vn),Vs和Vn分別代表信號和噪聲電壓的“有效值”。信噪比應該越高越好。
?
計算通信中的信噪比SNR
% Copyright(c) Naushad Ansari, 2017. % %% Please feel free to use this open-source code for research purposes only. % %% % %% contact at naushadansari09797@gmail.com in case of any query. % %% % %% % %% This function calculates the snr of a signal with reference to original % signal. SNR can be calculated for 1-D/2-D/3-D signals. %%-----------------------------------------------------------------------%% %%-----------------------------------------------------------------------%% % %% output: snr-> snr in dB % % %% input: orgSig-> original 1-D/2-D/3-D signal (or reference signal) % recSig-> reconstructed (1-D/2-D/3-D) signal/ signal obtained % from the experiment/ signal, of which snr is to be calculated % with reference to original signal. % boun-> boun is the boundary left at the corners for the % snr calculation. default value = 0 %%-----------------------------------------------------------------------%% %%-----------------------------------------------------------------------%% function snr = calSNR(orgSig,recSig,varargin)if isempty(varargin)boun = 0; else boun = varargin{1}; endif size(orgSig,2)==1 % if signal is 1-DorgSig = orgSig(boun+1:end-boun,:);recSig = recSig(boun+1:end-boun,:); else % if signal is 2-D or 3-DorgSig = orgSig(boun+1:end-boun,boun+1:end-boun,:);recSig = recSig(boun+1:end-boun,boun+1:end-boun,:); end sigEner = norm(orgSig(:))^2; errEner = norm(orgSig(:)-recSig(:))^2; snr = 10*log10(sigEner/errEner);?
給圖像加入高斯白噪聲
關于信噪比與向已知信號添加噪聲的整理及個人心得
總結
以上是生活随笔為你收集整理的信噪比、添加高斯白噪声的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS中的 || 与 运算符详解
- 下一篇: hadoop103: Permissio