簡體   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