我加入另一個答案,因爲這讓我感到史蒂芬的說法並不正確,並Horchler的建議,看看裏面功能awgn
是一個很好的一個。
MATLAB或Octave(在通信工具箱中)具有功能awgn
,其增加(高斯白噪聲)以獲得期望的信噪功率電平;以下是代碼的相關部分(從八度音功能):
if (meas == 1) % <-- if using signal power to determine appropriate noise power
p = sum(abs(x(:)) .^ 2)/length(x(:));
if (strcmp(type,"dB"))
p = 10 * log10(p);
endif
endif
if (strcmp(type,"linear"))
np = p/snr;
else % <-- in dB
np = p - snr;
endif
y = x + wgn (m, n, np, 1, seed, type, out);
正如你可以順便p
(輸入數據的能力)的計算看,從史蒂芬答案似乎不是非常正確的。
您可以要求函數計算您的數據陣列的總功率,並將其與您提供的期望s/n值結合以計算所添加噪聲的適當功率電平。你這樣做是通過傳遞「測量」的字符串可選輸入中,像這樣的(見here爲Octave文檔或here的MATLAB文檔):
y = awgn (x, snr, 'measured')
這導致最終meas=1
等meas==1
是真正的上面的代碼。函數awgn
然後使用傳遞給它的信號來計算信號功率,並且從這個和期望的s/n它然後計算對於所增加的噪聲適當的功率電平。
作爲文檔進一步解釋
默認情況下,SNR和PWR被假定爲在dB和DBW 分別。該默認行爲可以通過設置爲 「dB」的類型進行選擇。在類型被設置爲「線性」的情況下,pwr被假定爲以瓦特爲單位的 ,並且snr是比率。
這意味着您可以傳遞負值或0 dB snr值。結果也將取決於您傳遞的其他選項,例如字符串「測量」。
對於MATLAB的情況,我建議閱讀documentation,它解釋瞭如何在不同的場景下使用函數awgn
。請注意,Octave和MATLAB中的實現不相同,噪聲功率的計算應該相同,但可能有不同的選項。
這裏是從wgn
相關的部分(由awgn
以上的稱呼):
if (strcmp(type,"dBW"))
np = 10^(p/10);
elseif (strcmp(type,"dBm"))
np = 10 ^((p - 30)/10);
elseif (strcmp(type,"linear"))
np = p;
endif
if(!isempty(seed))
randn("state",seed);
endif
if (strcmp(out,"complex"))
y = (sqrt(imp*np/2))*(randn(m,n)+1i*randn(m,n)); % imp=1 assuming impedance is 1 Ohm
else
y = (sqrt(imp*np))*randn(m,n);
endif
如果要檢查你的噪聲(np
)的力量,awgn
和awg
功能假定以下關係:
np = var(y,1); % linear scale
np = 10*log10(np); % in dB
其中var(...,1)
是人口方差噪聲y
。
您可以在命令窗口中查看'awgn'和'wgn'的所有代碼:type'edit awgn'或'edit wgn'。 – horchler
Steven,信號功率計算是否正確?如果你檢查定義: http://www.gaussianwaves.com/2013/12/power-and-energy-of-a-signal/ 你不會在那裏找到一個sqrt ... 此外沒有sqrt信號由您的公式和使用差異計算的權力是相同的(他們應該是)。 – Lukasz
由於許多不同的版本向信號添加噪聲,我有點困惑。我不想使用'awgn()'函數,並且僅基於想要知道如何添加特定方差和特定信噪比值的複雜噪聲的理論。 – SKM