Skip to content

CW4ISR2 #243

@JG1VPP

Description

@JG1VPP

問題意識

複数信号の追跡

複数信号の分離、誤表示の抑制、リアルタイム性の改善が課題である。現状の方式は、その時点で強い周波数 bin を中心に処理するため、近接した信号同士で強い方に引き寄せられやすく、中心周波数が 1〜2 bin 変動しただけで別信号として扱われやすい。Track を導入することで、各信号を継続的に追跡する対象として保持できるようになり、近接した 2 局を別々に維持しやすくなり、フェージングによるわずかな周波数変動でも追尾が切れにくくなり、強い局の近傍にある弱い局も残りやすくなる。これは、強い音をその都度拾う方式から、個々の信号を継続して追う方式へ移行することを意味する。

復調の安定性

1 bin を直接読む方式では、信号が bin 境界に乗った場合や微小な周波数ずれが生じた場合にレベル系列が不安定になりやすい。近傍 bin を合成して包絡を構成することで、ON/OFF 判定がぶれにくくなり、短点と長点の長さ推定が安定し、隣接信号やスペクトル漏れの影響も受けにくくなる。その結果、点と線の取り違えや文字間、語間の誤判定を減らすことができる。

確定前表示の抑制

表示の確定タイミングにも改善余地がある。従来の Trim ベースの扱いは末尾の未完成要素を隠すには有効であるが、文字が確定したかどうかを明示的に管理していない。PendingCode と CommitText を分離することで、ON が終わっただけでは表示せず、文字間 gap が十分に観測された時点で文字を確定し、語間 gap が観測された時点で空白も確定できる。これにより、未確定の文字が先に表示される問題を大きく減らすことができる。

リアルタイム性の改善

リアルタイム性についても、未確定の内容を先に出すことで見かけ上の速さを得るのではなく、確定した内容のみを即時に表示する方向へ改める必要がある。この変更により、表示がわずかに遅れる場面はあり得るが、表示された文字の信頼性は高まり、UI の揺れも抑えられる。結果として、速さだけを優先した表示ではなく、確定ベースのリアルタイム表示に近づく。

速度変動への追従

Dit を track ごとに保持して更新することで、送信者ごとの打鍵速度の違い、やや詰まったり伸びたりする癖、運用中の微小な速度変化に追従しやすくなる。これにより、固定しきい値による判定よりも、短点と長点、要素間と文字間、語間の分類が安定する。

混信とノイズへの耐性

ヒステリシス付きの ON/OFF 判定や短すぎるパルスの除去を導入することで、一瞬のノイズで点が出る誤り、短い谷によって文字が不自然に切れる誤り、隣接局の裾で ON 扱いになる誤りを抑制できる。特に 7MHz 帯のような混雑した CW 環境では、この改善の効果が大きいと考えられる。

全体としての変化

総じて、この提案により、アプリはスペクトル上の強い箇所を毎回読み直すデコーダから、複数の CW 信号をそれぞれ追跡し、確定した文字だけを出力するデコーダへ近づくことになる。改善が期待できる点は、複数局の分離性能、表示の安定性、誤表示の抑制、確定タイミングの明確化、混雑帯での粘り強さである。これは精度の改善にとどまらず、実運用における使いやすさの向上にも直結する。受信者の体感としては、読める文字数が増えること以上に、表示結果を信用しやすくなる変化として現れるはずである。

解決方法

Track の導入

既存の History ベースの継続判定を見直し、内部状態として Track を導入する。これにより、周波数 bin の一致ではなく、継続的に追跡している信号そのものを単位として扱えるようにする。各 Track は中心周波数、強度、雑音床、最終観測時刻、未確定の符号列、確定済みの文字列、推定中の Dit 長などを保持し、フレームごとに更新する構造とする。

ピーク検出とトラック割り当て

各更新では、スペクトル全体から局所ピークを抽出し、そのピークを既存の Track に割り当てる。割り当てには周波数差と強度差を用い、近傍かつ継続性の高いものを優先して対応付ける。適切な Track が存在しない場合には新規に Track を生成し、一定時間観測されなくなった Track は破棄する。この変更により、一時的な周波数揺れや強弱変動があっても、同一信号を継続して追跡しやすくする。

近傍 bin の合成

各 Track に対する復調入力は単一 bin から直接取得するのではなく、中心周波数の近傍数 bin を重み付きで合成した包絡を用いる。これにより、信号が bin 境界に位置する場合や微小な周波数変動がある場合でも、より安定したレベル系列を得られるようにする。結果として、ON/OFF 判定、短点と長点の推定、文字間と語間の判定を安定化させる。

Track 単位の復調状態管理

従来の stateless な再判定に加えて、Track ごとに状態を持ちながら復調を進める方式を導入する。各 Track は現在の ON/OFF 状態、継続フレーム数、推定 Dit 長、文字間 gap、語間 gap を保持し、入力系列を逐次処理しながら更新する。これにより、各信号の時間的連続性を利用した判定が可能になり、単発の揺れや局所的な乱れに強い構造へ移行する。

Pending と Commit の分離

未確定の符号列と確定済みの文字列を明確に分離する。ON 区間が終わった時点では短点または長点を PendingCode に追加するだけにとどめ、文字間 gap が十分に観測された時点で初めて CommitCode と CommitText に反映する。語間 gap が観測された場合には空白も同時に確定する。この方式により、確定前の文字が UI に出ることを防ぎ、確定した瞬間のみ表示される挙動を実現する。

適応的な速度推定

Dit は固定値ではなく Track ごとに保持し、観測された ON 区間の長さに応じて徐々に更新する。短点と判断された場合はその長さを、長点と判断された場合は 3 分の 1 に正規化した長さを用いて Dit を更新し、同時に文字間 gap と語間 gap も再計算する。この方式により、送信者ごとの癖や運用中の速度変化に自然に追従できるようにする。

ノイズ耐性の強化

ON/OFF 判定にはヒステリシスを導入し、立ち上がりと立ち下がりで異なる閾値を用いる。これにより、境界付近の揺れによるチャタリングを抑制する。また、短すぎる ON パルスや短すぎる OFF ギャップはノイズとして扱うことで、一瞬の雑音による誤検出や不自然な文字分断を減らす。この変更により、混信環境やノイズの多い受信条件においても、より安定した出力を目指す。

既存インターフェースとの整合

内部では Track を中心とした状態管理へ移行する一方で、外部への出力は引き続き Message とする。Track の状態から Snapshot を生成することで、既存の Program フックや表示処理との互換性を維持する。これにより、内部実装を大きく改善しつつ、周辺コードへの影響を最小限に抑える構成とする。

Metadata

Metadata

Labels

CWCW decoder & encoderenhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions