matlab一个函数两个变量_发现MATLAB自带函数snr有一个重大陷阱

在研究MATLAB的snr函数时,发现一个重大问题:如果基波频率的功率不是最大,计算的信噪比将是错误的。该问题源于snr函数将功率最大的频率作为基波,并据此找谐波。举例说明,当第二谐波功率大于基波时,snr会错误地标定100Hz为基频,导致50Hz被误认为噪声,从而得出偏低的信噪比(9.54dB)。正确的计算应在基频50Hz功率最大时进行,以避免此类错误。
摘要由CSDN通过智能技术生成

3203d77dc6d984938d2a4a73c30c85e2.png
知乎视频​www.zhihu.com
zhihu-card-default.svg

好久没有更新专栏了, 因为最近在忙着学习信号处理, 刚研究snr(snr是用来计算信噪比的函数)源码的时候, 发现了一个重大"陷阱", 然后翻看snr的文档, 看到文档里面有明确指明了这个"陷阱".(这就是说是它是"陷阱", 而不是"bug"的原因)

b816f9cfa833d5ba334ac11a1946e3d8.png

snr的陷阱: 如果基波频率的功率不是最大的话, 计算结果是错误的

因此, 特写这篇文章是提醒大家小心使用snr.

陷阱出现的原因: snr简单的将基波频率定义为功率谱中功率最大的频率, 然后取整数倍找其他谐波.

举个让snr出错的例子:

fs = 1000;
t = 0:1/fs:1-1/fs;
x1 = cos(2*pi*50*t);
x2 = cos(2*pi*100*t);
x = x1 + 3*x2;
snr(x, fs);

340f3496c2e686bfd228c6aefc0f78b5.png

这个例子中, 基波频率应该是50Hz, 第二谐波是100Hz, 但是第二谐波的功率最大, 导致MATLAB的自带函数snr错误的将第二谐波100Hz作为了基频, 然后以100Hz的整数倍寻找其他谐波, 因此, 就忽略了50Hz, 这个的话, 50Hz就被错误地当成了噪声, 造成的最终后果是: 信噪比(9.54dB)明显偏低.

为了说明信噪比确实明显偏低了, 做一个对照(snr能够正确的计算的例子):

fs = 1000;
t = 0:1/fs:1-1/fs;
x1 = cos(2*pi*50*t);
x2 = cos(2*pi*100*t);
x = 3*x1 + x2;
snr(x, fs);

8e0364d085f83e5c68ecb3bbf9636e8e.png

这里面基频50Hz的功率最大, 因此, MATLAB的snr不会出错.

看图发现: 正确的找到了基波频率50Hz和第二谐波100Hz.

计算出来信噪比274.98 dB是正确的(这么高很正常, 因为没有加入任何噪声).

可以看出第一个例子中的信噪比(9.54dB)是明显偏低的, 是错误的.

创作不易, 请大家"素质三连": 点赞, 收藏, 分享.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值