ESP32の演算速度メモ
現在、音声認識の基礎や色々な手法の勉強をしつつ、PC上でシミュレータを作成し、独自アルゴリズムを検討しています。
その結果、「うえ、した、ひだり、みぎ」のような簡単な単語であれば、認識できそうな感じになってきました。
ただし、私の声の特徴量でしか見ていないのですが…。
事前に声の特徴量を取得する「音声登録モード」みたいなものを作れば、他の人の声でもいけるかもしれませんね。
んまぁでも、私の声でドロイド君が反応してくれたら、それだけで結構感動しちゃう気もします。
(満足げ)
さて、今回の音声認識で重要なポイントは「なるべく軽いアルゴリズム」であること、です。
リソースの限られたESP32で、リアルタイムに音声認識を行いたいので、なるべく単純になるよう設計しています。
これと並行して、そもそものESP32のCPUの演算能力を測ってみたので、以下にメモしておきます。
ESP32演算速度
演算内容 | 使用math関数 | 時間(us) | 比率 |
AddI | - | 33,566 | x1 |
MultI | - | 37,761 | x1.1 |
DivI | - | 41,949 | x1.2 |
AddF | - | 37,754 | x1.1 |
MultF | - | 37,768 | x1.1 |
DivF | - | 188,783 | x5.6 |
AddD | - | 400,038 | x11.9 |
MultD | - | 370,195 | x11.0 |
DivD | - | 349,317 | x10.38 |
LogF | logf | 178,5741 | x53.2 |
SqrtF | sqrtf | 553,873 | x16.5 |
SinF | sinf | 887,768 | x26.4 |
CosF | cosf | 888,830 | x26.4 |
SinCosF | sincosf | 1,822,992 | x54.3 |
AtanF | atan2f | 2,223,685 | x66.1 |
SinD | sin | 9,062,509 | x269.9 |
「比率」は、AddIの計算時間を1としたとき、他の演算で相対的にどれくらいかかるか、を示しています。(ループ処理や引数演算のオーバーヘッドも含まれているので、目安程度)
intの加算とfloatの乗算の演算速度がほぼ同じなので、ESP32のCPUに浮動小数点用の乗算器が乗ってるってことでしょうか。
これはうれしい誤算でした。安価なマイコンだってのに、最近はすごいですね。というか、まずアルゴリズム検討前に測っときなさいよ。基本の「き」ですよ。ですよね~。
(追記: 2018/6/17)
ちゃんと、ESP32の仕様書に「浮動小数点演算用ユニットあるよ」って書いてありました。
また、こちらのサイトで、floatとdoubleの演算比較をやっているようです。興味深い。
(追記: 2019/6/22)
三角関数と平方根を追加しました。
float精度であれば、三角関数と平方根は思ってたより処理が軽いイメージです。logのほうが重いのね…。
そしてESP32の場合、sincosfで同時に算出しても、別に効率があがるわけじゃないのね。単に中でsinとcosをそれぞれ呼ぶような実装になってるのかな。
あと、double精度のsinを見ると、さすがにちと重いなあ、って感じかしら。
初心者向けの解説
まず用語の説明として、intは整数のみ(12とか)、floatは小数(12.3とか)も扱える、数字の箱のことです。
また、Addは加算(足し算)、Multは乗算(かけ算)、Divは除算(わり算)を表しています。
一般的には、同じ足し算でも、整数(int)のみの演算よりも、小数(float)のほうが難しいです。
また、人間と似ていて「加算/減算 ⇒ 乗算 ⇒ 除算」の順番に難しくなっていきます。
これらを踏まえた上で、上記の表の1行目(AddIの行)は「100万回の整数の足し算を、33,566(us)で出来たよ」ということを意味しています。
つまり「1秒間に約2979万回の足し算ができるよ」ということです。
さらに、MultF(=小数の乗算)の行を見てみると、AddIの計算時間とあまり変わらないことがわかります。
なので、このCPUには、苦手克服用として、小数乗算の専用回路が入っているのかもしれません。
まったく、小数の掛け算なんて、1秒に1回だって難しいのに!ここら辺の計算力は、人間には到底勝てない分野ですよね。
さて、次はついに実機への実装です。もうすぐドロイド君で音声認識ができるようになるかも!
ということで、また次回をお楽しみに。