Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二维阵列上基于贝叶斯统计分析的音频滤波Numpy建议_Python_Numpy_Loops_Audio - Fatal编程技术网

Python 二维阵列上基于贝叶斯统计分析的音频滤波Numpy建议

Python 二维阵列上基于贝叶斯统计分析的音频滤波Numpy建议,python,numpy,loops,audio,Python,Numpy,Loops,Audio,我正在尝试创建一个音频过滤器,它将使用贝叶斯统计方法抑制现场记录中的背景噪声。现场的典型音频包含标准水平的背景噪声,在我的情况下,当我试图检测前景噪声时,这是不需要的 使用numpy和scipy可以分析音频以确定样本的统计标准偏差 在我的环境中,前景噪声通常具有与背景不同的功率密度。i、 e.密度值>=(2个标准偏差+平均值)功率密度(每个dft频率单元) 问题 我希望在结果中应用一个基于音频功率密度密度的二维numpy数组的函数。结果是一个高对比度的二维功率密度阵列,其中的值为0.0或1.0

我正在尝试创建一个音频过滤器,它将使用贝叶斯统计方法抑制现场记录中的背景噪声。现场的典型音频包含标准水平的背景噪声,在我的情况下,当我试图检测前景噪声时,这是不需要的

使用numpy和scipy可以分析音频以确定样本的统计标准偏差

在我的环境中,前景噪声通常具有与背景不同的功率密度。i、 e.密度值>=(2个标准偏差+平均值)功率密度(每个dft频率单元)

问题

我希望在
结果中应用一个基于音频功率密度
密度的二维numpy数组的函数。结果是一个高对比度的二维功率密度阵列,其中的值为0.0或1.0

使用二维数据,我正在检测音频录制('.wav'文件)的选择,这些文件包含或不包含感兴趣的前景声音。然后,我可以根据需要将文件切成一口大小的块。我有大量+100MB wav文件,所以时间很重要

results = np.zeros((w,h))
sampleMean = mean.mean() # Average of averages

w,h = density.shape
for ww in range(w):
    for hh in range(h):

        # power density value
        v0 = density[ww][hh]

        # power density cutoff limit
        v1 = (2 * stdev[ww]) + mean[ww]

        if v0 > v1 and v0 > sampleMean:
            results[ww][hh] = 1.0
这个循环可以工作,但是启动起来又慢又难看。它应该能够避免编写循环,但我有点像个傻瓜。我能得到一些帮助吗?如果答案是pep8,那就更好了,我也在学习


是否有像map()函数这样的内置numpy函数,它将数组位置的索引作为参数传递?在本例中,我并不担心就地数组操作,因为我也在酸洗和绘制
密度
结果

一种方法是使用np.repeat将stddev矩阵和平均矩阵扩展到密度数组的大小。因此,如果您只是矢量化而不是使用嵌套for循环,它可能会显著加快速度。然后你可以这样做,我假设stdev,v1,意思是numpy数组

v1 = (2*stdev) + mean
v1_new = np.repeat(np.expand_dims(v1,axis=0), repeats = h, axis=0)
result[density>sampleMean and density>v1_new] = 1

这将只是矢量化操作,而不是使用for循环。希望这有帮助。

谢谢。获取ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()尝试结果[np.logical_和(Sxp>sampleMean,Sxp>v1_new)]=1抛出值错误:操作数无法与形状(65381691)(381691,65)一起广播。您只需对数组进行转置,就可以看到形状大小相同,只需使用
np.transposse
v1 = (2*stdev) + mean
v1_new = np.repeat(np.expand_dims(v1,axis=0), repeats = h, axis=0)
result[density>sampleMean and density>v1_new] = 1