[英]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
在 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.