Обнаружение частоты Python

Хорошо, что я пытаюсь сделать, это своего рода программное обеспечение для обработки звука, которое может обнаруживать распространенную частоту, если частота воспроизводится достаточно долго (несколько мс), я знаю, что получил положительный результат. я знаю, что мне нужно будет использовать БПФ или что-то подобное, но в этой области математики я сосать, я действительно искал в Интернете, но не нашел кода, который мог бы сделать только это.

цель, которую я пытаюсь получить, заключается в том, чтобы создать собственный протокол для передачи данных через звук, нужно очень низкое битрейт в секунду (5-10 бит / с), но им также очень ограниченный на передающем конце, поэтому получающее программное обеспечение должно иметь возможность настраивать ( не используйте настоящий аппаратный / программный модем), также я хочу, чтобы это было только программное обеспечение (без дополнительного оборудования, кроме звуковой карты)

Большое спасибо за помощь.

  • сложные объекты Python JSON (учет подкласса)
  • Как настроить настраиваемый заголовок ответа для статических (общедоступных) файлов pylons?
  • Создание такой же последовательности случайных чисел в Python, NumPy и R
  • как получить доступ к элементам в 2D-массиве?
  • Рисование прямоугольника или строки с использованием событий мыши в открытом cv с использованием python
  • Чтение и скрипт postgres с использованием python
  • Отображать справочное сообщение с python argparse, когда скрипт вызывается без каких-либо аргументов
  • Проблема Настройка виртуального
  • 3 Solutions collect form web for “Обнаружение частоты Python”

    Библиотеки aubio были обернуты SWIG и поэтому могут использоваться Python. Среди их многочисленных особенностей есть несколько методов определения / оценки тона, включая алгоритм YIN и некоторые алгоритмы гребенки гребенки.

    Однако, если вы хотите что-то более простое, я написал некоторый код для оценки шага некоторое время назад, и вы можете взять его или оставить. Это будет не так точно, как использование алгоритмов в aubio, но оно может быть достаточно хорошим для ваших нужд. Я в основном просто взял БПФ данных раз окно (окно Blackman в этом случае), в квадрате значений FFT, нашел бит, который имел самое высокое значение, и использовал квадратичную интерполяцию вокруг пика, используя журнал максимального значения и его двух соседних значений, чтобы найти основную частоту. Квадратическую интерполяцию я взял из какой-то бумаги, которую я нашел.

    Он работает достаточно хорошо на тестовых тонах, но он не будет таким же надежным и точным, как другие методы, упомянутые выше. Точность может быть увеличена за счет увеличения размера куска (или уменьшения его уменьшения). Размер блока должен быть кратным 2, чтобы полностью использовать БПФ. Кроме того, я определяю только основной шаг для каждого фрагмента без перекрытия. Я использовал PyAudio для воспроизведения звука, выписывая примерный шаг.

    Исходный код:

    # Read in a WAV and find the freq's import pyaudio import wave import numpy as np chunk = 2048 # open up a wave wf = wave.open('test-tones/440hz.wav', 'rb') swidth = wf.getsampwidth() RATE = wf.getframerate() # use a Blackman window window = np.blackman(chunk) # open stream p = pyaudio.PyAudio() stream = p.open(format = p.get_format_from_width(wf.getsampwidth()), channels = wf.getnchannels(), rate = RATE, output = True) # read some data data = wf.readframes(chunk) # play stream and find the frequency of each chunk while len(data) == chunk*swidth: # write data out to the audio stream stream.write(data) # unpack the data and times by the hamming window indata = np.array(wave.struct.unpack("%dh"%(len(data)/swidth),\ data))*window # Take the fft and square each value fftData=abs(np.fft.rfft(indata))**2 # find the maximum which = fftData[1:].argmax() + 1 # use quadratic interpolation around the max if which != len(fftData)-1: y0,y1,y2 = np.log(fftData[which-1:which+2:]) x1 = (y2 - y0) * .5 / (2 * y1 - y2 - y0) # find the frequency and output it thefreq = (which+x1)*RATE/chunk print "The freq is %f Hz." % (thefreq) else: thefreq = which*RATE/chunk print "The freq is %f Hz." % (thefreq) # read some more data data = wf.readframes(chunk) if data: stream.write(data) stream.close() p.terminate() 

    Если вы собираетесь использовать FSK (частотную манипуляцию) для кодирования данных, вам, вероятно, лучше использовать алгоритм Goertzel, чтобы вы могли проверить только нужные вам частоты, а не полный DFT / FFT.

    Хотя раньше я не пробовал обрабатывать аудио с Python, возможно, вы могли бы создать что-то на основе SciPy (или его подпроекта NumPy), рамки для эффективного научного / инженерного численного вычисления? Вы можете начать с просмотра scipy.fftpack для вашего FFT.

    Python - лучший язык программирования в мире.