これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
任意のパターン・変調
Pattern と Modulation は, 計算済みのバッファをそのままデバイスへ送るコマンドである.
計算ヘルパ はあらかじめ用意された計算ヘルパである.
ヘルパを介さずバッファを直接構築すれば, 任意のパターン・変調を表現できる.
任意のPattern
Section titled “任意のPattern”パターンは, デバイスごとに 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);emissions = geometry.pattern_buffer()for slot, device in zip(emissions, geometry): for t, pos in enumerate(device.positions()): dist = float(np.linalg.norm(target - pos)) slot[t] = Emission( Phase(-dist / wavelength * 2.0 * math.pi * rad), Intensity.MAX, )
Pattern(emissions)var emissions = geometry.PatternBuffer();foreach (var device in geometry){ var slot = emissions[device.Idx]; for (var t = 0; t < device.NumTransducers; t++) { var dist = Vector3.Distance(target, device.Position(t)); slot[t] = new Emission( (Phase)(-dist / wavelength.Mm * 2.0f * MathF.PI * rad), Intensity.Max); }}
new Pattern(emissions);任意の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 = 10buffer = ModulationBuffer(length)buffer[0] = 0xFF
Modulation(SamplingConfig.FREQ_4K, buffer)var length = 10;var buffer = new ModulationBuffer(length);buffer[0] = 0xFF;
new Modulation(SamplingConfig.Freq4k, buffer);