SINAD Processor (DSP Experimental Base)  【2023.8.12】



 もう5年以上も前の事と思いますが、RXの感度測定をする測定器として、HP8903BというSINADを測ることのできる大昔のHP製品を落札しました。この機器はいまだ移動無線の変調がFMだった頃の製品のようで、大変に古いブツでした。従来、FM機の感度は復調SINAD=12dBとかの受信入力で規定していた頃のモノです。この状態では音声の了解度が80%以上になる領域だとどこかの解説を見た覚えがあります。

 一方、S/N=10dB時の受信入力も昔から「感度」の定義として使われてきました。古くはSSBハンドブックでも、メーカーTRXも使っているようですね。

 これを測るには、RMSレベルメータを用いて、S+Nレベルを測り、また、離調時のNレベルを測ってその比を取るという簡便法が使われて来たようです。ただ、最近のSDRとかでは、離調時のNレベルが同調時と変化する処理も多く、こんな簡便法でS/Nを測ることが困難になってきました。要するに、同調時の復調Sと残留Nを同時に比較しなければ正確なS/Nを得ることができません。

 ところで、SINAD=(S+N+D)/(N+D)を表し、一種のS/Nですから、この指標を同じアナログ変調であるSSBに用いてもなんら不都合は無いはずです。もともとFM系の通信機で広く用いられてきたのですから。そんな観点から、最近作った無線機の受信感度はSINADで記述してきました。それも、HP8903Bという優れた測定器を使うことができるようになったからです。

 昨今はそのHP8903Bも相当にお年を召して来ており、いつこけるか、不安になってきました。これは超アナログ測定器なので、壊れてもなんとかなりそうな気もしますが、処理内容はDSPでやらせれば比較的簡単なのじゃないの!と思い出して、HP8903Bのバックアップを目指してSINADメータを自作してみようと思い立ちました。

 前置きが長くなるので、早速、進めて行きます。





SINAD計測用ESP32基板


 DSPにADCがついていれば、SINADなんていう物理量は簡単に測れるわいとタカをくくって検討を始めました。要するに、入力信号から復調信号である1kHzのトーンを除いたN+Dのレベルを計測し、入力の全信号(S+N+D)レベルと比較すれば、はい、終了じゃないかと。であれば、いままで弄ってきた、STM32、Teensy4、ESP32のいずれのDSPでも対応可能だろうと思いました。

 ただ、手持ちのSTM32であるNucleoF446REの内蔵ADCは12ビットでD-rangeが少なく、外部にADCを設置するのが面倒だったのでパスです。Teensy4は16ビットステレオのADC/DACボードを所有していますが、ちょっと熱が覚めてしまっていて、あまり触手が動きません。残るはESP32ですが、これも内蔵ADCは直線性がペクですが、JF3HZBさんが、24ビットのADCをインターフェースして頂いたので、これがいいと思いました。実は、ESP32 SD-TRXの基板とコンパチにすることで、御本尊(SD-TRX)のスペア基板としても使えるように・・と考えて、これを採用しました。

 まずは軽く、入力制限要のBPF(0.3-2.8k)を作ってみます。




複素BPFで作った入力帯域制限フィルタ

 これは、256次でFs=16kspsで見たもので、I-CHサイドの複素BPFですが、これはSD-TRX用のフィルタのデータがあったから使っただけで、複素BPFである必要はありません。そうそう、言い忘れていた、今回は複素信号処理では無く、実信号処理で済ませています。理由は希望の物理量を得るのには実信号処理で十分だからです。

 さて、このBPFを通過した信号から1kHzのトーン(復調)を取り除く作業を考えます。一番簡便に済ませるなら、IIRでノッチフィルターを多段に重ねて除去する方法です。ライブラリには2次のIIRしか無かったようなので、数段重ねないとノッチが深くなりません。なので、ここでは4段重ねて見てみます。




IIRで作ったノッチフィルタ

 これを見ると、ノッチはノッチでもスカートの広がりが大きく、1kHzのトーン以外にも「削り取る」雑音があるということになり、これがどの程度測定誤差になるのかわかりません。ま、計算すれば算出できそうですが、まずはSINADメータとしての機能確認を急ぐことにします。

 さて、SINADを測るには安定的な信号源でSINAD値を可変できる必要があります。トーン信号は良いとして、ノイズ源を用意しなければなりません。WGとかのPCソフトもいいのですが、どうもUSBケーブルを通じて処理にノイズが乗るので諦めて、スマホアプリを使うことにしました。ホワイトノイズ発生器をアプリストアで見つけてノイズ発生を試みます。




スマホアプリによるオーディオ帯ホワイトノイズの様子

 このスペクトラムを見ると17kHzくらいまでフラットな振幅特性がありそうです。実際のRXのオーディオ系は3kHz程度のLPFを通すことが多いので、今回のSINAD測定信号源も多重帰還型の3kHzのLPFを通して、1kHzのトーンと加算した信号を用いることにします。




SINAD測定用テスト信号

 このようにトーンとノイズの振幅レベルを可変すれば、任意のSINAD値のテスト信号を生成することができます。

 さて、これで評価ツールが揃ったので、実際にSINADを測ることにしましょう。最初はserialPrintln命令で見ていましたが、最終的には表示させたいので、OLEDの表示器をつないでみます。





表示器をつけてみる

 流石に、QVGA(320*240)のLCDを持ち出すのも大げさなので、手持ちのOLEDの中から選んでみました。1.54/1.3/0.96インチの3種類が在庫しているのですが、最初は、表示がでかい方がいいと思って1.54を使いました。しかし、これは結構ノイジーで測定に影響が出そうなので、却下しました。1.3でもいいのですが、一番ノイズの少ない0.96にしてみました。これだと、ノイズの問題は考慮する必要はないのですが、ちょっと表示が小さい感じもします。

 さて、肝心の処理内容ですが、これは極めて簡単です。さきのBPFを通過した(S+N+D)信号のRMS値とBEFを通過した(N+D)信号のRMS値の比の対数を取るだけの処理です。簡単過ぎて申し訳ない位です。それで取得したSINAD値をHP8903Bと比較してみます。




実測SINADとHP8903Bとの比較

緑点線は理想的な状態


 上図は評価信号のSINADを可変して、実測したSINADとHP8903Bで測定したSINADの相関を見ています。この場合、SINADが40dB程度までは、ほぼHP8903と同じ値を示していましたが、それ以上は測定値のばらつき(分散)が大きくなってしまいました。これを以下に示します。




測定値の分散

 これを見るとSINADが良好になるにつれてばらつきが増えていって、あまりいい感じではありません。この原因はノッチフィルタの不全性が考えられるので、少し工夫をしてみることにします。

 このBEFですが、要は主信号の1kHzToneを除いた(N+D)を計測できればいいわけですから、BPFを2つ用いることで実現できます。




BEFを2つのBPFで作る

 上図は50-900HzのBPF-1と1100-3000HzのBPF-2を構成して、測定すべき信号を同時に印加して、BPF-1とBPF-2を通過したノイズを算術加算すれば、所用の(N+D)を得ることができます。ちょっと面倒ですが、BEFといてのスカート特性は、IIRのBEFよりも良好になっています。

 このフィルタを用いて、SINADを測定して、HP8903Bと比較してみると、測定レンジが広がっていることが以下の2枚の図で明らかになります。




測定値の相関



測定値の分散

 測定値のばらつき(分散)についてもSINADの良好な領域に至るまでよく抑えられており、これでなんとかHP8903Bの代役が勤まりそうな雰囲気です。これに気をよくして、入力レンジインジケーターを追加してみました。このDSPモジュールは入力のアンプゲインAvが20dBなので、0.3Vp-pの入力を超えるとADCが入力オーバーとなって歪が発生します。なので、このレベルでは「使っちゃダメよ」と表示するLEDをつけてみました。
 

 この動画のように、レベルオーバー(赤LED点灯)にならない振幅で測定すれば、歪なく測定できますよ・・・という感じに動作します。

 これで、必要な機能は織り込んだのですが、ここにきてまたしてもJF3HZBさんのナイスアシストを頂きました。「FIRでも次数を上げれば、ノッチとBPFを一本のフィルタで実現できますよ」とアドバイスを頂きました。早速1000タップで作ってみると、なんとこれが以下のようにすばらしい特性なのです。




JF3HZBさんのご提案のノッチ付FIR-BPFの特性

 これでSINADを測定しましたが全く問題無く特性が実現できました。ということなので、ケースにおまとめてしまいましょう。




ケースインの様子

 上図のようにDSPユニットにI/Q-CHのINPUT/OUTPUTのインターフェースを設けて、それにゲイン調整VRを設置しています。単にSINAD計だけでなくI/Q処理を行える実験基台としての役割も持たせたということです。

 電源系が外部からの給電としましたが、ノイズ撲滅の観点から電池でも駆動できるように考えてあります。もっとも、私のSINADを測る領域がせいぜい5~30dBあたりですので、ここまでの対策は不要です。あくまでDSPで微小信号処理が必要になった場合の備えという意味です。

 これで、SINADメータを完成できました。これで安心しましたが、言霊を心配しているので、HP8903がどうたらこうたらについては記述しないでおきましょう(大笑)。