平滑数据,以便使用matplotlib和FFT数据进行绘图看起来更好(频谱)

时间:2019-05-18 15:03:16

标签: python numpy matplotlib fft pyaudio

基本上,我具有音乐可视化器的基础知识,但是我想改进它,目前正在获取大量数据并绘制我的fft计算的绝对值,但是,这看起来非常混乱,我希望它是有点平滑,我将在下面发布它的类似图像。我希望对数据进行平滑处理,以使噪声中的尖峰更少,并消除在x轴上绘制为0且在y轴上确实较高的奇数,因为只要有噪声,它都会发生我不喜欢的图表。

gif示例:https://i.imgur.com/eOGzPFd.gifv

平滑的可视化器的视频:https://www.youtube.com/watch?v=C2TV2DaCVk0

是否仅因为其分离并绘制为条形而使其平滑?因为那是我最终的目标,所以是将数据分成多个条形并像这样绘制。我还希望当音乐以低频上升时能够看到图表中更多的变化,但是在我的图表上测试一系列低频,似乎并没有显示出差异。

我感谢任何人以前给我的所有帮助以及任何继续帮助我的人!!! <3

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()

0 个答案:

没有答案