gpt4 book ai didi

python - 在二维数组上使用贝叶斯统计分析进行音频过滤的笨拙建议

转载 作者:行者123 更新时间:2023-12-03 00:25:05 28 4
gpt4 key购买 nike

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

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

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

from scipy.io import wavfile
rate, audio = wavfile.read('test.wav')

buckets = 64
nperseg = buckets * 2
noverlap = 10

freq, time, density = signal.spectrogram(audio, fs=rate, window='hann',
nperseg=nperseg, noverlap=noverlap,
detrend=False, scaling='density')

stdev = density.std(1)
mean = density.mean(1)

问题

我希望将基于音频功率密度二维numpy数组 density的函数应用到 results中。结果是功率密度的高对比度二维数组,其中值是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,那就更好了,因为我也在学习。

是否有内置的numpy函数(如map()函数)将数组位置的索引作为参数传递?在这种情况下,我不会为就地数组操作而烦恼,因为我也在腌制和绘制 densityresults

最佳答案

一种方法是使用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循环。希望这可以帮助。

关于python - 在二维数组上使用贝叶斯统计分析进行音频过滤的笨拙建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60962424/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com