Черчение FFT в реальном времени в Python (MatPlotLib) - PullRequest
0 голосов
/ 17 мая 2019

У меня есть входящий аудиопоток через микрофон, который читает pyaudio, я выполняю расчеты БПФ с этими данными, и я хотел бы построить данные амплитуды БПФ на оси Y и данные частоты БПФ на оси Xи обновите его (например, 20 к / с), в основном, чтобы выглядеть так (https://www.youtube.com/watch?v=Tu8p2pywJAs&t=93s), но с низкими частотами слева и более высокими частотами справа.Код, который у меня есть, настолько, насколько у меня есть

Я новичок в Python, не говоря уже о кодировании любой формы или формы, поэтому любая помощь приветствуется, но, пожалуйста, попробуйте и держите ее в понятных терминах, если япрошу уточнить, пожалуйста, сделайте это с уважением, большое спасибо всем, кто дает мне свое время!

import pyaudio
import numpy as np
import time
import matplotlib.animation as animation
import matplotlib.pyplot as plt
from matplotlib import style

pa = pyaudio.PyAudio()

callback_output = []

def callback(in_data, frame_count, time_info, flag):
    audio_data = np.fromstring(in_data, dtype=np.int16)
    callback_output.append(audio_data)
    return None,pyaudio.paContinue


stream = pa.open(format=pyaudio.paInt16,
                 channels=1,
                 rate=44100,
                 output=False,
                 input=True,
                 stream_callback=callback)

stream.start_stream()

fig = plt.gcf()
fig.show()
fig.canvas.draw()

while stream.is_active():
    fft_data = np.fft.fft(callback_output)
    fft_freq = np.fft.fftfreq(len(fft_data))
    plt.plot(fft_freq,fft_data)
    plt.xlim(min(fft_freq),max(fft_freq))
    fig.canvas.draw()
    plt.pause(0.05)
    fig.canvas.flush_events()
    fig.clear()

stream.close()
pa.terminate()

1 Ответ

0 голосов
/ 17 мая 2019

Я не могу сгенерировать данные для вас, но я написал пример, который обновляет граф matplotlib в цикле:

import matplotlib.pyplot as plt
import numpy as np
import time


plt.ion() # Stop matplotlib windows from blocking

# Setup figure, axis and initiate plot
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'ro-')

while True:
    time.sleep(0.5)

    # Get the new data
    xdata = np.arange(10)
    ydata = np.random.random(10)

    # Reset the data in the plot
    ln.set_xdata(xdata)
    ln.set_ydata(ydata)

    # Rescale the axis so that the data can be seen in the plot
    # if you know the bounds of your data you could just set this once
    # so that the axis don't keep changing
    ax.relim()
    ax.autoscale_view()

    # Update the window
    fig.canvas.draw()
    fig.canvas.flush_events()

Вы должны просто иметь возможность изменять строки, в которых назначаются xdata и ydata вцикл, чтобы заставить его работать для ваших данных.

Если вы хотите получить низкие частоты слева, вы можете посмотреть, используя np.fft.fftshift для fftfreq и fftdata: https://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.fftshift.html

...