コンテンツにスキップ
これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.14.x を参照.

FociStm

FociStm は, ハードウェアタイマにより単一, 及び, 多焦点音場を切り替える STM 機能を提供する. PatternStm と異なり, 焦点しか扱えないが, 転送データ量が少なく, レイテンシが小さい.

FociStm::new(config, &points, option);
引数 型 説明
config SamplingConfig サンプル毎のサンプリング設定
points &[ControlPoints] 焦点サンプルの列 (2 サンプル以上)
option FociStmOption 音速・ループ・遷移などのオプション

config は 1 サンプルあたりのサンプリング設定である. 「全サンプルを 1 周する周波数」から決めたいときは, 周波数にサンプル数を掛けて SamplingConfig を作る (例: 200 サンプルを 1 Hz で回すなら 200 Hz).

1 サンプルは ControlPoints で表される. points の長さが同時に出す焦点の数 (1 以上 8 以下) で, 全サンプルで揃っていなければならない (揃っていないと送信時にエラーになる).

  • ControlPoint { point, phase_offset } — 焦点座標 [mm] と位相オフセット.
  • ControlPoints { points: Vec<ControlPoint>, intensity } — 焦点の列と振幅.
FociStmOption {
bank,
sound_speed,
loop_behavior,
transition_mode,
..Default::default()
}
フィールド 型 デフォルト 説明
bank PatternBank PatternBank::B0 書き込み先・再生対象のバンク
sound_speed Velocity 340 m/s 焦点計算に使う音速
loop_behavior LoopBehavior LoopBehavior::Infinite ループ回数
transition_mode TransitionMode TransitionMode::Immediate バンク切替時の遷移タイミング

loop_behavior と transition_mode の挙動は再生制御 を参照.

FociStm は WriteFociBuffer + ConfigFociStm + ActivatePatternBank の 3 つと等価である. 以下は FociStm::new(config, &points, option) と等価な組み合わせである.

let max_len = WriteFociBuffer::max_len(num_foci);
for (i, chunk) in points.chunks(max_len).enumerate() {
WriteFociBuffer {
bank: option.bank,
start_index: i * max_len,
points: chunk,
};
}
ConfigFociStm {
bank: option.bank,
config,
size: points.len(),
num_foci,
sound_speed: option.sound_speed,
loop_behavior: option.loop_behavior,
};
ActivatePatternBank {
bank: option.bank,
transition_mode: option.transition_mode,
};
use std::f32::consts::PI;
use autd3_rs::commands::{Clear, FociStm, FociStmOption, Synchronize};
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{Hz, m, mm, s};
use autd3_rs::value::{ControlPoints, LoopBehavior, PatternBank, SamplingConfig, TransitionMode};
use autd3_rs::Client;
use autd3_rs::udp::TransportOption;
let geometry = Geometry::new(vec![Autd3::default()]);
let option = TransportOption::default();
let mut client = Client::open(&geometry, &option).await?;
client.send(Clear).await?;
client.send(Synchronize).await?;
let center = geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm);
let points: Vec<ControlPoints> = (0..200)
.map(|i| {
let theta = 2.0 * PI * i as f32 / 200.0;
ControlPoints::from(center + offset(30.0 * mm * theta.cos(), 30.0 * mm * theta.sin(), 0.0 * mm))
})
.collect();
client.send(FociStm::new(
SamplingConfig::from_freq(1.0 * Hz * points.len() as f32)?,
&points,
FociStmOption {
bank: PatternBank::B0,
sound_speed: 340.0 * m / s,
loop_behavior: LoopBehavior::Infinite,
transition_mode: TransitionMode::Immediate,
..Default::default()
},
)).await?;