Directional Point Sources
The SDK provides directional point sources that utilizes an approximated directivity pattern for the wave-based solver.
A number of directive sources are included and can be accessed through the source_directivity_library
. In addition, users can also upload their own source directivities to the source_directivity_library
by supplying a .clf
file to define the directivity.
Querying the source directivity library
You can query the whole source directivity library which returns all directivites that come built-in with Treble as well as source directivities uploaded by your organization.
source_directivities = tsdk.source_directivity_library.query()
# Display the data in a table (if the column "Private" is True then it is uploaded by your organization):
dd.as_table(source_directivities)
There are a few possible ways to filter the query: by category and sub category, manufacturer, name and organization.
1. Query by category
We can query the source directivity library by category and sub category, although both are optional.
The enum SourceDirectivityCategory
is used for querying by category. If sub category is also used then we need to select a value from any of the category's sub category as listed below.
directivity = tsdk.source_directivity_library.query(
category=treble.SourceDirectivityCategory.natural
)
dd.as_table(directivity)
If querying by sub category:
For using sub categories the enum SourceDirectivityCategory
is used with a sub category value. As an example, for a speech source, SourceDirectivityCategory.natural
is used. Then the sub category is choosen with the enum SourceDirectivityNatural.speech
.
natural_directivities = tsdk.source_directivity_library.query(
category=treble.SourceDirectivityCategory.natural,
sub_category=treble.SourceDirectivityNatural.speech,
)
speech_directivity = natural_directivities[0]
2. Query by manufacturer
We can query the source directivity library by manufacturer which searches the library for a source directivity with a manufacturer value containing the given string. Note that it is not case sensitive.
jbl_directivities = tsdk.source_directivity_library.query(
manufacturer="jbl"
)
dd.as_table(jbl_directivities)
jbl_directivity = jbl_directivities[0]
3. Query by name
Querying the source directivity library by name works like querying by manufacturer, searching the library for a source directivity with a name containing the given string, not case sensitive.
source_directivities_by_name = tsdk.source_directivity_library.query(
name="speech"
)
4. Filter by organization
By using get_organization_directivities
you get only the source directivities uploaded by your organization.
source_directivities = tsdk.source_directivity_library.get_organization_directivities()
dd.as_table(source_directivities) # Empty if you have not uploaded a source directivity
Plotting
Source directivities can be visualized using two plotting functions.
The on axis SPL at 1 meter can be visualized using plot_spl_on_axis()
.
speaker = tsdk.source_directivity_library.query(name="8020")[0]
speaker.plot_spl_on_axis()
The directivity pattern can be visualized as a sound pressure 'balloon' using plot_directivity_pattern()
. Note that the plot is interactive as you can change the frequency using the slider.
speaker.plot_directivity_pattern()
Source directivity upload
The SDK offers the possibility to upload a source directiviy to the source_directivity_library
by supplying a .clf
file to define the directivity. Name and category has to be specified as well as the .clf
file path.
my_source_directivity = tsdk.source_directivity_library.create_source_directivity(
name="My source directivity",
source_directivity_file_path="data/Genelec+Oy-8020.CF2",
category=treble.SourceDirectivityCategory.amplified,
sub_category=treble.SourceDirectivityAmplified.studio_and_broadcast_monitor, # Optional
description="Uploaded by me", # Optional
manufacturer="Genelec Oy", # Optional
correct_ir_by_on_axis_spl_default= True # Optional, default True
)
Creating a directive source using the source directivity library
To create a source to define a simulation, it is possible to use either an updloaded source directivity or any other directivity in the library as previously shown. To define a source as directive, a Source
object is created with the source type treble.SourceType.directive
. The directiviy is specified in the source properties with the queried directivity pattern.
directivities = tsdk.source_directivity_library.query(
name="speech"
)
dd.as_table(directivities)
speech_directivity = directivities[0]
source_properties = treble.SourceProperties(
azimuth_angle=0.0,
elevation_angle=0.0,
source_directivity=speech_directivity # here the directivity queried above is used
)
source = treble.Source(
x=1,
y=1,
z=1.5,
source_type=treble.SourceType.directive,
label="Speech_source",
source_properties=source_properties
)