これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.9.x を参照.
任意のパターン・変調
Pattern と Modulation は, 計算済みのバッファをそのままデバイスへ送るコマンドである.
計算ヘルパ はあらかじめ用意された計算ヘルパである.
ヘルパを介さずバッファを直接構築すれば, 任意のパターン・変調を表現できる.
任意のPattern
Section titled “任意のPattern”パターンは, デバイスごとに 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);phases = geometry.phase_buffer()for slot, device in zip(phases, geometry): for t, pos in enumerate(device.positions()): dist = float(np.linalg.norm(target - pos)) slot[t] = Phase(-dist / wavelength * 2.0 * math.pi * rad)
Pattern(phases, Intensity.MAX)var phases = geometry.PhaseBuffer();foreach (var device in geometry){ var slot = phases[device.Idx]; for (var t = 0; t < device.NumTransducers; t++) { var dist = Vector3.Distance(target, device.Position(t)); slot[t] = (Phase)(-dist / wavelength.Mm * 2.0f * MathF.PI * rad); }}
new Pattern(phases, Intensity.Max);任意のModulation
Section titled “任意のModulation”変調は, AM 波形を表す &[u8] バッファと SamplingConfig の組である.
バッファの各要素は 1 サンプルの振幅を表す.
以下は, 周期中の最初の 1 サンプルだけ出力する Burst 変調の例.
let length = 10;let mut data = vec![0x00u8; length];data[0] = 0xFF;
Modulation::new(SamplingConfig::FREQ_4K, &data);length = 10data = ModulationBuffer(length)data[0] = 0xFF
Modulation(SamplingConfig.FREQ_4K, data)var length = 10;var data = new ModulationBuffer(length);data[0] = 0xFF;
new Modulation(SamplingConfig.Freq4k, data);