ノイズブランカのアルゴリズム
ノイズブランカ(以下NB)の具体的なアルゴリズムはPowerSDRのソースを解読すれば参考になるかもしれませんが、膨大なソースコードからノイズブランカ部のコードを
探すのは大変です、叉ネット上でも見つけることは出来ませんでしたので、従来からハードウェアで構成されたANLやNBの回路をソフト的に実現する方法でやってみました。
「他にもこんなアルゴリズムがあるよ。」というのがあればアドバイスいただければ幸いです。
従来からのANLの構成は、AMのキャリアレベルとAGC時定数の関係を利用して、ダイオードや2極管をON/OFFしています。このANLの動作原理を利用して、AMキャリアレベル
に相当する部分は、シグナルレベルの移動平均値を求め、その平均値に対してある係数以上の信号をノイズと判定して、その瞬間にゲインを低下するようにしました。ANLではノイズの振幅を
一定値にクリップするだけですが、ソフトではゲインを低下することでノイズ部分をカットするような動作にできます。
ノイズブランカ目標仕様
NBの効き具合については、具体的な数値や、各メーカーの共通評価方法がはっきりしないので、とりあえずはPowerSDRのNB1と同等な効果が得られることを目標仕様としました。
NBのノイズ判定レベルはプログラム上で固定値とし、実際のノイズを受信しながら可変の必要性について検討していきます。
ノイズブランカをプロクラムに組み込む
NB処理の組み込みは、オリジナルSDRstudyのSignalクラスの中に組み込みました。
具体的なフローとして、フォーム画面でNBボタンが押されると、
「signal.SignalAve(SignalReal, SignalImag); //移動平均処理とノイズリミット」の関数が呼び出され、信号の絶対値20ヶ分の移動平均と、その時々の信号レベルを比較して、一定以上(今回は
実験的に2倍のレベル差)のレベル差があるとノイズと判定して、その瞬間の信号レベルを-20dbゲイン低下させています。
移動平均のサンプル数を増やすと、比較的周期の長いドラゴンノイズにも効くようになりますが、必要な信号に対してもブランキングされたようになってきます。
叉レベル比を小さくすると弱いノイズに対してもブランキングが働くようになりますので、平均回数とレベル比はカット&トライで決めています。
ソースプログラム例(VC#)を以下に示します。コメントに日本語を使用しているので、一部iPad等でみると文字化けしているかもしれません。
使用してみて
当局の受信環境では比較的人口ノイズは少ないので、擬似的にブラシモーターの接点ノイズを受信機ANTから混入させ、NB ON/OFfした動画をとってみました。動画前半は6.990MHz付近の中華ドラゴンノイズのかぶりに対しての
NB ON/OFFの比較、後半では、モーターノイズでの効果確認。いずれも右下NBボタンをON/OFFしています。
SDRStudyにノイズブランカON/OFFデモ動画 (YOUTUBEへ)
パルス性のノイズについては、PowerSDRのNB1と同等な効果が確認できましたが、ドラゴンノイズについてはPowerSDR NB2よりもやや効果が少なく検討の余地があります。