как я могу превратить этот график в гистограмму, используя те же данные, что и я - PullRequest
1 голос
/ 19 мая 2019

В основном я хотел бы, чтобы мой частотный спектр находился в барах, отличающихся от таких частот, как 0-200, 200-400, 400-800, 800-2000, 2000-4000 и т. Д. И т. Д. Я собираю данные БПФ и строю их встандартным способом в режиме реального времени, но я бы хотел, чтобы он представлял собой гистограмму, поэтому любая помощь приветствуется!

Вот изображение того, как оно выглядит в настоящее время: https://i.imgur.com/eOGzPFd.gifv

это не такНа самом деле я не хочу демонстрировать различия в басах, поэтому я хотел бы сгруппировать частоты в столбцы, некоторые из которых представляют более высокий диапазон частот (например, 2000 Гц - 4000 Гц в одном такте), а некоторые - более низкий диапазон частот (например, 0 Гц-200 Гц).в одном баре)

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()
audio_data = 0

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


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

stream.start_stream()

plt.ion() # Stop matplotlib windows from blocking

# Setup figure, axis and initiate plot
fig, ax = plt.subplots()
ln, = ax.plot([], [], 'b,:')

x = 0

while stream.is_active():

    fft_data = np.fft.fft(audio_data)
    fft_freq = np.fft.fftfreq(len(fft_data),d=1/44100)

    ln.set_xdata(np.abs(fft_freq))
    ln.set_ydata(np.abs(fft_data))


    fig.canvas.draw()
    fig.canvas.flush_events()

    if x == 0:
        ax.relim()
        ax.autoscale_view()
        ax.set_xlim([-500,10000])
        ax.set_ylim([-1,10])
        x=1

stream.close()
pa.terminate()
...