欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何利用python處理原始音頻數(shù)據(jù)

 更新時(shí)間:2022年01月04日 12:16:24   作者:微小冷  
這篇文章主要介紹了如何利用python處理原始音頻數(shù)據(jù),文章以audioop的相關(guān)資料展開內(nèi)容,audioop是python標(biāo)準(zhǔn)庫中用于處理原始音頻數(shù)據(jù)的模塊,封裝了一些便捷的編碼轉(zhuǎn)換函數(shù)。下文詳細(xì)內(nèi)容,需要的朋友可以參考以下

一、基礎(chǔ)知識(shí)

PCM(pulse code modulation) ,即脈沖編碼調(diào)制,是將模擬信號(hào)轉(zhuǎn)為數(shù)字信號(hào)的一種編碼系統(tǒng)。而模數(shù)轉(zhuǎn)換主要分兩步,首先對(duì)連續(xù)的模擬信號(hào)進(jìn)行采樣,然后把采樣得到的數(shù)據(jù)轉(zhuǎn)化為數(shù)值,即量化。

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

在中國(guó)和歐洲主要實(shí)用的編碼方式為A-Law,其表達(dá)式為:

其中A AA為壓縮系數(shù),在G.726標(biāo)準(zhǔn)中建議87.56。

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

由于模擬信號(hào)的連續(xù)性,一般來說相鄰時(shí)間單位的信號(hào)往往具有較高的線性度,甚至彼此相差無幾,從而可以被高效率的壓縮。然而,也存在跳躍幅度較大的信號(hào),如果完全以緩變?yōu)樵瓌t,那么必然會(huì)丟失這部分?jǐn)?shù)據(jù)。為了均衡這種差異,就需要進(jìn)行自適應(yīng)量化。

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

二、轉(zhuǎn)換函數(shù)

audioop提供了ADPCM、A-Lawμ-Law和線性采樣之間的轉(zhuǎn)換函數(shù)

采樣ADPCMA-Lawμ-Law
lin2linlin2adpcmlin2alawlin2ulaw
 adpcm2linalaw2linulaw2lin

其中,與A-Lawμ-Law有關(guān)的轉(zhuǎn)換函數(shù)的輸入?yún)?shù)為(fragment, width),分別代表待處理片段和位寬;adpcm則會(huì)多一個(gè)state元組作為第三個(gè)參數(shù),表示編碼器狀態(tài)。

lin2lin是將線性片段在1、2、3 和 4 字節(jié)格式之間轉(zhuǎn)換的函數(shù),其輸入?yún)?shù)為(fragment, width, newwidth)。

下面新建一些數(shù)據(jù)來測(cè)試一下編碼轉(zhuǎn)換函數(shù),

#下面代碼來自于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'
>

則其轉(zhuǎn)換函數(shù)測(cè)試如下:

>>> datas[1]
b'\x00\x12E\xbb\x7f\x80\xff'        #將要處理的1位線性碼
>>> unpack(1,datas[1])
[0, 18, 69, -69, 127, -128, -1]     #轉(zhuǎn)為整型
# 將1字節(jié)線性碼轉(zhuǎn)為2字節(jié)線性碼
>>> 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)    #轉(zhuǎn)為整型,其值為datas[1]*256
[0, 4608, 17664, -17664, 32512, -32768, -256]
# 將1字節(jié)線性碼轉(zhuǎn)為1字節(jié)u-Law碼
>>> datas1_u = audioop.lin2ulaw(datas[1], 1)
>>> unpack(1,datas1_u)   #轉(zhuǎn)為整型,這個(gè)數(shù)和u-law的公式對(duì)不上,可能是其他算法
[-1, -83, -114, 14, -128, 0, 103]

三、片段特征函數(shù)

下表中函數(shù)的輸入為(fragment, width),分別代表待統(tǒng)計(jì)片段和位寬。

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

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

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

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

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

四、片段操作

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

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

可用于轉(zhuǎn)換輸入片段的幀速率,其中

  • state為元組,表示轉(zhuǎn)換器狀態(tài)
  • weightA和weightB是簡(jiǎn)單數(shù)字濾波器的參數(shù),默認(rèn)為 1 和 0。

到此這篇關(guān)于如何利用python處理原始音頻數(shù)據(jù)的文章就介紹到這了,更多相關(guān)利用python處理原始音頻數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python import自定義模塊方法

    Python import自定義模塊方法

    python包含子目錄中的模塊方法比較簡(jiǎn)單,關(guān)鍵是能夠在sys.path里面找到通向模塊文件的路徑。下面給大家介紹python import自定義模塊方法,需要的的朋友參考下
    2015-02-02
  • Python中Matplotlib圖像添加標(biāo)簽的方法實(shí)現(xiàn)

    Python中Matplotlib圖像添加標(biāo)簽的方法實(shí)現(xiàn)

    本文主要介紹了Python中Matplotlib圖像添加標(biāo)簽的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • python輸入多行的方法總結(jié)

    python輸入多行的方法總結(jié)

    Python中的Input()函數(shù)在輸入時(shí),遇到回車符,那么一次輸入就結(jié)束了,這不能滿足輸入多行文本并且行數(shù)也不確定的情形,當(dāng)然輸入空行也是允許的,本文給大家總結(jié)了python輸入多行的方法,需要的朋友可以參考下
    2024-04-04
  • python+numpy+matplotalib實(shí)現(xiàn)梯度下降法

    python+numpy+matplotalib實(shí)現(xiàn)梯度下降法

    這篇文章主要為大家詳細(xì)介紹了python+numpy+matplotalib實(shí)現(xiàn)梯度下降法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python+Pyecharts實(shí)現(xiàn)散點(diǎn)圖的繪制

    Python+Pyecharts實(shí)現(xiàn)散點(diǎn)圖的繪制

    散點(diǎn)圖是指在回歸分析中,數(shù)據(jù)點(diǎn)在直角坐標(biāo)系平面上的分布圖,散點(diǎn)圖表示因變量隨自變量而變化的大致趨勢(shì),據(jù)此可以選擇合適的函數(shù)對(duì)數(shù)據(jù)點(diǎn)進(jìn)行擬合。本文將利用Python Pyecharts實(shí)現(xiàn)散點(diǎn)圖的繪制,需要的可以參考一下
    2022-06-06
  • 快速一鍵生成Python爬蟲請(qǐng)求頭

    快速一鍵生成Python爬蟲請(qǐng)求頭

    這篇文章主要介紹了如何快速一鍵生成Python爬蟲請(qǐng)求頭,幫助大家更好的理解和學(xué)習(xí)使用python爬蟲,感興趣的朋友可以了解下
    2021-03-03
  • python中的torch常用tensor處理函數(shù)示例詳解

    python中的torch常用tensor處理函數(shù)示例詳解

    這篇文章主要介紹了python中的torch常用tensor處理函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Python基礎(chǔ)知識(shí)之變量的詳解

    Python基礎(chǔ)知識(shí)之變量的詳解

    這篇文章主要介紹了Python基礎(chǔ)知識(shí)之變量的詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • 詳解Python中的文本處理

    詳解Python中的文本處理

    這篇文章主要介紹了Python中的文本處理,包括從最基本的string模塊的基礎(chǔ)使用和更進(jìn)一步的re模塊的使用,本文來自IBM官方開發(fā)者技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • Python何時(shí)應(yīng)該使用Lambda函數(shù)

    Python何時(shí)應(yīng)該使用Lambda函數(shù)

    這篇文章主要介紹了Python何時(shí)應(yīng)該使用Lambda函數(shù),Python 中定義函數(shù)有兩種方法,一種是用常規(guī)方式 def 定義,函數(shù)要指定名字,第二種是用 lambda 定義,不需要指定名字,稱為 Lambda 函數(shù),需要的朋友可以參考下
    2019-07-07

最新評(píng)論