CW Viewer?(モールス信号の可視化)

涼しかったり、暑かったりと、これを繰り返して夏に近づいているのを感じます。私は冬生まれだから、秋からクリスマス頃までが一番好きな季節です。私にとって今はその正反対の忍耐の季節。基本スーツの私としては本当に辛い季節が近づいてきているほかありません。

一方で趣味はというと、登山、ロッククライミング、無線と色々ありますが、モールスは日々の練習が重要ですね。とは言ってもこの年で上達できるのり代はあまり大きくありません。そこで少しプログラムの力を借りようかと思い、ちょっとしたツールを作り始めました。

これは、その作りかけの試しで作成したものです。これは何かというと、モールス信号を視覚化できないかと思い、リグのスピーカー、ライン出力をPCのライン入力に取り込み、処理して表示するツールです。ネットワークプロトコルの標準化、実装などを手掛けてきたことはあっても、信号処理は専門外です。そこで、まずはライン入力からの信号を取り込み、FFT解析して、あとは付け焼刃的に信号処理を行うツールを作ってみました。

実際のところ、きっかけはCW Skimmer。これも良いのですが、あれ?これなら自分で作った方がいいような・・・などと思ってしまったのがいけなかった。

自分でも何をやっているのかと思ってしまいます。こんなツールを作るのに半日使ってしまいました。というのも、世の中にフリーで存在するC#で書かれているFFTライブラリで良いものが無い!言ってしまえば、良い実装が無い(遅い、他色々・・・)。もちろん有償のものはあるのでしょうが、貧乏暇なしサラリーマンとしては、無ければ自分で作成する主義でこれまでやってきているので、今回もFFTライブラリから作りました。

それが、コレです。このスクリーンショットは、入力信号をFFT解析し、信号の強度を同時に表示したものです。何も加工はしていません。通常音声信号の場合、FFT解析の際にHamming Windowを使用したものが多いですが、忠実度重視でRectangle(何もしてない)となっています。趣味的ツールなので、設定でHamming、Blackman、Hann、Welch、Bertlett、Nuttall, Blackman Harrisを選べるようにしてあります。それはそうとして、取りあえず信号は可視化できるようになりました。

このコードのポイントの1つは、FFT解析を多重化できるところでしょうか。入力バッファーをスレッド毎に投入し、幾つでもCPUへの負荷とメモリが許す限り多重化できます。デフォルトでは16スレッド作成していますが、全然使いきれていません。(かなり余裕がある)

試してみたところ、2048ビットでも十分解析できました。(2048ビット、結果が1024ビット。)解析は、1024ビットずつずらして2048ビットを1つのChunkとして解析、1024ビットの結果を得て、次の2048ビットを取得といった感じです。CPU負荷を見る限り44.1KHz、16ビット x 2チャンネルで4096でも行けそう。(試してないです。)

RAW

このスクリーンショットは、信号自身のシグナル強度によって掛けたものです。シグナルが強ければ残りますが、弱いと掛けることでより弱い信号になります。0.1 x 0.1 = 0.01、0.9 x 0.9 = 0.91のような感じです。
シグナル毎フィルター

私は信号処理の専門家では無いので、まずは適当に実装してみています。以下の画面は、モールス信号が特定の周波数の限られた帯域で強度を持つことを利用して、時間スライス毎に標準偏差を出し、指定の偏差値以下をカットしたものです。これで、微弱なシグナルは基本消えてなくなります。
標準偏差フィルター

FFT解析では、信号の周波数成分は取り出せますが、絶対強度を把握することが出来ません。そこで、時間毎のAmplitudeを使用して信号が無い、弱いものを取り除いています。
出力によるフィルター

そして、これは上記に加えて信号毎に更にそれぞれを掛けて強調しています。
併用

弱いノイズを全体的により取り除いた状態。
併用2

ここまで来るとモールス信号だけになってきました。
シグナル抽出強

これに、極端に短い信号にアリ、ナシ部分を補正すれば、ほぼデジタルデータとして抽出ができます。また、エレキーを使用している人が多いので、その分デコードは楽ですね。

って、ここまで作って、あとは複数のモールス信号を同時にデコード出来るところまで実装ですね。ただ、これが結構難しそう。1つの信号だけなら簡単なんですけどね。完成させたとして、自分以外に使う人いるのかな。ニーズがあればデコード機能含め実装し、完成度を上げて公開しようかと思います。

自作のHamlogも何人かに共有したら評判が良いので、そのうち公開するかもしれません。ICOM製リグを使用している場合は、細かい設定も一括で記録できるようになっています。ライン入力とも連動していて、開始、終了時間を入力すると、通話もアーカイブ出来るようになっています。(常時録音していて[最大時間は指定可]、時間入力とともに、そこから抽出する仕組みになっています。) って、懲りすぎですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です