好久没有更新专栏了, 因为最近在忙着学习信号处理, 刚研究snr(snr是用来计算信噪比的函数)源码的时候, 发现了一个重大"陷阱", 然后翻看snr的文档, 看到文档里面有明确指明了这个"陷阱".(这就是说是它是"陷阱", 而不是"bug"的原因)
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);
这个例子中, 基波频率应该是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);
这里面基频50Hz的功率最大, 因此, MATLAB的snr不会出错.
看图发现: 正确的找到了基波频率50Hz和第二谐波100Hz.
计算出来信噪比274.98 dB是正确的(这么高很正常, 因为没有加入任何噪声).
可以看出第一个例子中的信噪比(9.54dB)是明显偏低的, 是错误的.
创作不易, 请大家"素质三连": 点赞, 收藏, 分享.