jytan 发表于 2008-7-6 23:28

斗胆发一个信噪比程序,请大家拍砖

本程序只针对单一频率的信号。
原理:SNR=10*log(S/N)=10*log(S(w0)/N(w0))
即:S为信号功率谱w0处的幅值,N为信号功率谱w0领域的噪声平均。
换句话说,只把w0处的幅值看成信号的幅值,其他是噪声。
由于在功率谱,或者频谱中要分辨出有用信号,主要是看它能不能从同频噪声中脱颖而出。
所以我觉得这种定义还是比较合理的。参数文献:Sanya Mitaim等的<adaptive stochastic resonace>,文中SNR定义出现在2157页.

下面是我的程序,请拍砖:
function SNR=SNR(x,fs,f0,n)
%%%-----------------------
%x:原始数据
%fs:采样频率
%f0:信号频率
%2n:用于计算信噪比的噪声点数,即:k-n:k+n,n的初值为10.
%%%-----------------------
n=10;
dtlen=length(x);
y=abs(fft(x-mean(x)))*2/dtlen;
f=y(1:floor(dtlen/2));
ff=(0:dtlen/2-1)*fs/dtlen;
k=round(f0*dtlen/fs+1)%%求f0点对应的坐标。
% plot(ff,f.^2); %%%如果用这一行,功率谱横坐标是频率
plot(f.^2);%% 用这一行,横坐标是点数
SNR=10*log(f(k)^2/mean());

这一程序缺点在于,数据长度如果比较小,可能会不准确,我没有验证过。
另外,只能针对单频信号,多频信号没有考虑过。实际上多频信号好像只能通过平均来算吧,或者用能量总量来算。

TestGuru 发表于 2008-7-7 15:27

"S为信号功率谱w0处的幅值"是在一条谱线处求得, 还是附近多条谱线求得, 是否有校正, 是否有加窗, 有泄漏时,怎么办?
"N为信号功率谱w0领域的噪声平均", 应为平均噪声,还是总噪音能量?

[ 本帖最后由 TestGuru 于 2008-7-7 15:28 编辑 ]

jytan 发表于 2008-7-7 20:59

本帖最后由 wdhd 于 2016-9-12 13:46 编辑

原帖由 TestGuru 于 2008-7-7 15:27 发表
"S为信号功率谱w0处的幅值"是在一条谱线处求得, 还是附近多条谱线求得, 是否有校正, 是否有加窗, 有泄漏时,怎么办?
"N为信号功率谱w0领域的噪声平均", 应为平均噪声,还是总噪音能量?
因为是单频信号,所以是以单一谱线求得。
至于校正问题,如果是要求比较严格,我认为是有必要考虑的。
但是如果仅是用于对信号消噪及检测,那么没有必要考虑太细致。
对于相同的数据长度,不管你如何消噪,信号对应谱线都是那一条,位置不会发生变化,
在我们要求相对值的时候,就不必做细化谱了。

本程序中没有加窗,直接FFT。

N是平均噪声能量,因为是取局部SNR,噪声的总能量跟你所取的领域宽度相对应,所以,总能量并没有什么实际价值。
而且,在信号检测中,我想平均能量比较有意义。
从程序中也可以看出,是噪声FFT谱线的平方平均。跟总能量没有关系。

TestGuru 发表于 2008-7-8 15:14

不清楚你的SNR定义来自哪个具体应用领域,不同领域也许有不同定义,不过SNR的通常定义应为信号能量与带宽内的总噪声能量之比。除非一个FFT段内正好包含了整数个被测信号的周期,否则会有泄漏发生,因此用单一谱线的能量来表示信号能量,误差极大(大大偏小)。

jytan 发表于 2008-7-9 23:34

本帖最后由 wdhd 于 2016-9-12 13:46 编辑

原帖由 TestGuru 于 2008-7-8 15:14 发表
不清楚你的SNR定义来自哪个具体应用领域,不同领域也许有不同定义,不过SNR的通常定义应为信号能量与带宽内的总噪声能量之比。除非一个FFT段内正好包含了整数个被测信号的周期,否则会有泄漏发生,因此用单一谱线的能 ...
你说得很对,在没有整周期采样的情况下会产生泄漏,但只要保证有足够多的周期,据我的仿真和经验看,不会相差太远。
同时,对于相同数据长度,不同噪声的情况的情况对比,这样子处理从目前我的仿真结果来看还是可行的。

我觉得只要保重前后两种情况的采取的方法以及用于计算的点数相同都具有可比性。
怕以用总能量来作分量也可以,
只不过,从频域的角度看,我觉得用局部噪声的平均作分母物理意义更为明确。

TestGuru 发表于 2008-7-10 09:04

不好意思,再拍一砖。对于单频信号(含噪音和谐波失真),若不做其他处理,采用该频率处单一谱线的能量来代表该单频信号的能量,误差很大,除非采用整周期采样,否则不能用于正规的SNR指标测试。

[ 本帖最后由 TestGuru 于 2008-7-10 12:09 编辑 ]

yangzj 发表于 2008-7-10 11:09

这种方法应该是完全不妥的.例如在没有整周期采样的情况下,一个不含噪声的单频信号的功率谱如下



这时如果要按上面方法来求信噪比的话,结果信噪比肯定会小于3db了

jytan 发表于 2008-7-10 17:02

谢谢二位的意见。
正如二位所言,
非周期采样确实会产生泄漏现象。

然而,我认为当数据长度足够,峰值幅值不太相差太大。
同时,在选择作为噪声点数的时候n取太小没有太大的意义,
应该取大一些。
即领域宽一些。
这样子平均下来可以适当消除泄漏产生的影响。

在信号频率未知的情况下,是难以做到非周期采样的,
同时,在相同的采样长度的情况下,泄漏情况也是相同的,
所以个人认为,用本方法所作的SNR仍然具有参考价值。

请二位批评,指正。

ps:请教楼上,如何把图放在帖子的固定部位。。
我只会以附件形式放在帖子的最后面。。汗。。。

[ 本帖最后由 jytan 于 2008-7-10 17:15 编辑 ]

TestGuru 发表于 2008-7-10 18:13

单频信号的能量从峰值谱线向两旁的多条谱线泄漏,不会因为数据点数的增多而减弱,峰值谱线两旁始终都会有幅度与其相差不远的几条谱线,这是由于矩形窗的特性决定的。

[ 本帖最后由 TestGuru 于 2008-7-10 18:18 编辑 ]

yangzj 发表于 2008-7-10 18:58

楼上正解,泄露大小是跟点数没有必然关系的,只要实际频率处于两条谱线之间就存在泄露,刚好处在中间时泄露最大.
加窗能减小泄露,但主瓣加宽,主瓣内谱线条数增多,加窗时用主瓣内所有谱线的功率和做为信号的功率是比较可行的,这时只有和信号同频的噪声会影响结果的正确性
页: [1]
查看完整版本: 斗胆发一个信噪比程序,请大家拍砖