これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.9.x を参照.
gs
srcgs (Gerchberg-Saxton 法) は, 振動子側と焦点側の振幅制約を交互に課しながら順伝搬と逆伝搬を反復するアルゴリズム. naive より焦点間の干渉を抑えられるが, 反復回数に応じて計算量が増える. アルゴリズムは Marzo らの論文 (Marzo & Drinkwater, 2019) に基づく.
gs( &NalgebraBackend, &geometry, &foci, wavelength, &option, &mut phases, &mut intensities,)?;gs(geometry, foci, wavelength, option, phases, intensities)Holo.Gs(geometry, foci, wavelength, option, phases, intensities);| 引数 | 型 | 説明 |
|---|---|---|
geometry |
&Geometry |
デバイス配置 |
foci |
&[AmplitudeTarget] |
焦点列 (位置と目標振幅) |
wavelength |
Length |
波長 |
option |
&GsOption |
追加オプション (下記参照) |
phases |
&mut [Vec<Phase>] |
位相の出力バッファ |
intensities |
&mut [Vec<Intensity>] |
振幅の出力バッファ |
option 以外の引数は Naive と同一.
GsOption
Section titled “GsOption”GsOption { repeat, constraint, directivity, mask, parallel, ..Default::default()}GsOption( repeat, constraint, directivity, mask, parallel,)new GsOption{ Repeat = repeat, Constraint = constraint, Directivity = directivity, Mask = mask, Parallel = parallel,}| フィールド | 型 | デフォルト |
|---|---|---|
repeat |
NonZeroUsize |
100 |
constraint |
IntensityConstraint |
Clamp(MIN, MAX) |
directivity |
Directivity |
Sphere |
mask |
TransducerMask |
AllEnabled |
parallel |
bool |
true |
repeat は反復回数. 大きくするほど品質は向上するが計算時間も増える.
constraint / directivity / mask の意味は Holo 概要 を参照.
parallel は結果の量子化をホスト側で複数スレッドへ分散するかどうか (GPU バックエンドの場合は無視される).
Example
Section titled “Example”use std::num::NonZeroUsize;
use autd3_rs::geometry::{Autd3, Geometry, TransducerMask, offset};use autd3_rs::units::{m, mm, s};use autd3_rs::value::Intensity;use autd3_rs_pattern::wavelength;use autd3_rs_pattern_holo::{ AmplitudeTarget, Directivity, IntensityConstraint, GsOption, NalgebraBackend, Pa, gs,};
let geometry = Geometry::new(vec![Autd3::default()]);
let mut phases = geometry.phase_buffer();let mut intensities = geometry.intensity_buffer();
gs( &NalgebraBackend, &geometry, &[ AmplitudeTarget { point: geometry.center() + offset(-30.0 * mm, 0.0 * mm, 150.0 * mm), amplitude: 2.5e3 * Pa, }, AmplitudeTarget { point: geometry.center() + offset(30.0 * mm, 0.0 * mm, 150.0 * mm), amplitude: 2.5e3 * Pa, }, ], wavelength(340.0 * m / s), &GsOption { repeat: NonZeroUsize::new(100).unwrap(), constraint: IntensityConstraint::Clamp(Intensity::MIN, Intensity::MAX), directivity: Directivity::Sphere, mask: TransducerMask::AllEnabled, parallel: true, ..Default::default() }, &mut phases, &mut intensities,)?;import numpy as npfrom autd3.geometry import Autd3, Geometryfrom autd3.units import m, sfrom autd3.value import Intensityfrom autd3_pattern import TransducerMask, wavelengthfrom autd3_pattern_holo import ( AmplitudeTarget, Directivity, IntensityConstraint, GsOption, Pa, gs,)
geometry = Geometry([Autd3([0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0])])
phases = geometry.phase_buffer()intensities = geometry.intensity_buffer()
gs( geometry, [ AmplitudeTarget( point=geometry.center() + np.array([-30.0, 0.0, 150.0]), amplitude=2.5e3 * Pa, ), AmplitudeTarget( point=geometry.center() + np.array([30.0, 0.0, 150.0]), amplitude=2.5e3 * Pa, ), ], wavelength(340 * m / s), GsOption( repeat=100, constraint=IntensityConstraint.Clamp(Intensity.MIN, Intensity.MAX), directivity=Directivity.Sphere, mask=TransducerMask.AllEnabled, parallel=True, ), phases, intensities,)using System.Numerics;using AUTD3;using AUTD3.Holo;using static AUTD3.Units;using static AUTD3.Holo.HoloUnits;
var geometry = new Geometry(new[] { new Autd3(Vector3.Zero) });
var phases = geometry.PhaseBuffer();var intensities = geometry.IntensityBuffer();
Holo.Gs( geometry, new[] { new AmplitudeTarget(geometry.Center + new Vector3(-30.0f, 0.0f, 150.0f), 2.5e3f * Pa), new AmplitudeTarget(geometry.Center + new Vector3(30.0f, 0.0f, 150.0f), 2.5e3f * Pa), }, Pattern.Wavelength(340.0f * m / s), new GsOption { Repeat = 100, Constraint = IntensityConstraint.Clamp(Intensity.Min, Intensity.Max), Directivity = Directivity.Sphere, Mask = TransducerMask.AllEnabled, Parallel = true, }, phases, intensities);