сглаживание данных, поэтому построение графиков с использованием данных matplotlib и FFT выглядит лучше (частотный спектр) - PullRequest
0 голосов
/ 18 мая 2019

в основном у меня есть основы музыкального визуализатора, однако я хотел бы улучшить его, в данный момент я получаю много данных и отображаю абсолютное значение моих расчетов FFT, однако это выглядит очень грязно, и я бы хотел, чтобы это было немного сгладил, я выложу GIF того, что его как ниже. я хотел бы сгладить данные, чтобы было меньше всплесков шума, и чтобы удалить нечетные значения, нанесенные в 0 на оси x и действительно высоко на оси y, как это происходит всякий раз, когда вообще появляется шум, он также идет от графика, который мне не нравится.

GIF примера: https://i.imgur.com/eOGzPFd.gifv

видео сглаженного визуализатора: https://www.youtube.com/watch?v=C2TV2DaCVk0

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

Я ценю всю помощь, оказанную мне ранее, и всем, кто продолжает помогать мне !!! <3 </p>

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
callback_output = []

def callback(in_data, frame_count, time_info, flag):
    global audio_data
    audio_data = np.fromstring(in_data, dtype=np.float32)
    callback_output.append(audio_data)
    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,15000])
        ax.set_ylim([0,5])
        x=1

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