Spatio-Temporal Modulation/時空間変調
SDKでは, 音場を周期的に切り替えるための機能 (Spatio-Temporal Modulation, STM) が用意されている.
SDKには単一焦点音場から8焦点音場までをサポートするFociSTM
と, 任意のGain
をサポートするGainSTM
が用意されており, これらを送信すると音場が周期的に切り替わる.
FociSTM
とGainSTM
はAUTD3ハードウェア上のタイマを使用するので時間精度が高いが, 制約も多い.
FociSTM/GainSTMの共通API
サンプリング設定の取得
sampling_config
でサンプリング設定を取得できる.
use autd3::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let stm = FociSTM {
foci: vec![Point3::origin(), Point3::origin()],
config: 1.0 * Hz,
};
dbg!(stm.sampling_config()?.freq()?); // -> 2Hz
Ok(())
}
#include<iostream>
#include<autd3.hpp>
int main() {
using namespace autd3;
FociSTM stm(
std::vector{
Point3::origin(),
Point3::origin(),
},
1.0f * Hz);
std::cout << stm.sampling_config().freq() << std::endl; // -> 2Hz
return 0; }
using AUTD3Sharp;
using AUTD3Sharp.Utils;
using static AUTD3Sharp.Units;
var stm = new FociSTM(foci: [Point3.Origin, Point3.Origin], config: 1.0f * Hz);
Console.WriteLine(stm.SamplingConfig().Freq()); // -> 2 Hz
import numpy as np
from pyautd3 import FociSTM, Hz
stm = FociSTM(
foci=[np.array([0.0, 0.0, 0.0]), np.array([0.0, 0.0, 0.0])],
config=1.0 * Hz,
)
print(stm.sampling_config().freq()) # -> 2Hz
LoopBehavior
FociSTM
/GainSTM
では, ループの挙動を制御できる.
デフォルトは無限ループである.
詳細はSegment/LoopBehaviorを参照.
ユーティリティ
Rust版のみ直線と円の軌跡を生成するユーティリティが用意されている.
use autd3::prelude::*;
fn main() {
let start = Point3::origin();
let end = Point3::origin();
let center = Point3::origin();
let radius = 30.0 * mm;
let num_points = 50;
let n = Vector3::z_axis();
let intensity = EmitIntensity::MAX;
let _ =
FociSTM {
foci: Line {
start,
end,
num_points,
intensity,
},
config: 1.0 * Hz,
};
let _ =
FociSTM {
foci: Circle {
center,
radius,
num_points,
n, // normal vector to the plane where the circle is drawn
intensity,
},
config: 1.0 * Hz,
};
}