Gainの自作

Rust版のライブラリでは自前のGainを作成することができる.

NOTE: C++, C#, Python版のライブラリでは, この機能は提供されていない. しかし, 同様の目的で, Customを使用することができる.

ここでは, Focusと同じように単一焦点を生成するFocalPointを実際に定義してみることにする.

use autd3::core::derive::*;
use autd3::prelude::*;

#[derive(Gain, Debug)]
pub struct FocalPoint {
    pos: Point3,
}

#[derive(Clone, Copy)]
pub struct Impl {
    pos: Point3,
    wavenumber: f32,
}

impl GainCalculator for Impl {
    fn calc(&self, tr: &Transducer) -> Drive {
        Drive {
            phase: Phase::from(-(self.pos - tr.position()).norm() * self.wavenumber * rad),
            intensity: Intensity::MAX,
        }
    }
}

impl GainCalculatorGenerator for Impl {
    type Calculator = Impl;

    fn generate(&mut self, _: &Device) -> Self::Calculator {
        *self
    }
}

impl Gain for FocalPoint {
    type G = Impl;

    fn init(
        self,
        _geometry: &Geometry,
        env: &Environment,
        _filter: &TransducerFilter,
    ) -> Result<Self::G, GainError> {
        Ok(Impl {
            pos: self.pos,
            wavenumber: env.wavenumber(),
        })
    }
}
fn main() {}

Gain::initは各デバイス毎に, GainCalculator (を実装した型) を生成するGainContextGenerator (を実装した型) を返す. 実際の位相, 振幅の計算はGainCalculator::calc関数内で行う.