输出信噪比公式_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的电平强度设定为0 dBW。当信号x具有复数值时,则应添加复数形式的高斯白噪声。
y = awgn(x,SNR,SIGPOWER)
当 SIGPOWER 是一个数值时,则表示其以 dBW 单位测量的信号强度;若 SIGPOWER 设定为 'measured' 值,则该函数在加入噪声之前将计算信号强度。
y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。
y = awgn(…,POWERTYPE)
确定SNR与SIGPOWER的计量单位。其取值范围限定在'dB'或'linear'两种类型。当选择'dB'时,则将SNR设定于dB尺度下衡量,并令SIGPower_采用dBW尺度。若选自选项中的线性度量,则将SNR定义为其比率表示,并令_SIGPower_采用瓦特作为基准单位。
二、通过相关概念自编函数实现任意噪声的叠加及信噪比的计算
在信号处理过程中,通常会将噪声叠加至原始信号上。为了确保有效处理效果,在叠加噪声时通常需要保证相应的信噪比水平。然而,在实际操作中可能会遇到两个问题:其一是在实际叠加过程中是否严格按照指定的信噪比执行;其二是如何验证经过带噪信号后的信噪比是否符合设定标准。
在MATLAB环境中使用randn函数可以生成均值为0、方差为1的标准正态分布白噪声序列。对于任意给定的N值,在运行x = randn(1, N)时,其实际均值和方差可能会略有偏离(尽管通常非常接近)这可能会影响后续处理结果。本节介绍三种方法用于将预先设定信噪比的噪声叠加至原始信号,并通过分析带噪信号来验证信噪比水平。
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的标准 noise 库中包含了多种类型的 background noise ,其中包括 white noise 、 office noise 、 factory noise 、 car noise 和 tank noise 等等。在 signal processing 的过程中 ,通常需要将这些 pre-defined 的 noise 添加到原始 signal 上 。然而由于不同场景下的采集设备具有不同的 work frequency ,因此这些 added noise 的 sampling frequency 常常与 pure signal 的 sampling frequency 不一致 。这就需要对采样 frequency 进行精确校准。
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)
