Blue Pill STM32のADCで可変抵抗の電圧値を得るプログラムを作ってみました。得られたデータをパソコンでプロットしてみると(Arduinoのシリアルプロッタが便利です)、かなりノイズが乗っていることが分かりました。たとえばこの電圧値でディレイエフェクトのディレイタイムをコントロールするとディレイタイムが小刻みに変動するので変調が掛かったような音になってしまいます。プロットしたデータをよく見ると一定周期で急峻なピーク性のノイズが入っていることが分かりました。なぜそのようなノイズが入ってくるのか?はとりあえず置いといてw、そういったノイズにはメディアンフィルタが効くことは周知です。ネットを検索すると
3×3メディアンフィルタの高速アルゴリズム
というものが見つかりました。アルゴリズムの解説だけでサンプルコードが無いのでCで書いてみました。
サンプルコード
サンプルコードは画像用ではない一般的な9個のデータ用のメディアンフィルタの実装です。アルゴリズムの解説に沿ったプログラムの流れにしたのでアルゴリズムの解説と合わせて見てもらうと分かり易いです。
サンプルコードは9個のバッファにランダムな数値を入れてそれを並べ変えて中央値が取れていることを確認するだけの単純なものです。
クイックソートと比べて約2.5倍くらい速くなりました。これでスパイク性のノイズはきれいに取れましたが全てのノイズが消えることはありません。メディアンフィルタが速くなった分、さらに平均化フィルタも追加したところかなり安定したデータになりました。ノイズは3/4096くらいまで抑えられました。0.07%ですからまずまずでしょう。
サンプルコードは9個のバッファにランダムな数値を入れてそれを並べ変えて中央値が取れていることを確認するだけの単純なものです。
クイックソートと比べて約2.5倍くらい速くなりました。これでスパイク性のノイズはきれいに取れましたが全てのノイズが消えることはありません。メディアンフィルタが速くなった分、さらに平均化フィルタも追加したところかなり安定したデータになりました。ノイズは3/4096くらいまで抑えられました。0.07%ですからまずまずでしょう。
コメント
コメントを投稿