2015-06-12 4 views
1

Я хочу определить частоты, присутствующие в музыкальном файле. Он будет извлекать фрагмент данных из музыкального файла и печатать частоты, присутствующие в нем. то он выберет еще один фрагмент данных. Можно ли сделать это с помощью python? Я новичок в этой области. Если бы кто-нибудь мог мне помочь, я буду очень благодарен ему. Мое целевое устройство - малиновый пи.Как определить частоты, присутствующие в музыкальном файле с использованием python

import pyaudio 
import wave 
import numpy as np 

chunk = 2048 
wf = wave.open('/home/pi/music.wav', 'rb') 
swidth = wf.getsampwidth() 
RATE = wf.getframerate() 
window = np.blackman(chunk) 
p = pyaudio.PyAudio() 
stream = p.open(format = 
    p.get_format_from_width(wf.getsampwidth()), 
    channels = wf.getnchannels(), 
    rate = RATE, 
    output = True) 
data = wf.readframes(chunk) 
while len(data) != '': 
stream.write(data) 
indata = np.array(wave.struct.unpack("%dh"%(len(data)/swidth),\ 
          data))*window 
fftdata=abs(np.fft.rfft(indata))**2 
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() 

моя выше программа работает нормально для одночастотного образца. но для песни он показывает ошибку на строке indata = np.array (wave.struct.unpack ("% dh"% (len (data)/swidth), data)) * window. error msg - операнды не могут транслироваться вместе с фигурами. как исправить проблему ??

+2

Итак, вы в основном хотите выполнить fft с python? – meneldal

+0

Если вы укажете один пример, это будет полезно понять. @ meneldal –

+0

Возможно, вам захочется немного прочитать преобразования Фурье, чтобы вы могли понять результат. Если у вас нет идеальной синусоиды, у вас не будет чего-то простого. – meneldal

ответ

1

Для определения частот в сигнале (например, аудиосигнала) вы можете использовать Фурье-преобразование. Наиболее распространенная численная реализация называется fft (для быстрого преобразования Фурье).

У Python есть все, что вам нужно для этого: Discrete Fourier Transform (numpy.fft).

Итак, первое, что нужно сделать, это поместить ваши данные в массив, а затем отправить его функции.

Затем вам нужно сделать небольшую математику, чтобы получить частоту. К счастью, вы можете найти Wikipedia для преобразования времени и частоты. Так как вы не сказали, частоту дискретизации, я не могу дать вам номер, но вы можете следовать формуле:

f=1/T*i с T общее время и i индекс таблицы.

+0

Я отредактировал мое сообщение с кодом, но оно не работает. в чем проблема в этом коде. @ meneldal –

+0

Пожалуйста, скажите, что не работает точно. Это крушение? Не возвращает ничего? Вы даже знаете, что должно получиться преобразование fft вашего аудио? – meneldal

+0

Он печатает всю частоту около 10 Гц. Инструкции, которые я использую для преобразования fftdata в частоту, являются правильными? Я думаю, что проблема заключается в процессе конверсии. @ Meneldal –

 Смежные вопросы

  • Нет связанных вопросов^_^