1. 程式人生 > >matlab函式wgn,awgn用法整理

matlab函式wgn,awgn用法整理

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以瓦特為單位。
    註釋
  3. 分貝(decibel,dB):分貝(dB)是表示相對功率或幅度電平的標準單位,換句話說,就是我們用來表示兩個能量之間的差別的一種表示單位,它不是一個絕對單位。例如,電子系統中將電壓、電流、功率等物理量的強弱通稱為電平,電平的單位通常就以分貝表示,即事先取一個電壓或電流作為參考值(0dB),用待表示的量與參考值之比取對數,再乘以20作為電平的分貝數(功率的電平值改乘10)。
  4. 分貝瓦(dBW, dB Watt):指以1W的輸出功率為基準時,用分貝來測量的功率放大器的功率值。
  5. dBm (dB-milliWatt):即與1milliWatt(毫瓦)作比較得出的數字。
    0 dBm = 1 mW
    10 dBm = 10 mW
    20 dBm = 100 mW
    也可直接用randn函式產生高斯分佈序列,例如:

程式程式碼
y=randn(1,2500);
y=y/std(y);
y=y-mean(y);
a=0.0128;
b=sqrt(0.9596);
y=a+b*y;

就得到了 N ( 0.0128, 0.9596 ) 的高斯分佈序列
產生指定方差和均值的隨機數
設某個隨機變數x均值為mu,方差為var^2,若要產生同樣分佈的隨機變數y,但使新的隨
機變數引數改變,均值為mu_1,方差為var_1^2,可以用如下公式進行變換:
y=var_1/var*(x-mu)+mu_1,其中x為隨機變數,其餘為常數(原分佈引數)。
具體到正態分佈,若要產生均值為u,方差為o^2的MN的隨機數矩陣,可以用
y=o
randn(M,N)+u得到。
對於均勻分佈,若要產生[a,b]區間的均勻分佈的MN的隨機數矩陣,則可以用
y=rand(M,N)
(b-a)+a得到。
%===========================================================%
上述資料基本上完整地描述了原始問題,不過有幾點內容附帶說明一下:

  1. 首先更正一個錯誤,我認為在“生成N ( 0.0128, 0.9596 ) 的高斯分佈序列”的程式中,應該改為以下的程式碼:

程式程式碼
y=randn(1,2500);
y=y-mean(y);
y=y/std(y);
a=0.0128;
b=sqrt(0.9596);
y=a+b*y;
2. 上面資料最後部分隱含了一個出自zhyuer 版友的結論:
%zhyuer=========%

  1.     rand產生的是[0,1]上的均勻分佈的隨機序列
    
  2.     randn產生均值為0,方差為1的高斯隨機序列,也就是白噪聲序列;
    

%===================================================================%
也就是說,可以直接使用上面兩個函式對原始訊號新增噪聲(例如y=x+rand(length(x),1)或者y=x+randn(length(x),1))
3.事實上,無論是wgn還是awgn函式,實質都是由randn函式產生的噪聲。即,wgn函式中呼叫了randn函式,而awgn函式中呼叫了wgn函式。下面就我熟悉的“向已知訊號新增某個信噪比(SNR)的高斯白噪聲”來說明一下,不過如果大家閱讀過awgn的實現程式碼就不用看下去了,呵呵。從上述可知,這個任務可以使用awgn函式實現,具體命令是:awgn(x,snr,’measured’,'linear’),命令的作用是對原訊號f(x)新增信噪比(比值)為SNR的噪聲,在新增之前先估計訊號f的強度。這裡涉及三個問題:在awgn這個函式中,SNR是如何計算的?什麼是訊號的強度?awgn函式具體是如何新增噪聲的?事實上,前兩個問題是相關的,因為根據定義,SNR就是訊號的強度除以噪聲的強度,所以,首先來講講訊號的強度。其實訊號的強度指的就是訊號的能量,在連續的情形就是對f(x)平方後求積分,而在離散的情形自然是求和代替積分了。在matlab中也是這樣實現的,只不過多了一個規範化步驟罷了:
sigPower = sum(abs(sig(