中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用python處理原始音頻數據

發布時間:2022-01-04 14:44:55 來源:億速云 閱讀:168 作者:iii 欄目:開發技術

本篇內容介紹了“怎么利用python處理原始音頻數據”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、基礎知識

PCM(pulse code modulation) ,即脈沖編碼調制,是將模擬信號轉為數字信號的一種編碼系統。而模數轉換主要分兩步,首先對連續的模擬信號進行采樣,然后把采樣得到的數據轉化為數值,即量化。

設x xx為輸入信號,F ( x ) F(x)F(x)為量化后的信號,則F ( x ) F(x)F(x)既可以是線性的,也可以是非線性的。在audioop中,主要提供三種編碼支持,分別是a-Lawμ-Law以及ADPCM

怎么利用python處理原始音頻數據

在中國和歐洲主要實用的編碼方式為A-Law,其表達式為:

怎么利用python處理原始音頻數據

其中A AA為壓縮系數,在G.726標準中建議87.56。

ADPCM(Adaptive Differential PCM),即自適應差分PCM。

由于模擬信號的連續性,一般來說相鄰時間單位的信號往往具有較高的線性度,甚至彼此相差無幾,從而可以被高效率的壓縮。然而,也存在跳躍幅度較大的信號,如果完全以緩變為原則,那么必然會丟失這部分數據。為了均衡這種差異,就需要進行自適應量化。

audioop中支持的Intel/DVI ADPCM算法可以在網上找到,但是信息并不多而且都很老舊,貌似不太重要的樣子,甚至知網都搜不到,所以這里就不詳細解讀了。

二、轉換函數

audioop提供了ADPCMA-Lawμ-Law和線性采樣之間的轉換函數

采樣ADPCMA-Lawμ-Law
lin2linlin2adpcmlin2alawlin2ulaw
 adpcm2linalaw2linulaw2lin

其中,與A-Lawμ-Law有關的轉換函數的輸入參數為(fragment, width),分別代表待處理片段和位寬;adpcm則會多一個state元組作為第三個參數,表示編碼器狀態。

lin2lin是將線性片段在1、2、3 和 4 字節格式之間轉換的函數,其輸入參數為(fragment, width, newwidth)。

下面新建一些數據來測試一下編碼轉換函數,

#下面代碼來自于test_audioop.py
import audioop
import sys
import unittest

pack = lambda width, data :b''.join(
    v.to_bytes(width, sys.byteorder, signed=True) for v in data)

packs = {w: (lambda *data, width=w: pack(width, data)) for w in (1, 2, 3, 4)}

unpack = lambda width, data: [int.from_bytes(
    data[i: i + width], sys.byteorder, signed=True)
    for i in range(0, len(data), width)]

datas = {
    1: b'\x00\x12\x45\xbb\x7f\x80\xff',
    2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1),
    3: packs[3](0, 0x123456, 0x456789, -0x456789, 0x7fffff, -0x800000, -1),
    4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab,
                0x7fffffff, -0x80000000, -1),
}

則datas的值為:

>>> for key in datas : print(datas[key])
...
b'\x00\x12E\xbb\x7f\x80\xff'
b'\x00\x004\x12gE\x99\xba\xff\x7f\x00\x80\xff\xff'
b'\x00\x00\x00V4\x12\x89gEw\x98\xba\xff\xff\x7f\x00\x00\x80\xff\xff\xff'
b'\x00\x00\x00\x00xV4\x12\xab\x89gEUv\x98\xba\xff\xff\xff\x7f\x00\x00\x00\x80\xff\xff\xff\xff'
>

則其轉換函數測試如下:

>>> datas[1]
b'\x00\x12E\xbb\x7f\x80\xff'        #將要處理的1位線性碼
>>> unpack(1,datas[1])
[0, 18, 69, -69, 127, -128, -1]     #轉為整型
# 將1字節線性碼轉為2字節線性碼
>>> datas1_2 = audioop.lin2lin(datas[1], 1, 2)
>>> print(datas1_2)
b'\x00\x00\x00\x12\x00E\x00\xbb\x00\x7f\x00\x80\x00\xff'
>>> unpack(2,datas1_2)    #轉為整型,其值為datas[1]*256
[0, 4608, 17664, -17664, 32512, -32768, -256]
# 將1字節線性碼轉為1字節u-Law碼
>>> datas1_u = audioop.lin2ulaw(datas[1], 1)
>>> unpack(1,datas1_u)   #轉為整型,這個數和u-law的公式對不上,可能是其他算法
[-1, -83, -114, 14, -128, 0, 103]

三、片段特征函數

下表中函數的輸入為(fragment, width),分別代表待統計片段和位寬。

 返回值
avg片段采樣值的均值
avgpp片段采樣值的平均峰峰值
max片段采樣值的最大絕對值
maxpp聲音片段中的最大峰峰值
minmax由片段采樣值中最小和最大值組成的元組
rms片段的均方根
cross片段穿越零點的次數

getsample(fragment, width, index),顧名思義用于采樣,返回段中采樣值索引index的值。

findfactor(fragment, reference),返回一個系數F使得rms(add(fragment, mul(reference, -F)))最小,即返回的系數乘以reference后與fragment最匹配。兩個片段都應包含 2 字節寬的采樣。

findfit(fragment, reference),盡可能嘗試讓 reference 匹配 fragment 的一部分。

findmax(fragment, length),在fragment中搜索所有長度為length的采樣切片中,能量最大的那一個切片,即返回 i 使得 rms(fragment[i*2:(i+length)*2]) 最大。

四、片段操作

其返回值均為片段,下表的參數中,f表示fragment,w表示width,L表示lfactor,R表示rfactor

怎么利用python處理原始音頻數據

audioop.ratecv(f, w, nchannels, inrate, outrate, state[, weightA[, weightB]])

可用于轉換輸入片段的幀速率,其中

  • state為元組,表示轉換器狀態

  • weightA和weightB是簡單數字濾波器的參數,默認為 1 和 0。

“怎么利用python處理原始音頻數據”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭锦后旗| 江川县| 太原市| 罗源县| 赤壁市| 沭阳县| 娄底市| 科尔| 明溪县| 云阳县| 黄浦区| 丘北县| 建昌县| 大冶市| 蒙山县| 车险| 灵石县| 镶黄旗| 金寨县| 玉环县| 双城市| 柏乡县| 子洲县| 东方市| 开江县| 双柏县| 彭泽县| 河西区| 秭归县| 巴林左旗| 马龙县| 崇明县| 库车县| 泰安市| 裕民县| 宜黄县| 泾阳县| 肥乡县| 嘉鱼县| 枣强县| 建平县|