gpt4 book ai didi

python - audioop.rms() - 为什么它与普通 RMS 不同?

转载 作者:太空狗 更新时间:2023-10-29 22:23:28 56 4
gpt4 key购买 nike

我正在编写一个 python 函数来返回 .wav 文件的响度。 RMS 似乎是最好的指标, Detect and record a sound with pythonaudioop.rms() 可以解决问题,但我想避免将 audioop 作为依赖项,并且我已经导入了 numpy。但我没有得到相同的 RMS 值,如果能帮助我理解正在发生的事情,我将不胜感激。

audioop page 中,它表示 rms 计算正是您所期望的,即 sqrt(sum(S_i^2)/n),其中,S_i 是第 i 个声音样本。看起来这不是火箭科学。

为了使用 numpy,我首先将声音转换为 numpy 数组,并且始终看到相同的最小值/最大值和相同的数据长度(因此转换似乎没问题)。

>>> d = np.frombuffer(data, np.int16)
>>> print (min(d), max(d)), audioop.minmax(data,2)
(-2593, 2749) (-2593, 2749)

但我得到了非常不同的 RMS 值,甚至没有接近球场:

>>> numpy_rms = np.sqrt(sum(d*d)/len(d))
>>> print numpy_rms, audioop.rms(data, 2)
41.708703254716383, 120

它们之间的区别是可变的,我看不到明显的模式,例如,我也得到:

63.786714248938772, 402
62.779300661773405, 148

我的 numpy RMS 代码给出了与这里相同的输出:Numpy Root-Mean-Squared (RMS) smoothing of a signal

我看不出哪里出错了,但有些地方不对劲。非常感谢任何帮助。


编辑/更新:

如果它有用,这是我最终得到的代码。它不如 audioop 快,但仍然足够快,足以满足我的目的。值得注意的是,使用 np.mean() 比我使用 python sum() 的版本快得多(~100 倍)。

def np_audioop_rms(data, width):
"""audioop.rms() using numpy; avoids another dependency for app"""
#_checkParameters(data, width)
if len(data) == 0: return None
fromType = (np.int8, np.int16, np.int32)[width//2]
d = np.frombuffer(data, fromType).astype(np.float)
rms = np.sqrt( np.mean(d**2) )
return int( rms )

最佳答案

使用 double 执行计算,如 audioop.rms() code :

d = np.frombuffer(data, np.int16).astype(np.float)

例子

>>> import audioop, numpy as np
>>> data = 'abcdefgh'
>>> audioop.rms(data, 2)
25962
>>> d = np.frombuffer(data, np.int16)
>>> np.sqrt((d*d).sum()/(1.*len(d)))
80.131142510262507
>>> d = np.frombuffer(data, np.int16).astype(np.float)
>>> np.sqrt((d*d).sum()/len(d))
25962.360851817772

关于python - audioop.rms() - 为什么它与普通 RMS 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763471/

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