マイコンでモールス信号を解析する際、速度変化には追従できても、送信者のクセや不規則な長点・短点の差には対応が難しいことがあります。ここでは、短点・長点の基準を動的に調整するアルゴリズムを改善して、人間のクセにも対応する方法を解説します。
短点基準の動的補正
現在のコードでは、短点基準(dot_std)を受信ごとに平均化して更新していますが、異常値に弱いのが問題です。異常に長い長点が送られた場合、短点基準が誤って延長され、判定が崩れます。
改善策としては、移動平均ではなく、中央値やランダムアクセス型のヒストグラムを用いて短点長を補正する方法が有効です。例えば、直近N個の短点を配列に保持し、その中央値をdot_stdとして判定することで、異常な長点の影響を軽減できます。
長点判定の閾値調整
現状では mark > dot_std * 2 の場合に長点としていますが、人間のクセにより長点が異様に長くなる場合があります。そこで、単純な倍率判定ではなく、標準偏差や分散を用いて、dot_stdの範囲外の極端値のみを長点として扱う方法が有効です。
柔軟な空白判定
スペース判定も dot_std に依存しており、送信者のテンポに左右されやすいです。これを改善するには、短点基準と長点基準を組み合わせた相対的な間隔判定を行い、空白や文字間隔の判定を適応的に変化させます。
具体的なアルゴリズム例
// 直近N個の短点を保持するバッファ
#define N 10
unsigned long dot_buffer[N];
int dot_idx = 0;
// 短点中央値を取得する関数
unsigned long median_dot() {
unsigned long temp[N];
memcpy(temp, dot_buffer, sizeof(temp));
qsort(temp, N, sizeof(unsigned long), compare_ul);
return temp[N/2];
}
// mark受信時の処理
if(mark > median_dot() * 2) {
// 長点判定
bin_index |= 1 << mark_num;
} else {
// 短点としてバッファ更新
dot_buffer[dot_idx++] = mark;
if(dot_idx >= N) dot_idx = 0;
}
まとめ
短点基準の中央値やヒストグラムを用いた補正、長点判定の柔軟化、空白判定の適応化により、人間のクセや異常値に対応できるモールス解読プログラムを作成できます。これにより、短点・長点の差が極端な場合でも安定した判定が可能です。

コメント