繁体   English   中英

如何从 python 中的波形文件中获取振幅值列表

[英]How to get list of amplitude values from a wave file in python

如何使用 python(以 dB 为单位)获取波形文件中每个帧的振幅列表?

到目前为止我有这个:

samplerate, data = wavfile.read(patternPath)
print(max((data[:, 1]).tolist())))

但是打印出0.7856917381286621 ,这没有多大意义,因为我知道 wav 文件永远不会超过 0 dB。

假设您正在寻找 dBFS,简单的答案是使用定义:

20 log (P/P0) dB
  • P:实测功率
  • P0:参考功率

在 Python 条款中:

import numpy as np

amps = [1, 0.1, 0.01] # that's the values you read from the file
dbs = 20 * np.log10(np.abs(amps)) # -> array([  0., -20., -40.])

结果是dBFS相对于满刻度的分贝(dBFS 或 dB FS)是数字系统中振幅电平的测量单位,例如具有定义的最大峰值电平的脉冲编码调制 (PCM)。

请注意,这与绝对音频电平无关,您不能从中得出 dB SPL(声压级)。 麦克风的工作是将气压变化(以 dB SPL 为单位)转换为类似的电压变化。 这种连续变化的电压会定期采样并保存为数字(您读取的幅度)。

由于您丢失了声压信息,要恢复 dB SPL,您需要校准系统并了解 ADC 范围和麦克风灵敏度。

AES17 将 0 dBFS 定义为 20*log10(FS),其中 1.0 FS 对应于峰值达到正数字满刻度的 997 Hz 正弦波的 RMS 电平。 通常认为正数字满量程为1.0。 如果您的数据以其他方式表示,则需要先进行缩放。 那么一个峰值振幅的正弦波的rms是0.707(sqrt(2)/2)是没有价值的,但是AES已经将这个定义为1.0 FS。 因此,您需要将 rms 乘以 sqrt(2) 以标准化为 AES 标准。

# create a 1 kHz sine wave for 100 ms.
data = np.sin(2*np.pi*np.arange(0,480)*1000/48000)

# measure the rms of the sine wave and convert to fs
# via sqrt(2)
fs = np.sqrt(2) * np.sqrt(np.mean(data*data))

# final step convert to dBFS
dbfs = 20*np.log10(fs)

据推测,您希望定期读取振幅。 要做到这一点,您需要获取信号(数据)并以所需的速率将其分成多个部分,然后在每个部分上运行此过程。 以 1 秒的读取间隔为例,您一次采用采样率采样数。

了解这种技术的其中一个缺陷也很值得。 也就是说,将信号斩波会导致波形的部分周期污染均方根计算(例如,采用 1kHz 波形的 1.25 毫秒)。 阅读更长的时间会减少错误项作为整体的一部分。 实际上,信号频率越低,您需要的阅读间隔时间就越长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM