Я пытаюсь найти поле, используя aubio, но я не могу прочитать в audioData напрямую как float32 - PullRequest
0 голосов
/ 25 апреля 2018

Есть ли способ, которым я могу привести все значения как float32 на CHUNK данных? Я пробовал таким образом, это не дает мне ошибку, но тогда Aubio не может распознать любой шаг. Также я не могу разыграть непосредственно как float32 или он становится слишком чувствительным для FFT, который я использую в другой части программы.

CHUNK = 1024 
#need it to be float for pitch, but int for frequencies
#FORMAT = pyaudio.paFloat32
FORMAT = pyaudio.paInt32

CHANNELS = 1
RATE = 44100

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)


audioData = stream.read(CHUNK)
pDetection = aubio.pitch("default", CHUNK,
         CHUNK, RATE)
    #     
# Set unit.
pDetection.set_unit("midi")
pDetection.set_silence(-40)
pDetection.set_tolerance(.1)
 #trying to change data into float         
 for i in audioData:
     i = np.float32(i)

  pitchSamples = np.fromstring(audioData, dtype = aubio.float_type)
    # 
    pitch = pDetection(pitchSamples)[0]

1 Ответ

0 голосов
/ 25 апреля 2018

aubio ожидает сэмплы с плавающей точкой, а не целые числа.Чтобы преобразовать короткие целые числа ([-32768, 32767]) в числа с плавающей точкой ([-1., 1.]), вы можете просто умножить их на 1./32768 ~= 3.0517578125e-05.

def short_to_float(x):
    return x * 3.0517578125e-05

Для справки, полный пример с использованием чисел с плавающей точкойпредоставляется в demo_pyaudio.py .

...