計算人聲錄音后電平的大小
這里筆記記錄一下,怎么計算已知大小的聲音,經過麥克風、聲卡錄制后軟件內錄得的音量電平值。(文章最后將計算過程整理為Python代碼,方便復用)
假設用正常說話的聲音大小65dB(SPL)來計算。思路,這里的鏈路是:人說話聲 -> 麥克風 -> 麥克風輸出電壓信號 -> 聲卡麥克風輸入 -> 電腦軟件記錄。那么計算所需的關鍵參數:
- 麥克風的靈敏度(算得麥克風輸出電壓信號所需)
- 聲卡麥克風輸入接口的最大輸入電平(軟件能錄到的最大電平值,0dBFS,音量100%的位置)
麥克風的靈敏度
假設麥克風的靈敏度是:
S m V / P a = 10 m V / P a S_{mV/Pa}=10mV/Pa SmV/Pa?=10mV/Pa
S d B V = ? 40 d B V S_{dBV}=-40dBV SdBV?=?40dBV
簡化計算過程,這里不考慮麥克風的等效輸入噪聲,不考慮麥克風輸入阻抗,也不考慮環境噪聲。
聲卡麥克風輸入規格
某款帶可調增益的聲卡麥克風輸入的部分規格如下:
- 動態范圍(A加權):116dB
- THD+N:-97dB(-1dBFS@8dB增益)
- 等效輸入噪聲(EIN)(A加權):-127dBu
- 最大輸入電平(在最小增益下):16dBu
- 增益范圍:69dB
- 輸入阻抗:3kΩ
簡化計算,假設錄音時增益設置為0,輸入阻抗不考慮,聲卡的EIN足夠小也不考慮。只取計算過程需要用的最大輸入電平:16dBu。
計算過程
聲壓級單位換算
人說話聲音聲壓級65dB(SPL)單位需要轉換為帕斯卡(Pa),否則無法根據麥克風的靈敏度公式轉換為mV。找到這兩者的關聯公式是:
SPL?(dB) = 20 log ? 10 ( P P 0 ) \text{SPL (dB)} = 20 \log_{10} \left( \frac{P}{P_0} \right) SPL?(dB)=20log10?(P0?P?)
- P 是需要算出來的帕斯卡聲壓級。
- P_0 是參考的帕斯卡聲壓級,一般取20uPa。
所以算出來是:
P = P 0 × 1 0 S P L ( d B ) 20 = 20 ( u P a ) × 1 0 65 ( d B ) 20 = 35566 ( u P a ) P = P_0 \times 10 ^ { \frac{SPL(dB)}{20} } = 20 (uPa) \times 10 ^ {\frac{65(dB)}{20} } = 35566(uPa) P=P0?×1020SPL(dB)?=20(uPa)×102065(dB)?=35566(uPa)
計算結果四舍五入保留了整數部分。
算出麥克風輸出電壓
上一步算出來的 35566(uPa) 換算為Pa單位,得到P=0.035566(Pa)。代入麥克風靈敏度公式算得:
V m i c = P × S m V / P a = 0.035566 ( P a ) × 10 ( m V / P a ) = 0.35565 ( m V ) = 3.5565 × 1 0 ? 4 ( V ) V_{mic} = P \times S_{mV/Pa}=0.035566(Pa) \times 10 (mV/Pa) = 0.35565(mV)=3.5565 \times 10^{-4}(V) Vmic?=P×SmV/Pa?=0.035566(Pa)×10(mV/Pa)=0.35565(mV)=3.5565×10?4(V)
由于聲卡靈敏度用的電壓是有效值(RMS),所以這里算出來的值也是有效值。
計算電壓和聲卡最大輸入電壓的占比
聲卡最大輸入電壓
聲卡最大輸入電平是16dBu。dBu 是一個對數單位,用于表示相對于參考值 0.775 伏特(有效值)的電壓電平。即:
V d B u = 20 × l o g 10 ( V m a x 0.775 ) V_{dBu}=20 \times log_{10}( \frac {V_{max}} {0.775}) VdBu?=20×log10?(0.775Vmax??)
V_max是聲卡最大輸入電壓(有效值,RMS)。根據公式,要計算16 dBu對應的電壓值,如下:
V m a x = 0.775 × 1 0 V d B u 20 = 0.775 × 1 0 16 ( d B u ) 20 = 4.89 ( V ) V_{max} = 0.775 \times 10^{\frac{V_{dBu}}{20}}=0.775 \times 10^{\frac{16(dBu)}{20}}= 4.89(V) Vmax?=0.775×1020VdBu??=0.775×102016(dBu)?=4.89(V)
這里保留2位小數。
計算人聲的電平數值
軟件錄音電平音量條的最大值通常是0 dBFS(dB Full Scale),這是一個數字音頻信號電平單位。dBFS表示滿度相對電平,0 dBFS的位置是系統能處理的最大音頻信號的編碼值,即最大值。實際數字音頻信號的幅度相對于這個最大值的比值即為滿度相對電平,因此實際的電平值都是負值。
在軟件中,音量條的最大值通常表示為0 dBFS,這意味著任何超過這個值的信號都會導致削波失真。為了防止失真,通常會將錄音電平設置在-3 dBFS到-6 dBFS之間,以留出一定的余量。
V m i c = 3.5565 × 1 0 ? 4 ( V ) , V m a x = 4.89 ( V ) V_{mic} = 3.5565 \times 10^{-4}(V) , \space V_{max} = 4.89(V) Vmic?=3.5565×10?4(V),?Vmax?=4.89(V)
計算dBFS如下(保留2位小數):
dBFS = 20 × log ? 10 ( V m i c V m a x ) = 20 × log ? 10 ( 3.5565 × 1 0 ? 4 ( V ) 4.89 ( V ) ) = ? 82.77 ( d B F S ) \text{dBFS} = 20 \times \log_{10} \left( \frac{V_{mic}}{V_{max}} \right)=20 \times \log_{10} \left( \frac{3.5565 \times 10^{-4}(V)}{4.89(V)} \right)=-82.77(dBFS) dBFS=20×log10?(Vmax?Vmic??)=20×log10?(4.89(V)3.5565×10?4(V)?)=?82.77(dBFS)
-82.77(dBFS)很小聲,播放出來得將音量調很大才能聽見聲音。這種情況錄音時得將增益調大。
計算過程Python實現
直接把文章復制扔給Kimi,開啟長思考,代碼實現完了。檢查了一下能跑,而且計算過程是對的。小改后如下:
# SPDX-License-Identifier: MIT
# ******************************************************************************
# (c) 2025 庵中十三居士
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# ******************************************************************************import mathdef calculate_dBFS(spl: float, mic_sensitivity_mV_Pa: float, max_input_dBu: float) -> float:'''根據聲音聲壓級、麥克風靈敏度和聲卡最大輸入電平計算錄音后軟件內的電平值(dBFS)。參數:spl (float):聲音聲壓級,單位為分貝(dB SPL)mic_sensitivity_mV_Pa (float):麥克風靈敏度,單位為毫伏每帕(mV/Pa)max_input_dBu (float):聲卡的最大輸入電平,單位為分貝伏特(dBu)返回:float:計算得到的軟件內電平值,單位為分貝滿量程(dBFS)感謝 Moonshot AI 提供的代碼實現。這份計算代碼基于庵中十三居士的文章原理編寫,幫助您將聲學參數與實際錄音電平聯系起來,方便對錄音電平進行預估和調整。'''# 聲壓級轉帕斯卡(Pa)P0 = 20 # uPa(參考聲壓級)spl_db = splPa = P0 * 10 ** (spl_db / 20)# 轉換為Pa單位(因為Pa = V/mic_sensitivity_mV_Pa)Pa = Pa / 1000000 # 將微帕轉換為帕# 計算麥克風輸出電壓(V)V_mic_mV = Pa * mic_sensitivity_mV_PaV_mic = V_mic_mV / 1000# 計算聲卡最大輸入電壓(V)V_ref_dBu = 0.775 # dBu的參考電壓max_input_V = V_ref_dBu * 10 ** (max_input_dBu / 20)# 計算dBFSdBFS = 20 * math.log10(V_mic / max_input_V)return dBFSif __name__ == "__main__":# 參數spl = 65 # 人說話聲音大小(SPL)=65dBmic_sensitivity_mV_Pa = 10 # 麥克風的靈敏度(mV/Pa)max_input_dBu = 16 # 聲卡最大輸入電平(dBu)# 計算dBFS = calculate_dBFS(spl, mic_sensitivity_mV_Pa, max_input_dBu)print(f"計算結果:dBFS = {dBFS:.2f} dBFS") # 計算結果:dBFS = -82.77 dBFS
執行之后結果:
$ python test.py
計算結果:dBFS = -82.77 dBFS
文章CSDN:庵中十三居士