[Python / PyRoom Acoustics] Raumakustische Simulation mit Python

Was ist PyRoom Acoustics?

Es ist das stärkste Python-Modul für akustische Systeme, das alle Arten der akustischen Signalverarbeitung unterstützt, z. B. Raumakustik, Strahlformung, Richtungsschätzung der Schallquelle und Schallquellentrennung.

[Python / PyRoom Acoustics] Trennung blinder Schallquellen mit ILRMA

PyRoom Acoustics erleichtert die Simulation der Raumakustik. Die Simulation wird mit Image Source durchgeführt, und es scheint, dass Sie auch mit einem Hybridsimulator unter Verwendung von Image Source und Ray Tracing experimentieren können.

  1. Raumeinstellungen
  2. Platzierung des Mikrofons
  3. Platzierung der Schallquelle
  4. Führen Sie die Simulation aus

Sie können die raumakustische Simulation ganz einfach in 4 Schritten ausprobieren.

module.py


import pyroomacoustics as pra
import matplotlib.pyplot as plt
from IPython.display import display, Audio

(1) Raumgestaltung

Mit dem Raumobjekt können Sie einen zweidimensionalen oder dreidimensionalen Raum einstellen.

Erstellen Sie einen Raum vom Typ Schuhkarton (quadratisch)

Verwenden Sie die ShoeBox-Methode, um einen typischen rechteckigen Raum zu erstellen. "max_order" bezieht sich auf die Obergrenze der Anzahl von Reflexionen in der Spiegelbildmethode.

room.py


#Nachhallzeit und Raumabmessungen
rt60 = 0.5  # seconds
room_dim = [9, 7.5, 3.5]  #Meter Wenn Sie diese zweidimensionale machen, wird es ein Raum mit einer quadratischen Ebene sein.

#Bestimmen Sie den durchschnittlichen Schallabsorptionskoeffizienten der Wandoberfläche und die Obergrenze der Anzahl der Reflexionen mit der Spiegelbildmethode aus der Nachhallformel von Sabine.
e_absorption, max_order = pra.inverse_sabine(rt60, room_dim)

#Mach ein Zimmer
#fs ist die Abtastfrequenz der erzeugten Impulsantwort. Wenn eine Tonquelle eingegeben werden muss, passen Sie sie an.
room = pra.ShoeBox(
    room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=max_order
)

Sie können den Raum mit room.plot () anzeigen.

plot.py


fig, ax = room.plot()

image.png

Auch wenn Sie die Nachhallzeit oder den Schallabsorptionskoeffizienten der Wandoberfläche nicht kennen, können Sie Materialien aus der [Materialdatenbank] auswählen (https://pyroomacoustics.readthedocs.io/en/pypi-release/pyroomacoustics.materials.database.html). Sie können einen Raum definieren.

material.py


m = pra.Material(energy_absorption="hard_surface")
room = pra.ShoeBox([9, 7.5, 3.5], fs=16000, materials=m, max_order=17)

Sie können auch unterschiedliche Materialien für jede Wand oder Decke detaillierter einstellen.

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
)

Machen Sie einen Raum von beliebiger Form

Sie können auch "Room.from_corners (Ecken)" verwenden, um die Raumform anhand der Koordinaten festzulegen.

Erstellen Sie zunächst eine Draufsicht. Die Argumente sind die gleichen wie bei ShueBox.

corner.py


#Stellen Sie die Eckkoordinaten ein
corners = np.array([[0,0], [0,3], [5,3], [5,1], [3,1], [3,0]]).T  # [x,y]
#Mach ein Zimmer
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

Wenn Sie können, fügen Sie mit "Extrudieren" Höheninformationen hinzu und erstellen Sie eine Wand.

extrude.py


room.extrude(2.)

image.png

Option 1 Probieren Sie eine Hybridmethode aus Spiegelbildmethode und Spätrennen aus

Max_order = 3 wird für die Anzahl der Reflexionen in der Spiegelbildmethode empfohlen

raytracing.py


room = pra.ShoeBox(
    room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=3,ray_tracing=True
)

#Spätes Rennen aktivieren
room.set_ray_tracing()

Option 2 Luftdämpfung berücksichtigen

In einem riesigen Raum wie einem Konzertsaal wird der Schall von der Luft absorbiert, was die Übertragung von hohen Frequenzen erschwert.

air_absorption.py


room = pra.ShoeBox(
    room_dim, fs=16000, materials=pra.Material(e_absorption), max_order=3,air_absorption=True
)

Andere Optionen

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)

Sie können auch verschiedene Optionen hinzufügen, z. B. "Temperatur" -Temperatur (in Grad Celsius), "Luftfeuchtigkeit" (relative Luftfeuchtigkeit) und "t0" -Simulationsstartzeit.

(2) Mikrofoneinstellungen

Wir werden dem erstellten Raum "Raum" ein Mikrofon-Array hinzufügen. Ein Mikrofonarray bedeutet ein Tonsammelsystem, das aus mehreren Mikrofonen besteht.

mic.py


#Geben Sie die Koordinaten des Mikrofons an
mic_locs = np.c_[
    [6.3, 4.87, 1.2], [6.3, 4.93, 1.2],  # mic 1  # mic 2
]

#Fügen Sie dem Raum ein Mikrofon hinzu
room.add_microphone_array(mic_locs)

Wenn Sie die Mikrofone in einem Kreis oder in einer geraden Linie anordnen möchten, gibt es Funktionen, die automatisch verschiedene Mikrofonanordnungen berechnen, ohne die Koordinaten berechnen zu müssen. (Da jedoch nur die Koordinaten in 2D zurückgegeben werden, müssen die Koordinaten in Höhenrichtung hinzugefügt und angehoben werden.)

(Beispiel) Kreisförmiges Mikrofonarray

Wenn Sie die Position der Mitte des Mikrofonarrays im Raum, die Anzahl der Mikrofone, die Drehung gegen den Uhrzeigersinn von der x-Achse und den Mikrofonradius als Argumente eingeben, werden die (x, y) -Koordinaten jedes Mikrofons zurückgegeben. Wenn Sie es in 3D verwenden möchten, fügen Sie die Koordinaten in Richtung der Z-Achse hinzu.

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

Neben der kreisförmigen Anordnung linear_2D_array() circular_2D_array() square_2D_array() poisson_2D_array() spiral_2D_array() Bitte überprüfen Sie von hier.

Wenn Sie nur ein Mikrofon hinzufügen möchten

mic.py


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

Wenn Sie herausfinden möchten, ob sich die Koordinaten im Raum befinden

Gehen Sie wie folgt vor, um herauszufinden, ob die Koordinaten, an denen Sie das Mikrofon oder die Tonquelle aufstellen möchten, im Raum heiß sind. Ob "include_borders" auch an der Wand steht. Gibt "True" zurück, wenn es enthalten ist, andernfalls "False".

check_inside.py


p = [1.,2.5,12.2]
room.is_inside(p、include_borders = True )

(3) Tonquelleneinstellungen

Wie das Mikrofon gibt es die Koordinaten und Daten der Schallquelle an, die Sie platzieren möchten. Die Tonquellendaten können Ihr eigenes Signal sein oder Sie können sie aus Ihrer eigenen WAV-Datei eingeben.

source.py


#Ich werde die WAV-Datei lesen und platzieren
from scipy.io import wavfile
_, audio1 = wavfile.read('speech1.wav')
_, audio2 = wavfile.read('speech2.wav')
_, audio3 = wavfile.read('speech3.wav')

#Geben Sie Koordinateninformationen für jede Schallquelle an.`room`Ich werde es hinzufügen.
#Sie können optional eine Verzögerung hinzufügen.
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.)

Wenn Sie ein Mikrofon und eine Tonquelle und dann "room.plot ()" hinzufügen, wird dies in der Abbildung wiedergegeben. image.png

(4) Durchführung der Simulation

Sobald Sie das Mikrofon und die Tonquelle installiert haben, können Sie die Simulation ausführen. Dies ist die einzige Ausführung.

simulate.py


room.simulate()

Wenn Sie den Effekt des SN-Verhältnisses während der Ausführung berücksichtigen möchten, gehen Sie wie folgt vor.

simulation.py


# S/N-Verhältnis
SNR = 90.
room.simulate(snr=SNR)

(5) Simulationsergebnisse

Hören Sie sich den simulierten Sound an

Der Ton, der jedes der platzierten Mikrofone erreicht, kann wie folgt extrahiert werden. Sie können die Abtastfrequenz mit room.fs abrufen.

result.py


simulation_data = room.mic_array.signals #Simulationsschallquelle
display(Audio(simulation_data[0,:], rate=room.fs))

Überprüfen Sie die Impulsantwort

Sie können die Impulsantwort aller Schallquellen auf das Mikrofon überprüfen. Die Impulsantwort wird wie folgt extrahiert.

rir.py


impulse_responses =room.compute_rir()
display(Audio(impulse_responses[0][0], rate=room.fs))

Berechnen Sie die Nachhallzeit im Raum

rt60.py


rt60 = room.measure_rt60()
print("Nachhallzeit:{}".format(rt60))

Diese Funktion kann nicht nur aus der simulierten Impulsantwort berechnet werden, sondern auch anhand Ihrer eigenen Impulsantwort.

rt60.py


rt60=pra.experimental.measure_rt60(impulse_responses[0][0],fs=rate)
print("Nachhallzeit:{}".format(rt60))

Visualisieren Sie die Spiegelbildmethode

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

Am Ende

Nun, ist es vorerst so? Es gibt unzählige andere Optionen, probieren Sie sie aus. Docs » Room Simulation

Referenz

Offizielle Dokumentation Offizieller GitHub

Recommended Posts

[Python / PyRoom Acoustics] Raumakustische Simulation mit Python
Akustische Signalverarbeitung mit Python (2)
Erste Nervenzellsimulation mit NEURON + Python
Versuchen Sie die Frequenzsteuerungssimulation mit Python
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
In Python integrieren
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
Ambisonics Simulation Python
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Ausgabe des 2D-Wärmediffusionssimulationsergebnisses mit Python VTK
COVID-19-Simulation mit Python (SIR-Modell) ~~ mit Präfektur-Wärmekarte ~~
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
Tweets mit Python sammeln
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Fahren Sie WebDriver mit Python
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Sprachanalyse mit Python
Denken Sie an Yaml mit Python
Kinesis mit Python betreiben
Erste Schritte mit Python
Zundko Getter mit Python
Behandle Excel mit Python
Ohmsches Gesetz mit Python
Primzahlbeurteilung mit Python
Führen Sie Blender mit Python aus
Löse Mathe mit Python
Heatmap von Python + matplotlib
Asynchron mit Python verarbeiten
Python-Programmierung mit Atom