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

任意のパターン・変調

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

パターンは, デバイスごとに Vec<Emission> を並べたバッファである. Geometry::pattern_buffer で全デバイス分のバッファを確保し, 各振動子の Emission (位相と強度) を自由に設定できる.

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

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

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

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

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