如何使用python计算信噪比

新手上路,请多包涵

亲爱的专家们,我有一个数据集。我只想计算数据的信噪比。数据在这里加载 https://i.fluffy.cc/jwg9d7nRNDFqdzvg1Qthc0J7CNtKd5CV.html

我的代码如下:

 import numpy as np
from scipy import signaltonoise
import scipy.io
dat=scipy.io.loadmat('./data.mat')
arr=dat['dn']
snr=scipy.stats.signaltonoise(arr, axis=0, ddof=0)

但我收到类似 importError: cannot import name ‘signaltonoise’ from ‘scipy’ if it doesn’t exist 如何计算 snr,请建议使用 python 使用此数据集的其他方法。

原文由 user13869189 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

scipy.stats.signaltonoise 在 scipy 1.0.0 中被移除。您可以降级 scipy 版本或自己创建函数:

 def signaltonoise(a, axis=0, ddof=0):
    a = np.asanyarray(a)
    m = a.mean(axis)
    sd = a.std(axis=axis, ddof=ddof)
    return np.where(sd == 0, 0, m/sd)

来源: https ://github.com/scipy/scipy/blob/v0.16.0/scipy/stats/stats.py#L1963

请参阅文档字符串的 github 链接。

编辑:完整的脚本将如下所示

import numpy as np
import scipy.io

def signaltonoise(a, axis=0, ddof=0):
    a = np.asanyarray(a)
    m = a.mean(axis)
    sd = a.std(axis=axis, ddof=ddof)
    return np.where(sd == 0, 0, m/sd)

dat = scipy.io.loadmat('./data.mat')
arr = dat['dn']
snr = signaltonoise(arr)

原文由 JuliettVictor 发布,翻译遵循 CC BY-SA 4.0 许可协议

更一般地说,这取决于应用程序。对于许多应用程序,均值和标准差之间的关系可能就足够了。

正如 JuliettVictor 指出的那样,旧 的 scipy 实现的源代码 可以很容易地在网上找到,并且是最常见的。为了将其转换为分贝,可以添加.在此之前应该计算绝对值,以防信号的平均值为负:

 def signaltonoise_dB(a, axis=0, ddof=0):
    a = np.asanyarray(a)
    m = a.mean(axis)
    sd = a.std(axis=axis, ddof=ddof)
    return 20*np.log10(abs(np.where(sd == 0, 0, m/sd)))

但是,当感兴趣的信号包含更高频率时(例如,在音频应用中,在这里,DC 通常甚至被滤除),这会遇到问题。

在 matlab 的 snr() 函数 中,使用了凯撒窗口 周期图,检测基波的峰值并计算其功率。谐波也是如此。假定信号的其余部分是噪声,并计算它们相应的功率电平。其他方法涉及信号的低通滤波(类似于计算其平均值)。

可以在 此处 找到另一个基于 python 的示例。可以在 此处 找到 python 中方法的不完整概述(包括类似基于周期图的 matlab)

原文由 Patrik Lechner 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题