OSC浜名湖では20〜30人くらいの人に実際に話して紹介をしたのですが、その中で一番食いつきの良かった技術的話題は、何といっても大気圧センサの話です。
皆さん技術者なので、吹いた息をどのようにセンシングするか、というところにやはり興味を持つのでしょう。
大気圧センサで吹く息をセンシングする、というのはもちろん私のオリジナルのアイデアではなくて、しかもすでに世の中で使われている方法です。ネットで調べると、同様に気圧センサで吹く息の量を測定する、といった話題を発見することが出来ます。
以下では、大気圧センサを使ってどのように吹く息の量を算出したのか、簡単に説明しましょう。
◆
大気圧センサをI2Cバスに繋げて、プログラムから定期的に値を読み出すようにプログラムを作ります。
私が使ったセンサはLPS331APです。
このセンサから値を読み取ると、現在の気圧が絶対値で得られます。絶対値というのは、例えば1012ヘクトパスカル[hPa]といった値です。
分解能はかなり細かくて、1[hPa]の1/4096の値まで読み取れます。ただ、実際に測定してみると分かりますが、0.1〜2[hPa]程度は常にブレていて、それなりの信号処理をしないと、安定した数値を得るのは難しそうです。
このような状況で息を吐き出した強さをどのように測定したらよいでしょう。
当然ですが、気圧はその日の気候によって大きく変わります。1020[hPa]のときもあれば、台風が来ているときには自分の部屋でも980[hPa]くらいになりました。
まさに天気予報の数値そのものを体感出来るわけです。
また、気圧は高度によっても変わります。気圧で海抜何メートルか測ることも可能です。
10メートル標高が高くなると、1[hPa]気圧は下がるそうです。なので、富士山の頂上では、378[hPa]も気圧が低くなります。
このセンサを密封したところに入れてそこに息を吹き込みます。
そうすると当然気圧は高くなります。しかし,その値はどう頑張って吹いても+20[hPa]程度。つまり通常の気圧が1000[hPa]のとき、強く吹いても1020[hPa]程度の気圧の上昇です。
こういう状況を考えると、吹いた息の量を検出するためには何も吹いていない時の現在の気圧を測定しておくことが必要になるということが分かります。
そうすれば、センシングした数値から現在の気圧を引くことによって、吹いた息の量を正確に得ることが出来ます。
もし大気圧の数値を決め打ちにしてしまうと、天候や高度によって全然使い物にならなくなってしまうことでしょう。
◆
最初はこの問題を解決するために信号処理的にスマートに解決できないか、とか考えてみました。気圧の変動だけとるのだから、DC成分を除去すれば良さそうです。つまりハイパスフィルターを使えば良いのではないかと考えました。
しかし、実際に息を強く吹いたり弱く吹いたりという周期はそんなに早くないので、相当急峻な特性を持ったフィルターでないといけません。実際に計算するとその係数は、0.9999・・・みたいな数値になってしまいます。何しろ、小数点以下何桁といった浮動小数点演算もハードウェアにとって結構なコストです。
(あくまで私の推論ですが・・・)
ということで、今回は泥臭くルールベースで現在の気圧を得る方法を考えてみました。
ざっくり言うと,以下のようなロジックです。
1)プログラム起動時は、少し時間を待ってから気圧を読み取り、まずはその値を現在の気圧(StandardPressure)とする。
2)その後、読み取った気圧の差分が0.2[hPa]を超えたら、この値をTempPressureとして保持。
3)読み取った気圧とTempPressureとの差分が0.1[hPa]以内ならカウンタをインクリメント。これが0.2[hPa]を超えたら、2)に戻り、TempPressureを更新。カウンタを0クリア。
4)このカウンタが50になったら、TempPressureを新しいStandardPressureとする。
上記のように気圧を作り出す処理とは別に、息の量を測定します。
具体的には、今読み取った気圧から上記のStandardPressureを引き算します。その値を適当に正規化して、音源に音量情報として送ります。
この方法は、例えばカウンタを50回インクリメントって一体何msecなのかとか、そういう部分がかなり曖昧ではありますが、とりあえずこんな方法で何とか笛を吹かせることは可能です。
もちろん、なかなか気圧のブレが大き過ぎてStandardPressure値が定まらないことも多く、まだこのロジックにはもう少し修正が必要だと思っています。
以上、気圧センサから呼気の量を読み取りロジックを紹介しました。