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.
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
Mit dem Raumobjekt können Sie einen zweidimensionalen oder dreidimensionalen Raum einstellen.
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()
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
)
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)
Wenn Sie können, fügen Sie mit "Extrudieren" Höheninformationen hinzu und erstellen Sie eine Wand.
extrude.py
room.extrude(2.)
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()
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
)
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.
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.)
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.
mic.py
mic_loc = [1.0,2.0,2.0]
room.add_microphone(mic_loc)
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 )
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.
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)
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))
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))
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))
model.py
# compute image sources
room.image_source_model()
# visualize 3D polyhedron room and image sources
fig, ax = room.plot(img_order=3)
Nun, ist es vorerst so? Es gibt unzählige andere Optionen, probieren Sie sie aus. Docs » Room Simulation
Offizielle Dokumentation Offizieller GitHub
Recommended Posts