如何使用python计算信噪比

如何使用python计算信噪比,python,scipy,signal-processing,Python,Scipy,Signal Processing,亲爱的专家们,我有一个数据集,我只想计算数据的信噪比。数据在此加载 我的代码如下: 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) 但我遇到了类似importorror的错误:无法从“scipy”导入名称“si

亲爱的专家们,我有一个数据集,我只想计算数据的信噪比。数据在此加载

我的代码如下:

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) 
但我遇到了类似importorror的错误:无法从“scipy”导入名称“signaltonoise”
如果不存在如何计算snr的方法,请建议使用python使用此数据集的其他方法。

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)
资料来源:

有关docstring,请参见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)

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

正如朱丽叶·维克托所指出的那样,网上很容易找到旧版本,而且是最常见的版本。为了将其转换为分贝,需要添加 . 在此之前,如果信号的平均值为负值,则应计算绝对值:

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)))
然而,当感兴趣的信号包含更高的频率时(例如,在音频应用中,直流电通常甚至被过滤掉),这会遇到问题

使用kaiser加窗,检测基波峰值并计算其功率。谐波也是如此。假设信号的其余部分为噪声,并计算其相应的功率电平。 其他方法包括信号的低通滤波(类似于计算其平均值)。
还可以找到另一个基于python的示例。
python中的方法(包括类似matlab的基于周期图的方法)的不完整概述可以在python中找到

但是信噪比在哪里?你能帮我在你的脚本中实现我的数据吗?它可以工作…但我需要一些分贝值…比如1db…需要计算一些平均值吗?不知道你的意思。如果
signaltonoise
工作正常,请接受回答。如果你有另一个不相关的问题,你可能想开始一个新的问题。这似乎是一个关于数据的问题。最好向数据提供商咨询。