Package: acoustipy
Investigate and optimize the acoustic performance of porous and microperforate materials with acoustipy.  Use the acoustic transfer matrix method to explore new material designs and identify unique properties of existing materials via inverse, indirect, and hybrid optimization schemes.InstallationCreate and activate a new virtual environment (recommended)mkdir <your_env_name>
python -m venv .venv
cd .venv
(Windows) cd Scripts && activate.bat
(Linux) source bin/activateInstall from PyPIpip install acoustipyBasic UsageExamples of most of the functionality of acoustipy can be found in the Examples section.  The snippet below corresponds to the multilayer structure example and highlights a core feature of acoustipy -- the acoustic transfer matrix method.fromacoustipyimportacousticTMM# Create an AcousticTMM object, specifying a diffuse sound field at 20Cstructure=AcousticTMM(incidence='Diffuse',air_temperature=20)# Define the layers of the material using various modelslayer1=structure.Add_Resistive_Screen(thickness=1,flow_resistivity=100000,porosity=.86)layer2=structure.Add_DBM_Layer(thickness=25.4,flow_resistivity=60000)layer3=structure.Add_Resistive_Screen(thickness=1,flow_resistivity=500000,porosity=.75)# Specify the material backing condition -- in this case a 400mm air gapair=structure.Add_Air_Layer(thickness=400)# Build the total transfer matrix of the structure + air gaptransfer_matrix=structure.assemble_structure(layer1,layer2,layer3,air)# Calculate the frequency dependent narrow band absorption coefficientsabsorption=structure.absorption(transfer_matrix)# Calculate the 3rd octave bands absorption coefficientsbands=structure.octave_bands(absorption)# Calculate the four frequency average absorptionFFA=structure.FFA(bands)# Plot and display the narrow and 3rd band coefficients on the same figurestructure.plot_curve([absorption,bands],["absorption","third octave"])The example below demonstrates another core feature of acoustipy -- optimization routines that are able to identify the JCA model parameters of porous materials from impedance tube measurements.  The snippet can also be found under the Inverse Method in the Examples section.fromacoustipyimportacousticTMM,AcousticID# Create an AcousticTMM object to generate toy impedance tube datastructure=acousticTMM(incidence='Normal',air_temperature=20)# Define the JCA and air gap material parameters for the toy datalayer1=structure.Add_JCA_Layer(thickness=30,flow_resistivity=46879,porosity=.93,tortuosity=1.7,viscous_characteristic_length=80,thermal_characteristic_length=105)air=structure.Add_Air_Layer(thickness=375)#Generate rigid backed absorption data and save to a csv files1=structure.assemble_structure(layer1)A1=structure.absorption(s1)structure.to_csv('no_gap',A1)# Generate air backed absorption data and save to a csv files2=structure.assemble_structure(layer1,air)A2=structure.absorption(s2)structure.to_csv('gap',A2)# Create an AcousticID object, specifying to mount types, data files, and data typesinv=AcousticID(mount_type='Dual',no_gap_file="no_gap.csv",gap_file='gap.csv',air_temperature=20,input_type='absorption')# Call the Inverse method to find the tortuosity, viscous, and thermal characteristic lengths of the materialres=inv.Inverse(30,47000,.926,air_gap=375,uncertainty=.2,verbose=True)# Display summary statistics about the optimizationstats=inv.stats(res)print(stats)# Plot the results of the found parameters compared to the toy input datainv.plot_comparison(res)# Save the optimization results to a csvinv.to_csv("params.csv",res)stats={'slope':1.000037058594857,'intercept':9.276088883464206e-05,'r_value':0.9999999674493408,'p_value':0.0,'std_err':8.732362148426126e-06}