[Python / PyRoom Acoustics] Simulation acoustique de pièce avec Python

Qu'est-ce que PyRoom Acoustics?

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.

  1. Paramètres de la pièce
  2. Emplacement du microphone
  3. Emplacement de la source sonore
  4. Exécutez la simulation

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

(1) Conception de la pièce

Vous pouvez définir une pièce en deux ou trois dimensions avec l'objet de pièce.

Créer une salle de type boîte à chaussures (carrée)

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()

image.png

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
)

Faire une pièce de forme arbitraire

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)

image.png

Si vous le pouvez, ajoutez des informations de hauteur avec extruder et créez un mur.

extrude.py


room.extrude(2.)

image.png

Option 1 Essayez une méthode hybride de méthode d'image miroir et de course tardive

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()

Option 2 Envisagez l'atténuation de l'air

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
)

Autres options

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».

(2) Paramètres du microphone

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.)

(Exemple) Réseau de microphones circulaire

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.

Lorsque vous souhaitez ajouter un seul microphone

mic.py


mic_loc = [1.0,2.0,2.0]
room.add_microphone(mic_loc)

Lorsque vous voulez savoir si les coordonnées sont dans la pièce

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 )

(3) Paramètres de la source sonore

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. image.png

(4) Exécution de la simulation

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)

(5) Résultats de la simulation

Écoutez le son simulé

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))

Vérifiez la réponse impulsionnelle

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))

Calculez le temps de réverbération dans la pièce

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))

Visualisez la méthode de l'image miroir

model.py


# compute image sources
room.image_source_model()

# visualize 3D polyhedron room and image sources
fig, ax = room.plot(img_order=3)

image.png

À la fin

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

référence

Documentation officielle GitHub officiel

Recommended Posts

[Python / PyRoom Acoustics] Simulation acoustique de pièce avec Python
Traitement du signal acoustique avec Python (2)
Traitement du signal acoustique avec Python
Première simulation de cellule nerveuse avec NEURON + Python
Essayez la simulation de contrôle de fréquence avec Python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Intégrer avec Python
AES256 avec python
Testé avec Python
python commence par ()
simulation ambisonique Python
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Résultat de la simulation de diffusion thermique 2D avec Python VTK
Simulation COVID-19 avec python (modèle SIR) ~~ avec carte de chaleur préfectorale ~~
Communication série avec Python
Zip, décompressez avec python
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
Collecter des tweets avec Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python
Premiers pas avec Python
Getter Zundko avec python
Gérez Excel avec python
Loi d'Ohm avec Python
Jugement des nombres premiers avec python
Exécutez Blender avec python
Résoudre des maths avec Python
Carte thermique par Python + matplotlib
Multi-processus de manière asynchrone avec python
Programmation Python avec Atom