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


轉載自:http://blog.csdn.net/han____shuai/article/details/51087383

一、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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM