Closed charlesbmi closed 1 year ago
We implemented one version of this in a exploratory notebook (private repo) by using a time-dependent medium: https://github.com/agencyenterprise/bci-experiments/pull/91 . However, it seems like the way Doppler imaging is done in practice is to use multiple pulse echos (e.g. 10 echos). The Doppler shift is then measured by the phase shifts between echos.
That in-practice approach (using multiple pulse repetitions) is a bit difficult with NDK as is, because each simulation is quite slow. We can re-visit the in-practice approach when we have faster simulations. The repeated simulations would also have a lot of redundant information, so caching info between repetitions could speed that up as well.
On doing Doppler via pulse repetitions from Montaldo et al. (2022):
The Doppler effect is usually understood as the shift in frequency (f ) that occurs when a sound source (i.e., an ambulance siren) is moving: The sound seems to have a higher pitch when the source moves toward us and a lower pitch when it moves away from us. This effect also works for a reflected sound: When a sound is emitted by a static source and reflected by a mobile target, its frequency is shifted by f = 2v/c f0 when the reflector is moving toward the source and by f = −2v/c f0 when it is moving away from the source (here, f0 is the frequency of the source, v is the velocity of the target in the direction of the source, and c is the speed of sound). However, to localize echoes in depth, ultrasound scanners must use short ultrasound pulses (typically two to four cycles of ultrasound at the emission frequency). It is not technically possible to directly measure f from these short pulses, unlike for continuous sound waves, as in the ambulance siren example. A trick used to solve this problem consists of sending multiple pulses. As the target moves, pulses are reflected with a short time delay that can be used to compute f indirectly. This method, called pulsed-wave Doppler (Evans & McDicken 2000), is the basis of fUS imaging...
The motion of the cell can be observed when multiple pulses are emitted over time, with a period T called the pulse repetition frequency in the millisecond range. Because of the cell’s motion, each echo is slightly shifted in time relative to the preceding echo, resulting in a phase shift (Figure 1b). Consequently, the discrete signal obtained from a fixed depth after each pulse s(T ), called the Doppler signal (Figure 1c), oscillates over time. As evident from the spectrum of the Doppler signal, S(ω) (Figure 1d), it oscillates at a particular frequency equivalent to the classic Doppler frequency shift, fD = f = 2vz fUS/c, proportional to the velocity vz of the cell in the z direction and the central frequency fUS of the ultrasound pulse. If the particle is moving away from the probe, the frequency is negative. Negative frequencies can be detected because s(T ) is a complex signal (obtained using a Hilbert transform of the raw ultrasound signal). In signal processing terms, using a series of pulses, what we have done is transfer (i.e., demodulate) the Doppler frequency shift from the fast ultrasound frequency (15 MHz) onto a slower frequency: the pulse repetition frequency (∼kHz).
Describe the new feature or enhancement
The Doppler effect underlies many types of ultrasound imaging: Color Doppler, functional ultrasound, etc. Request: example of Doppler effect, similar to: http://www.k-wave.org/documentation/example_tvsp_doppler_effect.php
Please describe how you would use this new feature.
If NDK/Stride properly simulates the Doppler effect, that would enable simulating ultrasound imaging modalities that rely on the Doppler effect.
Describe your proposed implementation
NDK's backend Stride supports time-varying medium properties: https://stridecodes.readthedocs.io/en/latest/stride/api/problem/data.html#stride.problem.data.ScalarField . We could model the movement of a particle by its changes to the medium's acoustic properties
Describe possible alternatives
It might be simpler for the user to specify a
ParticleField
with particles that move within the medium. However, Stride'sIsoAcousticDevito
solver currently does not supportParticleField
s in its implementation.