frequency finder Algorithm

The Frequency Finder Algorithm is a powerful computational technique used to identify and analyze the frequency components present within a given set of data, typically in the form of time-series or signals. This algorithm is widely implemented in various applications, such as signal processing, communication systems, and data analysis, to extract meaningful information from raw data. The primary objective of the frequency finder algorithm is to determine the primary frequencies and their corresponding amplitudes, providing valuable insights into the patterns, trends, and periodicities present in the data. The algorithm employs various techniques and tools, such as the Fourier Transform (FT) and the Fast Fourier Transform (FFT), to transform the time-domain data into the frequency domain, enabling the identification of different frequency components. The Fourier Transform decomposes a signal into its constituent sinusoidal frequencies and provides their amplitudes, while the Fast Fourier Transform is an efficient algorithm for computing the Discrete Fourier Transform, reducing the complexity of calculations. Once the frequency-domain representation is obtained, the algorithm identifies the most dominant frequencies and their corresponding amplitudes, which often hold significant meaning in the context of the data. The frequency finder algorithm plays a crucial role in many areas, including audio signal processing, image processing, and telecommunications, enabling the extraction of valuable information from complex data sets.
# Frequency Finder

# frequency taken from http://en.wikipedia.org/wiki/Letter_frequency
englishLetterFreq = {
    "E": 12.70,
    "T": 9.06,
    "A": 8.17,
    "O": 7.51,
    "I": 6.97,
    "N": 6.75,
    "S": 6.33,
    "H": 6.09,
    "R": 5.99,
    "D": 4.25,
    "L": 4.03,
    "C": 2.78,
    "U": 2.76,
    "M": 2.41,
    "W": 2.36,
    "F": 2.23,
    "G": 2.02,
    "Y": 1.97,
    "P": 1.93,
    "B": 1.29,
    "V": 0.98,
    "K": 0.77,
    "J": 0.15,
    "X": 0.15,
    "Q": 0.10,
    "Z": 0.07,
}
ETAOIN = "ETAOINSHRDLCUMWFGYPBVKJXQZ"
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"


def getLetterCount(message):
    letterCount = {
        "A": 0,
        "B": 0,
        "C": 0,
        "D": 0,
        "E": 0,
        "F": 0,
        "G": 0,
        "H": 0,
        "I": 0,
        "J": 0,
        "K": 0,
        "L": 0,
        "M": 0,
        "N": 0,
        "O": 0,
        "P": 0,
        "Q": 0,
        "R": 0,
        "S": 0,
        "T": 0,
        "U": 0,
        "V": 0,
        "W": 0,
        "X": 0,
        "Y": 0,
        "Z": 0,
    }
    for letter in message.upper():
        if letter in LETTERS:
            letterCount[letter] += 1

    return letterCount


def getItemAtIndexZero(x):
    return x[0]


def getFrequencyOrder(message):
    letterToFreq = getLetterCount(message)
    freqToLetter = {}
    for letter in LETTERS:
        if letterToFreq[letter] not in freqToLetter:
            freqToLetter[letterToFreq[letter]] = [letter]
        else:
            freqToLetter[letterToFreq[letter]].append(letter)

    for freq in freqToLetter:
        freqToLetter[freq].sort(key=ETAOIN.find, reverse=True)
        freqToLetter[freq] = "".join(freqToLetter[freq])

    freqPairs = list(freqToLetter.items())
    freqPairs.sort(key=getItemAtIndexZero, reverse=True)

    freqOrder = []
    for freqPair in freqPairs:
        freqOrder.append(freqPair[1])

    return "".join(freqOrder)


def englishFreqMatchScore(message):
    """
    >>> englishFreqMatchScore('Hello World')
    1
    """
    freqOrder = getFrequencyOrder(message)
    matchScore = 0
    for commonLetter in ETAOIN[:6]:
        if commonLetter in freqOrder[:6]:
            matchScore += 1

    for uncommonLetter in ETAOIN[-6:]:
        if uncommonLetter in freqOrder[-6:]:
            matchScore += 1

    return matchScore


if __name__ == "__main__":
    import doctest

    doctest.testmod()

LANGUAGE:

DARK MODE: