【问题标题】:how to calculate signal to noise ratio using python如何使用python计算信噪比
【发布时间】:2020-11-20 10:31:51
【问题描述】:

尊敬的专家,我有一个数据集。我只想计算数据的信噪比。数据在这里加载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' 之类的错误 如果不存在如何计算 snr,请建议使用 python 处理此数据集的其他方法。

【问题讨论】:

    标签: python scipy signal-processing


    【解决方案1】:

    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)
    

    【讨论】:

    • 但是信噪比在哪里,你能帮我在你的脚本上实现我的数据吗?
    • 它的工作......但我需要一些分贝值......类似于 1db......是否需要计算一些平均值
    • 不确定你的意思。如果signaltonoise 按预期工作,请接受答案。如果您还有其他不相关的问题,您可能需要提出一个新问题。
    • 这似乎是关于数据的问题。可能最好与数据提供者核实。
    【解决方案2】:

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

    正如 JuliettVictor 所指出的,旧的scipy implementation's source code 很容易在网上找到,并且是最常见的。为了将其转换为分贝,可以添加 。在此之前应该计算绝对值,以防信号的平均值为负:

    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 经常被滤除),这会遇到问题。

    In matlab's snr() function 使用 kaiser windowed periodogram,检测基波峰值并计算其功率。同样的情况也发生在谐波上。信号的其余部分假定为噪声,并计算其相应的功率电平。 其他方法涉及信号的低通滤波(类似于计算其平均值)。
    另一个基于 python 的示例可以在here 找到。 python中方法的不完整概述(包括基于周期图的matlab)可以找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 2014-07-25
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2014-10-31
      • 2019-02-27
      • 1970-01-01
      相关资源
      最近更新 更多