I wanted to do this a few years ago; one idea I had then was letting the user pick the bandwidth of the signal, and then decoding and measuring the entropy of the received text. It might be good to use the network interface to do this, because you then have the freedom to prototype in any language.

I've done some tests and just calculating entropy or Phi value (approximation of English letter frequency) isn't good enough yet. I did this by analyzing fldigi log files, not by comparing decoding output of different modems, so maybe entropy would be good enough. Phi is not useful, though, because of the high frequency of acronyms, Q-signals, and numeric reports in short samples of QSOs.

Leigh/WA5ZNU


On 05/31/2010 02:00 PM, [email protected] wrote:
Thanks for the answer. This is something like that I have in mind: A kind of software-based scanner looping on every frequency of a given frequency range, with a given step. At each step, it measures the signal/noise ratio. If it is powerful enough, it tries a subset of modem types (Subset based on the frequency for example). For each of them, it waits a couple of seconds, and tries to decode something meaningful. Instead of looping on a frequency rqnge, it might as well try a list of given frequencies.

If it can find something 'interesting' (Occurence of given strings such as 'CQ', callsigns, english words etc...) , it writes the data and the frequency in a logbook (Or database like DBlog's one).

I wondered whether <SRCHUP> and <SRCHDN> may help, but I could not really understand them nor make them work.

Thanks

R



Andy obrien wrote:
I have a problem guessing which are the transmit modes of some signals
we receive.

So, do you please think it would be possible to have an automatic system
for guessing the mode of a signal ?

Something which would try all fldigi modes, wait a couple of seconds to
decode something,

You may be able to do thisalready via the macros.  To save sometime,
break it down in to a couple of macros differentiated by distinct
classes of signals, leave out the ones you are already knowledgeable
about (e.g. RTTY is so distinct you probably do not need that in a
macro, same for PSK31.  )  example


<MODEM:CTSTIA:250:8>
<MODEM:CTSTIA:500:16>
<MODEM:CTSTIA:1000:8>
<MODEM:CTSTIA:1000:16>
<MODEM:CTSTIA:500:8>


and play around with the <TIMER:NN> commands in between each mode command.

Andy K3UK
_______________________________________________
fldigi-alpha mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/fldigi-alpha


_______________________________________________
fldigi-alpha mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/fldigi-alpha

#!/usr/bin/env python

import sys, re
from math import log
from collections import defaultdict

def H(data):
  h = 0
  for x in range(256):
    p_x = float(data.count(chr(x)))/len(data)
    if p_x > 0:
      h += - p_x*log(p_x, 2)
  return h

# http://www.daniweb.com/forums/thread261121.html
#
## phi = f1 (f1 - 1) + f2 (f2 - 1) + ... + fn (fn - 1)
#
def P(data):
    phi = 0
    letters_dict = {}
    for ltr in data:
        ltr = ltr.upper()
        if 'A' <= ltr <= 'Z':
            if ltr not in letters_dict:
                letters_dict[ltr] = 0
            letters_dict[ltr] += 1
    for ltr in letters_dict:
        qty = letters_dict[ltr]
        phi += qty * (qty-1)
    return phi

def letterlen(data):
    l = 0
    for ltr in data:
        ltr = ltr.upper()
        if 'A' <= ltr <= 'Z':
            l = l + 1
    return l

def englishPhi(data):
    l = letterlen(data)
    return 0.0661 * l * l-1

def randomPhi(data):
    l = letterlen(data)
    return 0.0385 * l * l-1

def printEntropyRows():
    x = rowsByEntropy.keys()
    x.sort()
    for row in x:
            print row, rowsByEntropy[row]

def printPhiRows():
    x = rowsByPhi.keys()
    x.sort()
    for row in x:
            print row, rowsByPhi[row]

header = re.compile("^[RT]X \(\d\d\d\d-\d\d-\d\d \d\d:\d\dZ\): ")
ctx = re.compile("<[A-Z][A-Z][A-Z0-9]?>")
rowsByEntropy = defaultdict(list)
rowsByPhi = defaultdict(list)
for row in open(sys.argv[1], 'r'):
    if row.startswith('RX'):
        row = header.sub("", row)
        row = ctx.sub("", row)
        rowsByEntropy[H(row)].append(row)
        phi = P(row)
        if phi > randomPhi(row):
            rowsByPhi[phi].append(row)
        else:
            pass
#            print "row is random: phi=%s e=%s r=%s row=%s" % (phi, englishPhi(row), randomPhi(row), row)

printPhiRows()
printEntropyRows()
_______________________________________________
fldigi-alpha mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/fldigi-alpha

Reply via email to