[2] デコーダの処理の流れ
前回、CW Decoderの特徴であるデジタル信号処理の概要について、説明しました。
今回はデコーダ部の具体的な信号処理の流れについて説明します。
デコーダ処理は、「信号入力部」、「信号のシェーピング(整形)部」、「モールス符号の解析処理部」から構成されています。(下図がデータと処理の流れ)
信号入力部 (グラフ1, 2)
リグ内では、AGCや各種フィルタ処理を施しています。従って本機はアナログフィルタなどを設けず、入力信号を素直に使うこととしました。
(私が)通常使用するリグの音量(オーディオ信号)は、100mVpp程度でした。これを2SC1815で500mVpp程度に増幅するとともにレベル変換をしてMCUのADCに入力します。
また私が使用するIC-705では、CW モードのフィルタ(FIL2)は
350Hz-850Hzの500Hz幅のデジタルフィルタが入ります。このフィルタ設定から、300Hz-900Hzを解析対象とすれば実用上問題ないと判断し、ADCのサンプリング周波数を2560Hzとしました。(標本化定理により、0-1280Hzが解析可能な範囲)
信号のシェーピング部 (Core1)
入力信号(ADC変換後)を、モールス信号(キーのOn/Off信号)に変換するのが信号のシェーピング(整形)です。
① FFT計算の設定
本機では、FFT計算により、CWトーンを抽出します。今回は、周波数分解能を20Hz幅に設定しました。(128サンプル/FFT @2560サンプル/秒)
また、キーのOn/Offを判定する時間間隔(=毎秒のFFT計算回数)も、解読速度の上限や、ノイズ対策に重要な要素になります。本機では、この間隔を約4ミリ秒(1/256秒)としました。
10WPM(50字/分)の速度で、短点(dot)の長さは120ミリ秒*です。最高速度を50WPMとした場合、短点の長さは24ミリ秒ですので、1dotが6サンプルとなりOn/Off判定に十分なデータを取得できます。
② ノイズの除去~CWトーンの抽出
(グラフ3~7)
1) まず、FFT計算でオーディオ・スペクトラムデータを取得します。(256回/秒)
(データは20Hz幅(=ビン)で64個)
2) バックグラウンドノイズを除去するために、オーディオ信号全域の平均レベルより下のデータをカットします。
3) さらに不要帯域(300Hz以下と900Hz以上)のデータをカットします。
4) それでも、CWトーン以外に鋭いノイズが残りますので、各ビンの両隣のデータと平均値をとってならします。(山を低くする)
5) この後、もう一度、一定レベル以下のデータをカットすることで、CWトーンのみを抽出します。 → オーディオ・スペクトラムのグラフとして表示
6) 残ったデータから最も強い周波数のデータを解析対象とします。(注目周波数)
7) 解析対象のデータには、QSBなどのレベル変動があります。また、そもそも信号自体の強弱もありますので、ALC(自動レベル調整)をかけると同時に、Onレベル(Hiレベル)、Offレベル(Lowレベル)、中間のOn/Off判定レベル(Thresholdレベル)を計算します。
→ オーディオレベルとしてグラフ表示
On レベル: 青点線
判定レベル: 緑点線
Offレベル: 赤点線
③ キーon/off信号への変換
ノイズを除去したデータと、On/Off判定レベルから、キーのOn/Off状態を4ミリ秒毎に出力します。ただし、信号に重なったプチッというノイズや、急激なレベルの変動が、On/Off判定を狂わすため、短時間の変動を無視する(乗り越える)積分処理をしたのち、最終的なキーOn/Off信号として、次のモールス符号の解析データとします。
モールス符号の解析処理部
最近はエレキーかパソコンでCWを送信される方が大多数ですが、電鍵(縦ブレキーなど)を使用されている初心者の方、気持ちを込めた符号を送信される(特に和文を使われる)ベテランの方もいらっしゃいます。加えて、途中の電波伝搬の状況により、キーのOn/Off時間は一定とはなりません。
④ 符号の判別
キーOn/Offの状態を監視しながら、短点・長点・文字区切り・単語区切りの判別をします。これと同時に、速度追従の計算もします。
⑤ 速度追従の考え方
観測した短点・長点のOn時間、符号間のOff時間からWPMを計算します。(文字区切り、単語区切りのOff時間は使用しません)
人間が打つ短点とその後ろのスペースは、1:1とは限りませんが、0.8:1.2や1.1:0.9など、個人で一定となるリズムがあります。(同様に長点も、3:1だけではなく、2.5:1や4:1など。長点の方がクセが強い傾向。)
本機では、この「リズム」をWPMの基本として考えます。つまり、短点とその後ろのスペース(1:1, 0.8:1.2, 1.1:0.9など)を1単位(1Lと表現)して、1Lを更新していくことで速度追従をしています。
なお、前段のノイズ除去で取り切れなかった無音時(無信号時)のプチっというノイズが”E”や”T”と判定され、そのOn時間が短いために、どんどんWPMが上がってしまいます。これを防止するために、無音時のWPMは20WPMに収束するようにしています。
⑥ モールス信号の解読
文字区切り(単語区切り)が来るまでの、短点と長点のデータ(“1”と”2”で表現)を一塊として、モールス信号の解読ルーチンにデータを渡します。
モールス信号の解読ルーチンでは、昇順に並んだデータと照合して、合致した文字を返します。
欧文、和文のコード以外にも、連結文字記号や、しばしば連続して送信される文字もデータとして登録する事で、解読率を向上させています。
⑦ デコードエラーの場合の試行
途中のノイズや、送信側が文字間隔を十分に取らないで送信した場合、解読エラーとなります。この場合、最長10符号(短点+長点)の塊を2文字に分解して解読を試行します。(例えば、”JH”を連続して送信した場合に、JとHに分解する事を試行します)
★ 通常のQSOでも、文字間隔がほとんど無く、一体何を打っているのかサッパリわからない符号を送信するOMがいらっしゃいます。(多分、ご自分の中では区切っているのでしょうが) このような信号はCW Decoderでは解読できません。
⑧ 受信信号レベル低下時の出力抑制
受信信号レベルが低下した場合に、警告を表示すると同時に、”E”や”T”がダラダラと出力されないように、出力抑制をしています。
以上が、デコーダの主要な処理になります。
(1) 基本的な仕組み < [Home] > (3) 実際のプログラムの構造
コメント
コメントを投稿