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

任意のパターン・変調

Pattern と Modulation は, 計算済みのバッファをそのままデバイスへ送るコマンドである. 計算ヘルパ はあらかじめ用意された計算ヘルパである. ヘルパを介さずバッファを直接構築すれば, 任意のパターン・変調を表現できる.

パターンは, デバイスごとに Vec<Phase> を並べた位相バッファと振幅の組である. Geometry::phase_buffer で全デバイス分の位相バッファを確保し, 各振動子の位相を自由に設定できる. 振幅は全素子同一なら Intensity をそのまま渡し, 素子ごとに変えたいときだけ Geometry::intensity_buffer でバッファを確保する.

以下は, focus と同じ単一焦点を, ヘルパを使わず手動で計算する例である. 各振動子から焦点までの距離に応じた位相を与えている.

let mut phases = geometry.phase_buffer();
for (slot, device) in phases.iter_mut().zip(&geometry) {
for (p, &pos) in slot.iter_mut().zip(device.positions()) {
let dist = (target - pos).norm();
*p = Phase::from(-dist / wavelength.mm() * 2.0 * PI * rad);
}
}
Pattern::new(&phases, Intensity::MAX);

変調は, AM 波形を表す &[u8] バッファと SamplingConfig の組である. バッファの各要素は 1 サンプルの振幅を表す.

以下は, 周期中の最初の 1 サンプルだけ出力する Burst 変調の例.

let length = 10;
let mut data = vec![0x00u8; length];
data[0] = 0xFF;
Modulation::new(SamplingConfig::FREQ_4K, &data);