Il s'agit du module Python le plus puissant pour les systèmes acoustiques qui prend en charge tous les types de traitement du signal acoustique tels que l'acoustique de la pièce, la formation de faisceaux, l'estimation de la direction de la source sonore et la séparation de la source sonore.
[Python / PyRoom Acoustics] Séparation aveugle des sources sonores avec ILRMA
PyRoom Acoustics facilite la simulation de l'acoustique de la pièce. La simulation est effectuée avec Image Source, et il semble que vous puissiez également expérimenter un simulateur hybride en utilisant Image Source et Ray Tracing.
Vous pouvez facilement essayer la simulation acoustique de la pièce en 4 étapes.
module.py
import pyroomacoustics as pra
import matplotlib.pyplot as plt
from IPython.display import display, Audio
Vous pouvez définir une pièce en deux ou trois dimensions avec l'objet de pièce.
Utilisez la méthode «ShoeBox» pour créer une pièce rectangulaire typique.
max_order
fait référence à la limite supérieure du nombre de réflexions dans la méthode d'image miroir.
room.py
#Temps de réverbération et dimensions de la pièce
rt60 = 0.5 # seconds
room_dim = [9, 7.5, 3.5] #mètres Si vous faites ce bidimensionnel, ce sera une pièce avec un plan quadratique.
#Déterminez le coefficient d'absorption acoustique moyen de la surface du mur et la limite supérieure du nombre de réflexions par la méthode de l'image miroir à partir de la formule de réverbération de Sabine.
e_absorption, max_order = pra.inverse_sabine(rt60, room_dim)
#Faire une pièce
#fs est la fréquence d'échantillonnage de la réponse impulsionnelle générée. S'il y a une source sonore à entrer, faites-la correspondre.
room = pra.ShoeBox(
room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=max_order
)
Vous pouvez afficher la pièce avec room.plot ()
.
plot.py
fig, ax = room.plot()
Même si vous ne connaissez pas le temps de réverbération ou le coefficient d'absorption acoustique de la surface du mur, vous pouvez également sélectionner des matériaux dans la Base de données des matériaux. Vous pouvez définir une pièce.
material.py
m = pra.Material(energy_absorption="hard_surface")
room = pra.ShoeBox([9, 7.5, 3.5], fs=16000, materials=m, max_order=17)
Vous pouvez également définir plus en détail différents matériaux pour chaque mur ou plafond.
material.py
m = pra.make_materials(
ceiling="hard_surface",
floor="6mm_carpet",
east="brickwork",
west="brickwork",
north="brickwork",
south="brickwork",
)
room = pra.ShoeBox(
[9, 7.5, 3.5], fs=16000, materials=m, max_order=17
)
Vous pouvez également utiliser Room.from_corners (coins)
pour définir la forme de la pièce à partir des coordonnées.
Commencez par créer une vue en plan.
Les arguments sont les mêmes que ShueBox
.
corner.py
#Définir les coordonnées des coins
corners = np.array([[0,0], [0,3], [5,3], [5,1], [3,1], [3,0]]).T # [x,y]
#Faire une pièce
room = pra.Room.from_corners(corners, materials=pra.Material(e_absorption), fs=16000, t0=0.0, max_order=1, sigma2_awgn=None, sources=None, mics=None, materials=None, **kwargs)
Si vous le pouvez, ajoutez des informations de hauteur avec extruder
et créez un mur.
extrude.py
room.extrude(2.)
Max_order = 3
recommandé pour le nombre de réflexions dans la méthode d'image miroir
raytracing.py
room = pra.ShoeBox(
room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=3,ray_tracing=True
)
#Activer les courses tardives
room.set_ray_tracing()
Dans un espace immense comme une salle de concert, le son est absorbé par l'air, ce qui rend difficile la transmission des hautes fréquences.
air_absorption.py
room = pra.ShoeBox(
room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=3,air_absorption=True
)
room.py
pyroomacoustics.room.Room(walls, fs=8000, t0=0.0, max_order=1, sigma2_awgn=None, sources=None, mics=None, temperature=None, humidity=None, air_absorption=False, ray_tracing=False)
Vous pouvez également ajouter diverses options telles que la température «température» (en degrés Celsius), l'humidité «humidité» (humidité relative) et l'heure de début de la simulation «t0».
Nous ajouterons un réseau de microphones à la pièce créée room
. Un réseau de microphones désigne un système de collecte de sons composé de plusieurs microphones.
mic.py
#Donnez les coordonnées du micro
mic_locs = np.c_[
[6.3, 4.87, 1.2], [6.3, 4.93, 1.2], # mic 1 # mic 2
]
#Ajouter un microphone à la pièce
room.add_microphone_array(mic_locs)
Si vous souhaitez disposer les microphones en cercle ou en ligne droite, il existe des fonctions qui calculent automatiquement diverses dispositions de microphones sans avoir à calculer les coordonnées. (Cependant, comme il ne renvoie que les coordonnées en 2D, il est nécessaire d'ajouter les coordonnées dans la direction de la hauteur et de l'augmenter.)
Si vous entrez l'emplacement du centre du réseau de microphones dans la pièce, le nombre de microphones, la rotation dans le sens antihoraire à partir de l'axe x et le rayon du microphone comme arguments, les coordonnées (x, y) de chaque microphone seront renvoyées. Si vous souhaitez l'utiliser en 3D, ajoutez les coordonnées dans la direction de l'axe z.
circular_2D_array.py
mic_locs = pra.circular_2D_array(center=[2.,2.], M=6, phi0=0, radius=0.1)
>>>array([[2.1, 2.05, 1.95, 1.9, 1.95,2.05],
[2., 2.08660254, 2.08660254, 2., 1.91339746,1.91339746]])
Outre l'arrangement circulaire linear_2D_array() circular_2D_array() square_2D_array() poisson_2D_array() spiral_2D_array() Veuillez vérifier à partir d'ici.
mic.py
mic_loc = [1.0,2.0,2.0]
room.add_microphone(mic_loc)
Pour savoir si les coordonnées où vous essayez de placer le microphone ou la source sonore sont chaudes dans la pièce, procédez comme suit.
Si include_borders
inclut également sur le mur.
Renvoie «True» s'il est inclus, «False» dans le cas contraire.
check_inside.py
p = [1.,2.5,12.2]
room.is_inside(p、include_borders = True )
Tout comme le microphone, il donne les coordonnées et les données de la source sonore que vous souhaitez placer. Les données de la source sonore peuvent être votre propre signal ou vous pouvez le saisir à partir de votre propre fichier WAV.
source.py
#Je vais lire le fichier wav et le placer
from scipy.io import wavfile
_, audio1 = wavfile.read('speech1.wav')
_, audio2 = wavfile.read('speech2.wav')
_, audio3 = wavfile.read('speech3.wav')
#Donner des informations de coordonnées pour chaque source sonore,`room`Je vais l'ajouter à.
#Vous pouvez éventuellement ajouter un délai.
room.add_source([2.5, 3.73, 1.76], signal=audio1, delay=1.3)
room.add_source([1.0, 2.34, 2.12], signal=audio2)
room.add_source([3.2, 1.7, 5.2], signal=audio3, delay=2.)
Si vous ajoutez un microphone et une source sonore puis room.plot ()
, cela sera reflété dans la figure.
Une fois le microphone et la source sonore en place, il est temps d'exécuter la simulation. C'est la seule exécution.
simulate.py
room.simulate()
Si vous souhaitez prendre en compte l'effet du ratio SN lors de l'exécution, procédez comme suit.
simulation.py
# S/Rapport N
SNR = 90.
room.simulate(snr=SNR)
Le son qui atteint chacun des microphones placés peut être extrait comme suit.
Vous pouvez obtenir la fréquence d'échantillonnage avec room.fs
.
result.py
simulation_data = room.mic_array.signals #Source sonore de simulation
display(Audio(simulation_data[0,:], rate=room.fs))
Vous pouvez vérifier la réponse impulsionnelle de toutes les sources sonores vers le microphone. La réponse impulsionnelle est extraite comme suit.
rir.py
impulse_responses =room.compute_rir()
display(Audio(impulse_responses[0][0], rate=room.fs))
rt60.py
rt60 = room.measure_rt60()
print("Temps de réverbération:{}".format(rt60))
Cette fonction peut être calculée non seulement à partir de la réponse impulsionnelle simulée, mais également à l'aide de votre propre réponse impulsionnelle.
rt60.py
rt60=pra.experimental.measure_rt60(impulse_responses[0][0],fs=rate)
print("Temps de réverbération:{}".format(rt60))
model.py
# compute image sources
room.image_source_model()
# visualize 3D polyhedron room and image sources
fig, ax = room.plot(img_order=3)
Eh bien, est-ce que c'est comme ça pour le moment? Il existe d'innombrables autres options, alors vérifiez-les. Docs » Room Simulation
Documentation officielle GitHub officiel
Recommended Posts