如何使用 python 计算信噪比
how to calculate signal to noise ratio using python
尊敬的专家我有一个数据set.i只是想计算数据的信噪比。数据在此处加载 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 的错误:无法从 '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)
来源:https://github.com/scipy/scipy/blob/v0.16.0/scipy/stats/stats.py#L1963
有关文档字符串,请参阅 github link。
编辑:完整脚本如下所示
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 指出的那样,旧的 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 a kaiser windowed periodogram,检测基波的峰值并计算其功率。谐波也是如此。假定信号的其余部分是噪声,并计算它们相应的功率电平。
其他方法涉及信号的低通滤波(类似于计算其平均值)。
可以找到另一个基于 python 的示例 here。
可以在 here
中找到 python 中方法的不完整概述(包括类似基于周期图的 matlab)
尊敬的专家我有一个数据set.i只是想计算数据的信噪比。数据在此处加载 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 的错误:无法从 '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)
来源:https://github.com/scipy/scipy/blob/v0.16.0/scipy/stats/stats.py#L1963
有关文档字符串,请参阅 github link。
编辑:完整脚本如下所示
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 指出的那样,旧的 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 a kaiser windowed periodogram,检测基波的峰值并计算其功率。谐波也是如此。假定信号的其余部分是噪声,并计算它们相应的功率电平。
其他方法涉及信号的低通滤波(类似于计算其平均值)。
可以找到另一个基于 python 的示例 here。
可以在 here