Silencer

AUTD3には出力を静音化するためのSilencerが用意されている. Silencerは, 振動子の駆動信号の急激な変動を抑制し, 静音化する.

理論

詳細は鈴木らの論文1を参照されたい.

大まかに概要を述べると,

  • 振幅変調された超音波は可聴音を生じる
  • 超音波振動子を駆動する際に, 位相変化が振幅変動を引き起こす
    • したがって, 可聴音の騒音が生じる
  • 位相変化を線形に補間し, 段階的に変化させることで振幅変動を抑えられる
    • したがって, 騒音を低減できる
  • 補間を細かくやると, その分だけ騒音を小さくできる

となる.

Silencerの設定

Silencerの設定にはSilencerを送信する.

Silencerはデフォルトで適当な値に設定されている. Silencerを無効化する場合は, disableを送信する.

use autd3::prelude::*;
fn main() {
let _ = 
Silencer::default();
let _ = 
Silencer::disable();
}
#include<autd3.hpp>
int main() {
using namespace autd3;
Silencer();
Silencer::disable();
return 0; }
using AUTD3Sharp;
new Silencer();
Silencer.Disable();
from pyautd3 import Silencer
Silencer()
Silencer.disable()

より細く設定する場合は, 以下2つのモードから選択する必要がある.

なお, デフォルトではFixed completion time modeに設定されている.

Fixed update rate mode

Fixed update rate modeにおける位相の変化

Silencerは位相の変化を線形補間し, 段階的にすることで静音化を行う. 即ち, 位相の時系列データを(単純)移動平均フィルタに通しているのにほとんど等しい. ただし, 位相データが周期的であるという事を考慮している点で異なる.

例えば, 超音波の周期の場合を考える. 即ち, , に対応する. ここで, 時刻で, 位相がからに変化したとする. この時, Silencerによる位相変化は以下の図のようになる.

位相の変化

一方, 時刻で, 位相がからに変化したとする. この時のSilencerによる位相変化は以下の図のようになる. これは, よりも, のほうが近いためである.

位相の変化 (位相変化量がより大きい場合)

つまり, Silencerは現在のと目標値に対して として位相を更新する. ここで, は1ステップ当たりの更新量 (Silencerstep) を表す. なお, 更新周波数はとなっている.

が小さいほど, 位相変化はなだらかになり騒音が抑制される.

による変化の違い

この実装の都合上, 移動平均フィルタとは異なる挙動を示す場合がある. 一つは, 上に示した位相変化量がより大きい場合であり, もう一つが, 途中でもう一度位相が変化する場合である. この時の位相変化の例を以下に示す. 元時系列に対する忠実度という観点では移動平均フィルタが正しいが, 位相変化量がより大きい場合を考慮したり, を可変にする (即ち, フィルタ長を可変にする) のが大変なため現在のような実装となっている.

移動平均フィルタとの比較

Fixed update rate modeにおける振幅の変化

振幅変動が騒音を引き起こすので, 振幅パラメータも同等のフィルタをかけることでAMによる騒音を抑制できる.

振幅パラメータは位相とは異なり周期的ではないので, 現在のと目標値に対して のように更新する.

Fixed update rate modeの設定

Fixed update rate modeを設定するには, 以下のようにする. 引数はそれぞれ, 上述のに対応する (単位は).

use autd3::prelude::*;
use std::num::NonZeroU16;
fn main() {
let _ = 
Silencer {
    config: FixedUpdateRate {
        intensity: NonZeroU16::MIN,
        phase: NonZeroU16::MIN,
    },
};
}
#include<autd3.hpp>
int main() {
using namespace autd3;
Silencer{FixedUpdateRate{.intensity = 1, .phase = 1}};
return 0; }
using AUTD3Sharp;
new Silencer(
    config: new FixedUpdateRate
    {
        Intensity = 1,
        Phase = 1
    }
);
from pyautd3 import Silencer, FixedUpdateRate
Silencer(
    config=FixedUpdateRate(
        intensity=1,
        phase=1,
    ),
)

Fixed completion time mode

このモードでは, 位相/振幅変化が一定の時間で完了するようになる.

Fixed completion time modeの設定

Fixed completion time modeを設定するには, 以下のようにする.

intensity, phaseはそれぞれ, 振幅/位相変化の完了まで時間に対応する. これらは超音波周期 () の整数倍である必要がある.

use autd3::prelude::*;
use std::time::Duration;
fn main() {
let _ = 
Silencer {
    config: FixedCompletionTime {
        intensity: Duration::from_micros(250),
        phase: Duration::from_micros(250),
        strict_mode: true,
    },
};
}
#include<chrono>
#include<autd3.hpp>
int main() {
using namespace autd3;
Silencer{FixedCompletionTime{.intensity = std::chrono::microseconds(250),
                             .phase = std::chrono::microseconds(250),
                             .strict_mode = true}};
return 0; }
using AUTD3Sharp;
new Silencer(
    config: new FixedCompletionTime
    {
        Intensity = Duration.FromMicros(250),
        Phase = Duration.FromMicros(250),
        StrictMode = true
    }
);
from pyautd3 import Duration, FixedCompletionTime, Silencer
Silencer(
    config=FixedCompletionTime(
        intensity=Duration.from_micros(250),
        phase=Duration.from_micros(250),
        strict_mode=True,
    ),
)

デフォルト値は, 位相変化が, 振幅変化がである. なお, Silencerの無効化は, 位相/振幅変化が超音波周期 () で終わることと等価である.

なお, このモードでは, ModulationFociSTM, GainSTMの位相/振幅がSilencerに指定した時間で完了できない場合にエラーが返される. すなわち, 以下の条件が満たされる必要がある.

  • Silencerの振幅変化完了時間 Modulationのサンプリング周期
  • Silencerの振幅変化完了時間 FociSTM/GainSTMのサンプリング周期
  • Silencerの位相変化完了時間 FociSTM/GainSTMのサンプリング周期

strict_modefalseにすれば, この条件を満たさない場合でもエラーを返さないようになるが, 推奨はされない.

1

Suzuki, Shun, et al. “Reducing amplitude fluctuation by gradual phase shift in midair ultrasound haptics.” IEEE transactions on haptics 13.1 (2020): 87-93.