输出信噪比计算.docx

上传人:b****7 文档编号:16543080 上传时间:2023-07-14 格式:DOCX 页数:9 大小:20.03KB
下载 相关 举报
输出信噪比计算.docx_第1页
第1页 / 共9页
输出信噪比计算.docx_第2页
第2页 / 共9页
输出信噪比计算.docx_第3页
第3页 / 共9页
输出信噪比计算.docx_第4页
第4页 / 共9页
输出信噪比计算.docx_第5页
第5页 / 共9页
输出信噪比计算.docx_第6页
第6页 / 共9页
输出信噪比计算.docx_第7页
第7页 / 共9页
输出信噪比计算.docx_第8页
第8页 / 共9页
输出信噪比计算.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

输出信噪比计算.docx

《输出信噪比计算.docx》由会员分享,可在线阅读,更多相关《输出信噪比计算.docx(9页珍藏版)》请在冰点文库上搜索。

输出信噪比计算.docx

输出信噪比计算

functionsnr_vec=fftdisto(x,C,varargin)

%FFTDISTOcomputedistortionofsinusoidalsignal

%SNR_VEC=FFTDISTO(X,C,N)

%input:

%xsignalvector

%CnumberoffullsinusoidsinX

%Nlengthofsignaltoconsider(mustbeapowerof2)

%onlyNlastsamplesinxareusedinfft

%outputvector:

%1pwrsignalpower[dB](amplitude1-->0dB)

%2sndrsignal-to-noise+distortionratio(DComitted)[dB]

%3snronlyuncorrelatednoise(harmonics+DComitted)[dB]

%4sdrsignal-to-distortion(onlyharmonics,noise+DComitted)[dB]

%5tdhtotalharmonicdistortion[%]

%NOTE:

makeN>6*C-->

%considersonlyapprox.firstN/2Charmonics,

%restaretreatedasnoise

ifnargin>3

fprintf('nargin=%d\n',nargin)

error('Toomanyarguments.');

end

N=length(x);

ifnargin==3

ifvarargin{1}>N

error('Nexceedslength(x)');

end

lenx=N;

N=varargin{1};

iflenx>N

x(1:

(lenx-N))=[];

end

end

N2=0.5*N;

iflog2(N2)~=round(log2(N2))

error('Nmustbepowerof2');

end

ifC>N2

error('C>N/2(signalfrequency>samplingfrequency');

end

ifN<6*C

%warning('computinglessthan3harmonics!

');

end

a=abs(fft(x))/N2;%amplitudevector

p=a.*a;%powervector

dc=1;%indexofDCcomponent

sig=C+1;%indexofsignal

harm=(2*C+1):

C:

N2;%indicesofharmonics

noise=1:

N2;noise([dcsigharm])=[];

%indicesofnoise

sp=p(sig)+1e-100;%signalpower

dp=sum(p(harm))+1e-100;%distortionpower

np=sum(p(noise))+1e-100;%noisepower(notincludingdistortion)

snr_vec=zeros(1,5);

snr_vec

(1)=dB10(sp);

snr_vec

(2)=dB10(sp/(np+dp));

snr_vec(3)=dB10(sp/np);

snr_vec(4)=dB10(sp/dp);

snr_vec(5)=100*sqrt(dp/sp);

 

matlab中的信噪比

(2011-03-2219:

52:

49)

标签:

信噪比

杂谈

分类:

学习

以高斯噪声为例:

若有用信号s(n)的最大幅度am,要求得到的信噪比为p,则p=10log10[(am^2)/b^2],用这个公式反推出高斯噪声的方差b^2,若s(n)单通道实信号,则Matlab程序就是x=s+b*randn(size(s));若s(n)是正交双通道信号,则Matlab程序就是x=s+b/sqrt

(2)*randn(size(s))。

如果s(n)是一个N行、2列的复信号,前后两列各表示实部和虚部,则b/sqrt

(2)*randn(size(s))产生的也是N×2的高斯分布噪声,实部和虚部的方差均为b/sqrt

(2)。

实部和虚部分别产生也可以,但不能用b*randn(size(s))。

第一,如果这样产生噪声,那么最终信号的信噪比应该用p=10log10[(am^2)/(2*b^2)];第二,不能用size(s),应该用size(c),c为s(n)的实(虚)部列矢量的长度。

 

Matlab中计算信噪比方式:

%===========================Happy===================================%

functionsnr=SNR(I,In)

%计算信号噪声比函数

%byQulei

%I:

originalsignal

%In:

noisysignal(ie.Originalsignal+noisesignal)

%snr=10*log10(sigma2(I2)/sigma2(I2-I1))

[row,col,nchannel]=size(I);

snr=0;

ifnchannel==1%grayimage

Ps=sum(sum((I-mean(mean(I))).^2));%signalpower

Pn=sum(sum((I-In).^2));%noisepower

snr=10*log10(Ps/Pn);

elseifnchannel==3%colorimage

fori=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

%===================================================================%

转:

符号的平均功率每比特信号能量/符号周期

SNR信噪比=-------------------------=-----------------------------------------=

噪声的平均功率噪声单边功率普密度*符号带宽

Eb/T在限带情况下T*B=1Eb

=----------==================---------

N0*BN0

实际系统中噪声的单边功率普密度N0受温度和常数K决定的,在一定条件下为固定值;信噪比与信号能量的强弱成正比。

在仿真中,为了简化模型,通常采用固定输入信号幅度,改变N0来起到SNR的变化。

其中的Eb是在相干接收条件下解调后信号能量,而系统接收的信噪比通常是加在接收输入端,也就是解调前。

为了令Eb在解调前后的能量统一,在发送端必须采用能量的归一化。

归一化方法:

_x(n)

x(n)=--------------------------n属于(1,N)N为1bit内采样点数

sqrt(Sum(x(n)^2))

MATLAB仿真中信噪比的添加方法:

1.发端首先进行能量归一化

2.在收端根据同样的采样率计算1bit长度的能量即Eb

3.SNR=10log(ebno)=>ebno=Eb/N0=>N0=Eb/ebno

4.N0=2(sigma)^2=>sigma=sqrt(N0/2)

5.noise=sigma*randn(1,0)添加高斯白噪声

=================================转载======================================

说起“向已知信号添加噪声”,有一个帖子不得不提,那是由happy教授介绍的两个常用函数,我这里引用一下:

%=============================happy=================================%

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'。

线性强度(linearpower)以瓦特(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以瓦特为单位。

注释

1.分贝(decibel,dB):

分贝(dB)是表示相对功率或幅度电平的标准单位,换句话说,就是我们用来表示两个能量之间的差别的一种表示单位,它不是一个绝对单位。

例如,电子系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表示,即事先取一个电压或电流作为参考值(0dB),用待表示的量与参考值之比取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。

2.分贝瓦(dBW,dBWatt):

指以1W的输出功率为基准时,用分贝来测量的功率放大器的功率值。

3.dBm(dB-milliWatt):

即与1milliWatt(毫瓦)作比较得出的数字。

0dBm=1mW

10dBm=10mW

20dBm=100mW

也可直接用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的M*N的随机数矩阵,可以用

y=o*randn(M,N)+u得到。

对于均匀分布,若要产生[a,b]区间的均匀分布的M*N的随机数矩阵,则可以用

y=rand(M,N)*(b-a)+a得到。

%===================================================================%

上述资料基本上完整地描述了原始问题,不过有几点内容附带说明一下:

1.首先更正一个错误,我认为在“生成N(0.0128,0.9596)的高斯分布序列”的程序中,应该改为以下的代码:

%===================eight=====================================%

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(:

)).^2)/length(sig(:

))

这就是信号的强度。

至此,SNR的具体实现也不用多说了(注:

由于采用的是比值而非db,所以与下面“计算信噪比”所使用的方式不同,即没有求对数步骤)。

最后说说awgn函数具体是如何添加噪声的。

事实上也很简单,在求出f的强度后,结合指定的信噪比,就可以求出需要添加的噪声的强度noisePower=sigPower/SNR。

由于使用的是高斯白噪声即randn函数,而randn的结果是一个强度为1的随机序列(自己试试sum(randn(1000,1).^2)/1000就知道了,注意信号的长度不能太小)。

于是,所要添加的噪声信号显然就是:

sqrt(noisePower)*randn(n,1),其中n为信号长度。

4.上面所说的都是具有分布特性(相关的)随机序列,如果需要添加不相关的随机序列,则可以使用jimin版友的方法:

%========================jimin=======================================%

fori=1:

100

x(i)=randn

(1);

end

%===================================================================%

即先产生噪声信号,后再与原信号叠加。

最后是另外的一些常见问题,整理如下:

1.Matlab中如何产生值为0,1的随机序列?

【转bainhome版友】:

round(rand(5))

2.Matlab中如何计算信噪比?

下面的代码转自Happy教授:

%===========================Happy===================================%

functionsnr=SNR(I,In)

%计算信号噪声比函数

%byQulei

%I:

originalsignal

%In:

noisysignal(ie.Originalsignal+noisesignal)

%snr=10*log10(sigma2(I2)/sigma2(I2-I1))

[row,col,nchannel]=size(I);

snr=0;

ifnchannel==1%grayimage

Ps=sum(sum((I-mean(mean(I))).^2));%signalpower

Pn=sum(sum((I-In).^2));%noisepower

snr=10*log10(Ps/Pn);

elseifnchannel==3%colorimage

fori=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

%===================================================================%

3.随机产生1-n的索引排列:

randperm函数

请问八兄

“也就是说,可以直接使用上面两个函数对原始信号添加噪声(例如y=x+rand(length(x),1)或者y=x+randn(length(x),1))”

用RANDN函数添加是不是还要考虑原信号啊

RANDN函数只是提供了随机数还需要考虑原信号的数量级和加躁的百分比

那式子应该怎么写呢

我现在用Y=X+%*RANDN(SIZE(X))*COV(X);X是原信号,为多维矩阵

感觉不对

能不能给讲讲

谢谢

的确需要考虑原信号的幅值问题,你可以先把原信号规范化一下(先减去均值,然后除以标准差),再与randn生成的随机噪声相加

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2