能夠在2D/3D房間中快速構建單/多個聲源以及麥克風的模擬場景,藉助image方法能夠有效生成房間脈衝響應並模擬聲源和麥克風之間的傳播途徑。接下來系列博文將主要介紹的使用。今天主要介紹利用生成房間脈衝相應(Room Impluse Response, RIR)。
在使用之前,首先確保已經正確安裝,安裝命令如下
pipinstallpyroomacoustics
安裝成功後,列印版本資訊可知所安裝的的版本。我使用的版本是0。4。2
importpyroomacousticsaspra
print(pra。__version__)
‘’‘
0。4。2
’‘’
使用生成RIR的一般流程如下:
建立
新增到
新增到
呼叫以及方法
建立
可以建立2D房間尺寸和3D房間尺寸。建立3D房間尺寸也很簡單,就是在2D房間上再增加一個高而已。接下來建立一個尺寸為(7,5)的矩陣房間,以矩陣左下角為座標原點。那麼使用如下程式碼可以建立2D房間
importnumpyasnp
importpyroomacousticsaspra
corner=np。array([[,], [7,], [7,5], [,5]])。T
room=pra。Room。from_corners(corner)
‘’‘
corner: 房間的四個角。`pra。Room。from_corners()`的函式文件中表示四個角的宣告順序必須逆時針。
’‘’
fig,ax=room。plot()
ax。set_xlim([-1,10])
ax。set_ylim([-1,10])
fig。show()
而下面的程式碼建立三維房間
importnumpyasnp
importpyroomacousticsaspra
corner=np。array([[,], [7,], [7,5], [,5]])。T
room=pra。Room。from_corners(corner)
room。extrude(3。)
fig,ax=room。plot()
ax。set_xlim([-1,10])
ax。set_ylim([-1,10])
ax。set_zlim([-1,4])
fig。show()
新增到
下面以建立的2D房間為例(與2D的差別在於,3D房間中麥克風位置只是多了一個座標),中提供了宣告麥克風陣列的函式,本例中以環陣為例,並完善上面建立房間的指令碼(增加牆壁的反射係數)
importsoundfileassf
audio,sr=sf。read(‘1A3A29D5。wav’)
corner=np。array([[,], [7,], [7,5], [,5]])。T
room=pra。Room。from_corners(corners,fs=sr,
max_order=3,
materials=pra。Material(0。2,0。15),
ray_tracing=True,air_absorption=True)
room。add_source([1,1],signal=audio)
‘add microphone’
R=pra。circular_2D_array(center=[2。,2。],M=3,phi0=,radius=0。3)
room。add_microphone_array(pra。MicrophoneArray(R,room。fs))
fig,ax=room1。plot()
ax。set_xlim([-1,10])
ax。set_ylim([-1,10])
fig。show()
上圖中圓點表示設定的聲源位置,叉叉表示麥克風的位置。這裡設定了三個麥克風。
呼叫以及方法
相應的引數設定完之後,接下來就是呼叫image方法了。
room。image_source_model()
fig,ax=room。plot(img_order=3)
# fig。set_size_inches(18。5, 10。5)
fig。show()
透過以下程式碼檢視經過RIR後的語音
room。plot_rir()
fig=plt。gcf()
fig。set_size_inches(20,10)
最後透過方法可以檢視經過RIR後的語音以及儲存語音
room。simulate()
sf。write(‘modi_wav。wav’,room。mic_array。signals。T,samplerate=sr)
從聽感來看,經過RIR後的語音有了明顯的空間感。另外設定聲源位置的時候,可以在極座標系中設定聲源角度和聲源相對於麥克風陣列的距離,然後透過座標變換到直角座標系中。這樣的好處就是可以任意設定角度。不對需要注意的是聲源相對於麥克風的位置和聲源在整個座標系中的位置不是同一個座標系,需要標定一下。
文中有任何錯誤的地方,請隨時聯絡我。