Skip to content

Guide to the open pull requests from #49: what each one does and a merge order #75

Open

Description

@aguirreSL

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

  1. Fixes that make a fresh install work and the test suite pass:
    1. [FIX] replace the NumPy aliases removed in NumPy 2 #53, NumPy 2 support. A fresh pip install gets NumPy 2, and on it SignalObj and the calibration fail.
    2. [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52, pytta.generate on Python 3.12 and the window functions removed in SciPy 1.13.
    3. [FIX] create a SignalObj from any calling function #59, creating a SignalObj inside a function.
    4. [FIX] round trip of measurements through .pytta files #60, save and load of measurements in .pytta files. It builds on [FIX] pytta.generate crashes in plain scripts on Python 3.12 and SciPy 1.13+ #52.
    5. [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 development pass.
  2. 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).
  3. 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_delay and corr_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).
  4. 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.

Activity

  1. aguirreSL commented on Oct 31, 2026

    @aguirreSL
    Author

    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.

  2. aguirreSL commented on Oct 31, 2026

    @aguirreSL
    Author

    I updated the guide above with #87 to #90. #90 builds on #89, so it should be merged after it.

  3. aguirreSL commented on Oct 31, 2026

    @aguirreSL
    Author

    #91 builds on #79, so it should be merged after it. The guide above lists it.

  4. aguirreSL commented on Oct 31, 2026

    @aguirreSL
    Author

    #92 builds on #91, which builds on #79. The guide above lists both.

  5. aguirreSL commented on Oct 31, 2026

    @aguirreSL
    Author

    #93 builds on #92. The psychoacoustics pull requests form a chain, to be merged in the order #79, #91, #92, #93.

  6. aguirreSL commented on Nov 1, 2026

    @aguirreSL
    Author

    #105 (multitone, spectrum crossfade, impulse train cutting, p-p velocity) adds no commits on top of #59, although generate.multitone called with a NumPy array of frequencies works only once #59 is merged; with a list it works on its own.

  7. aguirreSL commented on Nov 1, 2026

    @aguirreSL
    Author

    #107 (group delay, Nyquist, z-plane and polar plots) builds on #80, since plot_group_delay uses group_delay.

  8. aguirreSL commented on Nov 1, 2026

    @aguirreSL
    Author

    #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.

  9. aguirreSL commented on Nov 1, 2026

    @aguirreSL
    Author

    #127 and #58 both change energy_decay_calculation in pytta/classes/analysis.py. Whichever is merged second needs a small merge: RoomAnalysis passes both edcMethod and compensation to cumulative_integration, and energy_decay_calculation returns (interIdx, C, BGL) for 'subtractNoise'. The pull request #127 describes it.

  10. aguirreSL commented on Nov 1, 2026

    @aguirreSL
    Author

    #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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions