掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
モールス信号を解読するには? (ID:84248)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
もう見ていないかも知れないけど 雑音ですが、これはマイクの感度とも密接な関係が有ります。 VBの画面にスライダーをつけて、スレッシュホールドを変えられる様にします。 又私の前のコードで雑音を1%としましたがこれもスライダーで変えられるように します。 問題は長符と短符ですが、初期設定での処理は無理です。 クロック抽出に拠るフェーズロックと言う方法でやってみたらいかがですか? (私が勝手に付けた名前) まず符号の長さをデーター先読みで長符=短符*3になる所まで探します。 ぴったりは有りませんからとりあえず+−20%位を考えます。 つまり 長符*0.8 > 短符 <長符*1.2 となった時に、短符の長さと 長府の長さを見つけたことになります。 長さを見つけると今度は今まで処理していなかったデーターを今の位置まで どちらに近いかで短、長に分けます。そこで一旦見つけた長さを捨てて、 再び同じことを繰り返します。つまりダイナミックに短符の長さを 探すわけです。 簡単なサンプルを書いてみました、とりあえずデーターは 1200,3000,1000,3500,4000........の様に ONの数OFFの数と交互に並んでいるとします、実際はファイルからの 読み込みとなります。 Dim Max As Integer, Min As Integer Private Sub Command1_Click() Dim Buff(22050) As Integer Dim Pointer As Integer 'どこまで処理したか Dim BMax As Integer, BMin As Integer '一番最後のクロック Min = 22000 '初期値セット 大きな値を適当に Max = 0 '初期値セット 最小値をセットする For n = 1 To UBound(Buff) '一回毎にクロック抽出を試みる If GetClockWidth(Buff(n)) <> 0 Then 'クロックが抽出出来たら処理を進める Pointer = Pointer + 1 For m = Pointer To n '溜まっているデータ−を一気に処理 'どちらの長さに近いか見る If Abs(Min * 3 - Buff(m)) < Abs(Min - Buff(m)) Then If Abs(Min * 5 - Buff(m)) < Abs(Min * 3 - Buff(m)) Then Buff(m) = 5 '長音空白 'バッファを書き換える Else Buff(m) = 3 '長音 'バッファを書き換える End If Else Buff(m) = 1 '単音 'バッファを書き換える End If BMax = Max: BMin = Min Next End If Next '最後にクロックが決まらずに未処理のデータ−が残っていたら '一番最後のクロックを垂れ流す If Pointer < UBound(Buff) Then For n = Pointer + 1 To UBound(Buff) If Abs(BMax - Buff(m)) < Abs(BMin - Buff(m)) Then Buff(m) = 3 '長符 Else Buff(m) = 1 '単符 End If Next End If End Sub Private Function GetClockWidth(d As Integer) 'クロック抽出 If d > Max Then Max = d '最大値 End If If (d < Min) Then Min = d '最小値 End If 'もし最小値の3倍が最大値の+−20%のウインドウに入ったら 'クロック抽出成功 If (Min * 3 > Max * 0.8) And (Min * 3 < Max * 1.2) Then GetClockWidth = Min '短符の長さ発見 'クロック抽出成功の一回毎にクリアする Min = 22000 Max = 0 Else GetClockWidth = 0 End If End Function 大体こんなことで。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.