проблема с визуализатором музыки в Python (FFT и вообще)

Поэтому я пытаюсь сделать музыкальный визуализатор, я очень плохо знаком с python (не говоря уже о кодировании в целом) для проекта, который мне нужен, чтобы создать музыкальный визуализатор, но я борюсь, мне удалось получить открытый звук поток.

Вещи, в которых мне нужна помощь:

Является ли приведенный ниже код правильным способом получения данных fft и fftfreq (при условии, что это данные по амплитуде и частоте)? И мне нужно сделать этот расчет где-нибудь еще? Или делает это внутри этой функции правильным способом?

Почему, когда я пытаюсь напечатать fft_data в конце кода, я получаю ошибку (fft_data не определена), даже если я считаю, что функция вызывается ранее в коде и должна была что-то вычислить?

Правильно ли я это, чтобы получить возвращаемые переменные из функции, которую мне нужно поместить return ( audio_data, fft_data, fft_freq) т. Д., И если да, то почему он все еще не печатает fft_data внизу?

Я вероятно буду следить за более поздним сообщением, когда я буду мимо этих проблем.

любая помощь, если честно, серьезно ценится <3

ps, так как я новичок в python и кодировании в целом, пожалуйста, постарайтесь не объяснять сложным образом, или, если я попрошу, разработайте более простые термины, если это возможно (не должно быть просто)

это метод, который я хочу использовать, я не хочу использовать librosa или другие модули, которые я хотел бы использовать с numpy struct и pyaudio, поскольку я знаю, что это возможно

 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() def callback(in_data, frame_count, time_info, flag): audio_data = np.fromstring(in_data, dtype=np.float32) print(audio_data) fft_data = np.fft.fft(audio_data) fft_freq = np.fft.fftfreq(len(fft_data)) return (audio_data, fft_data, fft_freq, pyaudio.paContinue) stream = pa.open(format=pyaudio.paFloat32, channels=1, rate=44100, output=False, input=True, stream_callback=callback) stream.start_stream() stream.close() pa.terminate() print(fft_data) 

Если я выполняю print(audio_data) внутри функции обратного вызова, она печатает аудиоданные, но я не уверен, что они уже могут быть отображены, поэтому я предполагаю, что должен использовать fft для них. Однако, когда я пытаюсь напечатать fft_data в нижней части кода, он говорит: «fft_data не определен».

Всего 1 ответ


из документов stream_callback «должен возвращать кортеж: (out_data, flag) » и возвращает управление обратно в PortAudio, а не в ваш код.

для отладки вы можете сделать что-то вроде:

callback_output = []

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

а затем сделать FFT впоследствии на данных, которые были сохранены в callback_output


Есть идеи?

10000