How to plot pyaudio input with matplotlib?

Обновить

March 2019

Просмотры

2.7k раз

1

Как я могу построить на Matplotlib входного сигнала от микрофона? Я пытался построить с plt.plot (кадры), но кадры по какой-то причине строки?

а) Почему кадры переменного список строк?

б) Почему список переменных данных строки?

в) Если они представляют энергию / амплитуду одного образца и быть целым числом?

d) Почему длина данных 2048, когда я указал я хочу размер порции 1024?

(Я предполагаю, потому что я использую paInt16, но не может видеть до сих пор, почему он не может быть 1024)

У меня есть следующий код для входа микрофона:

import pyaudio
import audioop
import matplotlib.pyplot as plt
import numpy as np
from itertools import izip
import wave


FORMAT = pyaudio.paInt16                # We use 16bit format per sample
CHANNELS = 1
RATE = 44100
CHUNK = 1024                            # 1024bytes of data red from a buffer
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "file.wav"

audio = pyaudio.PyAudio()

# start Recording
stream = audio.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE, input=True,
                    frames_per_buffer=CHUNK)

frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
frames = ''.join(frames)

stream.stop_stream()
stream.close()
audio.terminate()

1 ответы

2

а) Почему кадры переменного список строк?

Как следствие б), что, как вы строите его в вашем коде.

б) Почему список переменных данных строки?

Это строка байт, то есть только сырая последовательность байт. Это то, что read()возвращается.

в) Если они представляют энергию / амплитуду одного образца и быть целым числом?

Они есть. Они просто упакованы в последовательности байтов, а не в целых Python.

d) Почему длина данных 2048, когда я указал я хочу размер порции 1024?

1024это количество кадров . Каждый кадр имеет длину 2 байта, так что вы получите 2048 байт.

Как я могу построить на Matplotlib входного сигнала от микрофона? Я пытался построить с plt.plot (кадры), но кадры по какой-то причине строки?

Зависит от того, что вы хотите построить. Только сырая амплитуда может быть получена путем преобразования байт строки в массив Numpy:

fig = plt.figure()
s = fig.add_subplot(111)
amplitude = numpy.fromstring(frames, numpy.int16)
s.plot(amplitude)
fig.savefig('t.png')

введите описание изображения здесь

Более полезный сюжет будет спектрограммы :

fig = plt.figure()
s = fig.add_subplot(111)
amplitude = numpy.fromstring(frames, numpy.int16)
s.specgram(amplitude)
fig.savefig('t.png')

введите описание изображения здесь

Но вы можете повозиться с амплитудой , однако вы хотите, теперь, когда у вас есть numpyмассив.