Частотное детектирование Python

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

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

большое спасибо за справку.

32
задан MatijaG 15 April 2010 в 19:04
поделиться

2 ответа

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

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

Он довольно хорошо работает с тестовыми тональными сигналами, но не будет таким надежным или точным, как другие методы, упомянутые выше. Точность можно повысить, увеличив размер блока (или уменьшить, уменьшив его). Размер блока должен быть кратен 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()
41
ответ дан 27 November 2019 в 20:57
поделиться

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

0
ответ дан 27 November 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: