Repository navigation
Open
Description
I opened a series of pull requests, from #49 on. This issue lists what each one does, which ones depend on others, and an order to merge them. I will keep it up to date as new ones come in.
Merge order
- Fixes that make a fresh install work and the test suite pass:
- [FIX] replace the NumPy aliases removed in NumPy 2 #53, NumPy 2 support. A fresh
pip installgets NumPy 2, and on itSignalObjand the calibration fail. - [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52,
pytta.generateon Python 3.12 and the window functions removed in SciPy 1.13. - [FIX] create a SignalObj from any calling function #59, creating a
SignalObjinside a function. - [FIX] round trip of measurements through .pytta files #60, save and load of measurements in
.pyttafiles. It builds on [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52. - [INTERNAL] run the test suite on every push and pull request #61, a GitHub Actions workflow that runs the tests on every push and pull request. With 1 to 4 merged, all tests on
developmentpass.
- [FIX] replace the NumPy aliases removed in NumPy 2 #53, NumPy 2 support. A fresh
- Packaging and documentation: [INTERNAL] package with pyproject.toml #69 (
pyproject.toml) and [DOC] document every function of pytta.functions and build on Read the Docs #70 (Sphinx pages and Read the Docs configuration). - Other fixes: [FIX] zero-mean colored noise with random phase in every channel #54 (colored noise, builds on [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52), [FIX] overlap, time axis and level of the plain spectrogram #55 (plain spectrogram), [FIX] find_delay and corr_coef, with an example of pytta.functions #63 (
find_delayandcorr_coef), [FEATURE] add SignalObj.uncalibrate #62 (uncalibrate, which also fixes the calibrator frequency check) and [FIX] make pytta.iso3741.Lp_ST run and average as ISO 3741 asks #87 (iso3741.Lp_ST). - New features, independent of each other except [FEATURE] fractional octave smoothing in plot_freq, and plot_phase #68, which builds on [FEATURE] add smooth_frequency for SignalObj #50, [FEATURE] add impact sound insulation (ISO 717-2) to pytta.iso717 #84, which builds on [FEATURE] add pytta.iso717 with the rating of airborne sound insulation #65, [FEATURE] add late lateral sound level L_J to pytta.iso3382 #86, which builds on [FEATURE] add pytta.iso3382 with lateral energy fractions and IACC #66, [FEATURE] add pytta.ambisonics with higher-order Ambisonics #90, which builds on [FEATURE] add pytta.vbap with vector base amplitude panning #89, [FEATURE] add the tonality of Aures to pytta.psychoacoustics #91, which builds on [FEATURE] add pytta.psychoacoustics with loudness, sharpness and roughness #79, [FEATURE] add the fluctuation strength of Osses et al. to pytta.psychoacoustics #92, which builds on [FEATURE] add the tonality of Aures to pytta.psychoacoustics #91, [FEATURE] add sharpness weightings, loudness level and critical band to pytta.psychoacoustics #93, which builds on [FEATURE] add the fluctuation strength of Osses et al. to pytta.psychoacoustics #92, [FEATURE] add loudness_match and compare_loudness to pytta.psychoacoustics #94, which builds on [FEATURE] add sharpness weightings, loudness level and critical band to pytta.psychoacoustics #93, Add multitone, spectrum crossfade, impulse train cutting and velocity from a p-p probe #105, which needs [FIX] create a SignalObj from any calling function #59 for an array of frequencies, Add group delay, Nyquist, z-plane and polar plots #107, which builds on [FEATURE] add group_delay, coherence, cepstrum and MLS #80, [FEATURE] add envelope slope, inharmonicity and phase plane plots to pytta.response #112, which builds on [FEATURE] add pytta.response with quality factor, cutoffs and step metrics #74, [FEATURE] add the room and specimen limits of ISO 354 to pytta.iso354 #114, which builds on [FEATURE] add pytta.iso9613 and pytta.iso354 for air and room absorption #78, [FEATURE] add response, maximum SPL, radiation impedance, closed box and horn profile to pytta.loudspeaker #116, which builds on [FEATURE] add pytta.loudspeaker with Thiele-Small parameters #82, [FEATURE] add simulated measurements, multiple exponential sweeps and triggered averages #117, which builds on [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52, [FEATURE] add lifter, a low-pass filter in the cepstral domain #119, which builds on [FEATURE] add group_delay, coherence, cepstrum and MLS #80, [FEATURE] add smooth_notches for equalization #120, which builds on [FEATURE] add smooth_frequency for SignalObj #50, [FEATURE] add extrapolate, IIR extrapolation of a spectrum beyond its range #121, which builds on Add prony and invfreqz, IIR fits in the time and frequency domains #110, [FIX] window the impulse response before filtering for C80, D50 and support (ISO 3382-1, A.3.4) #127, which builds on [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52, and [FIX] peak_time with a negative peak, and regularization of short signals #131, which builds on [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52.
Dependencies
| Pull request | Builds on | Why |
|---|---|---|
| #54 | #52 | colored_noise uses the SciPy windows fixed there |
| #60 | #52 | its tests create sweeps with pytta.generate |
| #68 | #50 | the plot smoothing uses smooth_frequency |
| #84 | #65 | adds the impact rating to pytta.iso717 and shares its shifting helper |
| #86 | #66 | adds L_J to pytta.iso3382 with its conventions |
| #90 | #89 | the ALLRAD and CSAD decoders use the VBAP gains, and it adds energy_gains to pytta.vbap |
| #91 | #79 | adds the tonality to pytta.psychoacoustics |
| #92 | #91 | adds the fluctuation strength next to the tonality |
| #93 | #92 | extends the same functions of pytta.psychoacoustics |
| #94 | #93 | adds two functions to the same module |
| #105 | #59 | generate.multitone with a NumPy array of frequencies needs the fixed creation-name lookup |
| #107 | #80 | plot_group_delay uses group_delay |
| #112 | #74 | adds three functions to pytta.response |
| #114 | #78 | adds the limits to pytta.iso354 |
| #116 | #82 | adds functions to pytta.loudspeaker |
| #117 | #52 | the regularized deconvolution needs the fixed scipy.signal.windows.hann |
| #119 | #80 | uses cepstrum and icepstrum |
| #120 | #50 | uses smooth_frequency |
| #121 | #110 | fits with invfreqz |
| #127 | #52 | RoomAnalysis cannot run on Python 3.12 without it |
| #131 | #52 | the regularization needs the fixed scipy.signal.windows.hann |
A pull request that builds on another shows the commits of both until the first is merged.
What each pull request does
| # | Area | Content |
|---|---|---|
| #49 | signal processing | time_window, as ita_time_window |
| #50 | signal processing | smooth_frequency, fractional octave smoothing; fixes SignalObj built from a spectrum |
| #51 | spectrogram | enhanced spectrogram with no window to choose, and the enhanced option of plot_spectrogram |
| #52 | fix | pytta.generate on Python 3.12, SciPy windows |
| #53 | fix | NumPy 2 |
| #54 | fix | DC offset and mirrored channel of colored_noise |
| #55 | fix | overlap, time axis and level of the plain spectrogram |
| #56 | signal processing | minimum_phase |
| #57 | measurement | harmonic_distortion, THD from sweep measurements |
| #58 | room acoustics | noise compensation methods of the EDC, T20 and T30 uncertainty (ISO 3382-1), PSNR, bass and treble ratios; fixes bypassLundeby |
| #59 | fix | SignalObj created inside a function |
| #60 | fix | .pytta files of measurements |
| #61 | tests | CI workflow |
| #62 | calibration | SignalObj.uncalibrate |
| #63 | fix and docs | find_delay, corr_coef, example of pytta.functions |
| #64 | measurement | THD, THD+N and SNR with a sine |
| #65 | building acoustics | pytta.iso717, Rw, C and Ctr (ISO 717-1) |
| #66 | room acoustics | pytta.iso3382, JLF, JLFC and IACC (ISO 3382-1) |
| #67 | speech | pytta.iec60268, STI (IEC 60268-16) |
| #68 | plots | fractional octave smoothing in plot_freq, plot_phase |
| #69 | packaging | pyproject.toml |
| #70 | documentation | Sphinx pages and Read the Docs |
| #71 | loudness | pytta.bs1770, LUFS, loudness range and true peak (ITU-R BS.1770, EBU R 128) |
| #72 | noise | pytta.iec61672, A/C/Z weightings, Fast and Slow, Leq, SEL, Lmax, Lpeak, percentile levels |
| #73 | signal analysis | pytta.descriptors, crest factor, kurtosis, spectral shape |
| #74 | system response | pytta.response, quality factor, cutoffs, step response, bifurcation |
| #76 | vibration | pytta.vibration, frequency weightings of ISO 2631 and ISO 5349, rms, MTVV, VDV, integration and differentiation |
| #77 | material testing | pytta.iso10534, absorption and impedance in an impedance tube (ISO 10534-2) |
| #78 | absorption | pytta.iso9613, air absorption (ISO 9613-1), and pytta.iso354, absorption in a reverberation room (ISO 354) |
| #79 | psychoacoustics | pytta.psychoacoustics, loudness (ISO 532-1), sharpness (DIN 45692) and roughness (Daniel and Weber) |
| #80 | signal processing | group_delay, coherence, cepstrum, icepstrum, generate.mls and mls_deconvolution |
| #81 | psychoacoustics | pytta.ecma418, tone-to-noise ratio and prominence ratio (ECMA-418-1) |
| #82 | loudspeakers | pytta.loudspeaker, Thiele-Small parameters from the electrical impedance |
| #83 | file formats | pytta.sofa, read and write SOFA files (AES69) |
| #84 | building acoustics | impact sound insulation, Ln,w and CI (ISO 717-2), in pytta.iso717 |
| #85 | sound power | sound power level by the direct and comparison methods (ISO 3741), in pytta.iso3741 |
| #86 | room acoustics | late lateral sound level L_J (ISO 3382-1), in pytta.iso3382 |
| #87 | fix | pytta.iso3741.Lp_ST raised an error when called, and averaged the levels arithmetically |
| #88 | psychoacoustics | pytta.din45681, tonal audibility (DIN 45681), port of ita_tonality |
| #89 | spatial audio | pytta.vbap, vector base amplitude panning for 2D and 3D layouts, with MDAP |
| #90 | spatial audio | pytta.ambisonics, higher-order Ambisonics: encoding, five decoders, rotation, conventions |
| #91 | psychoacoustics | tonality of Aures, in pytta.psychoacoustics |
| #92 | psychoacoustics | fluctuation strength of Osses et al. (2016), in pytta.psychoacoustics |
| #93 | psychoacoustics | sharpness weightings of Aures and von Bismarck, sone and phon, critical band, in pytta.psychoacoustics |
| #94 | psychoacoustics | loudness_match and compare_loudness, in pytta.psychoacoustics |
| #95 | psychoacoustics | pytta.iso532_2, Moore-Glasberg loudness, monaural, diotic and dichotic (ISO 532-2) |
| #96 | signal processing | envelope, start_ir, time_shift, append, normalize, amplify_to, zero_phase, randomize_phase, quantize |
| #97 | signal processing | butterworth (also Linkwitz-Riley), notch and peak_eq filters |
| #98 | signal processing | psd (also cross), interpolate_spectrum and extrapolate_low |
| #99 | room acoustics | air_constants, convert_room_quantity (T, alpha, R, Z) and din18041, in pytta.rooms |
| #100 | room acoustics | modal transfer function and impulse response of a rectangular room, in pytta.rooms |
| #101 | room acoustics | image source method for a rectangular room (Allen and Berkley), in pytta.rooms |
| #102 | materials | pytta.absorbers, layered absorbers by the transfer matrix method (porous, MPP, mass, air) |
| #103 | analytic | pytta.analytic, Green's functions (free field, impedance plane), plane wave, scattering by a sphere |
| #104 | IO | read_audio, write_audio, read_blockwise (soundfile, imported on call), write_txt and read_txt |
| #105 | DSP | generate.multitone, crossfade_spectra, cut_impulse_train and velocity_from_pressure_gradient |
| #106 | new module | pytta.fourpole: two-port matrices of masses, springs, dashpots, impedances, transformers and gyrators, chaining, input impedance, A and Z matrices |
| #107 | plots | plot_group_delay, plot_nyquist, plot_zplane and plot_polar |
| #108 | nonlinear | power_to_harmonic_series and harmonic_to_power_series (Chebyshev, Dietrich 2013) |
| #109 | generate | generate.stochastic_ir: diffuse room impulse response after Kuttruff, sec. 4.2 |
| #110 | DSP | prony (Parks and Burrus) and invfreqz (Levi), the fits of ita_prony_analysis |
| #111 | DSP | warp, warp_zpk and bark_warping: frequency warping with a first-order allpass |
| #112 | response | envelope_slope, inharmonicity and plot_phase_plane for #33 |
| #113 | measurement | dither, impulsive_noise, invert_spectrum (Kirkeby, optional minimum phase) and merge_near_far (Keele) |
| #114 | standards | pytta.iso354: room and specimen limits (Table 1, 6.1.4, 6.2.1.1) |
| #115 | new module | pytta.e2611: transmission loss, absorption and material properties in a four-microphone tube (ASTM E2611) |
| #116 | loudspeaker | pytta.loudspeaker: response, maximum SPL, piston radiation impedance, closed box, horn profile, fit with a velocity measurement, voice coil inductance models |
| #117 | measurement | SimulatedPlayRecMeasure/SimulatedFRFMeasure (no sound card), multiple exponential sweeps, triggered averages |
| #118 | DSP | pitch_detection (cepstrum biased HPS), wiener_hopf and normxcorr2 |
| #119 | DSP | lifter, low-pass liftering of the complex cepstrum |
| #120 | DSP | smooth_notches, compare and squeeze of spectral notches |
| #121 | DSP | extrapolate, spectrum beyond its range from IIR fits at the edges |
| #122 | new module | pytta.fem: Helmholtz FEM with linear tetrahedra, cavity modes and harmonic response |
| #123 | new module | pytta.bem: collocation BEM with constant triangles and CHIEF points for radiation |
| #124 | new module | pytta.rays: stochastic ray tracing in convex rooms with absorption, scattering and a receiver sphere |
| #125 | new module | pytta.mesh: Delaunay meshes, DistMesh (Persson and Strang), reading through meshio, boundary extraction for pytta.bem |
| #126 | docs | guide for users moving from the ITA-Toolbox: conventions, tasks side by side, function tables with status |
| #127 | fix | RoomAnalysis: C80, D50, STearly and STlate windowed before filtering (ISO 3382-1, A.3.4); STlate to 1000 ms; bypassLundeby fixed |
| #128 | fix | _start_sample_ISO3382: 0-based start, the peak is no longer dropped |
| #129 | fix | band edges from the exact mid-band frequencies (IEC 61260-1, Eq. 2, 4, 5); 16 kHz octave back within class 1 |
| #130 | fix | weighting: every call failed; now at the exact frequencies of IEC 61672-1, Table 3 |
| #131 | fix | peak_time with a negative peak; regularized deconvolution of short signals |
| #132 | docs | example notebooks: simulated measurement, three room models, psychoacoustic references, FEM and BEM on a sphere |
| #133 | standards | pytta.iso11654: practical and weighted sound absorption coefficients, shape indicators |
| #134 | standards | pytta.iso3382_3: speech levels, D2,S, Lp,A,S,4m, distraction and privacy distances |
Conflicts
Most of these pull requests add a line to the same places in pytta/__init__.py and pytta/functions.py, so after each merge the next ones conflict on those lines. I will rebase the remaining ones after each merge. A branch of my fork, ci-integration, merges them all and runs the test suite in CI on Python 3.10 and 3.12 with NumPy 1 and 2, which shows that they work together.
Metadata
Metadata
Assignees
Labels
No labels
Activity
aguirreSL commentedon Oct 31, 2026
I updated the guide above with #76 to #86. Two of the new ones build on earlier pull requests: #84 on #65 and #86 on #66, so each should be merged after the one it builds on. The merge order of the first two groups is unchanged.
aguirreSL commentedon Oct 31, 2026
I updated the guide above with #87 to #90. #90 builds on #89, so it should be merged after it.
aguirreSL commentedon Oct 31, 2026
#91 builds on #79, so it should be merged after it. The guide above lists it.
aguirreSL commentedon Oct 31, 2026
#92 builds on #91, which builds on #79. The guide above lists both.
aguirreSL commentedon Oct 31, 2026
#93 builds on #92. The psychoacoustics pull requests form a chain, to be merged in the order #79, #91, #92, #93.
aguirreSL commentedon Nov 1, 2026
#105 (multitone, spectrum crossfade, impulse train cutting, p-p velocity) adds no commits on top of #59, although
generate.multitonecalled with a NumPy array of frequencies works only once #59 is merged; with a list it works on its own.aguirreSL commentedon Nov 1, 2026
#107 (group delay, Nyquist, z-plane and polar plots) builds on #80, since
plot_group_delayusesgroup_delay.aguirreSL commentedon Nov 1, 2026
#125 (
pytta.mesh) adds no commits on top of #122 and #123, although two of its tests, which check the meshes with the FEM and the BEM, are skipped until both are merged.aguirreSL commentedon Nov 1, 2026
#127 and #58 both change
energy_decay_calculationinpytta/classes/analysis.py. Whichever is merged second needs a small merge:RoomAnalysispasses bothedcMethodandcompensationtocumulative_integration, andenergy_decay_calculationreturns(interIdx, C, BGL)for'subtractNoise'. The pull request #127 describes it.aguirreSL commentedon Nov 1, 2026
#132 (example notebooks) adds no code; it runs once #52, #79, #92, #101, #109, #117, #122, #123, #124, #125 and #127 are merged, and it can be merged last.