The spatial eigenfunction of one mode along a body's normalized length coordinate x in [0, 1]: phi(x) = sin(pi * half_waves * x + end_phase). More...
#include <modal_bank.hpp>
Public Attributes | |
| float | half_waves = 1.0f |
| number of half-wavelengths across the body | |
| float | end_phase = 0.0f |
| 0 puts a node at x = 0; pi/2 an antinode | |
The spatial eigenfunction of one mode along a body's normalized length coordinate x in [0, 1]: phi(x) = sin(pi * half_waves * x + end_phase).
How hard a strike at x excites a mode, and how loudly a pickup at x hears it, are both proportional to phi(x) — striking a node (phi = 0) does not excite that mode at all, which is why a string struck at its midpoint has no even harmonics.
This is the sinusoidal-eigenfunction family: ideal strings and the standing-wave idealization of pipes. Set half_waves = m (mode index) and end_phase = 0 for a string fixed at both ends; end_phase = pi/2 puts an antinode at x = 0 for a free end. Bodies whose eigenfunctions are NOT sinusoidal — Euler-Bernoulli bars, plates, shells, anything from a mesh solve — must not be forced into this form: compute their phi(x) with the solver that produced the modes and hand ModalBankT the resulting weights directly. The bank consumes weights, never positions, for this reason.
| float pulp::signal::ModalShape::end_phase = 0.0f |
0 puts a node at x = 0; pi/2 an antinode
| float pulp::signal::ModalShape::half_waves = 1.0f |
number of half-wavelengths across the body