проблема с визуализатором музыки в Python (FFT и вообще) - PullRequest
0 голосов
/ 17 мая 2019

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

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

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

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

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

Вероятно, я займусь более поздним сообщением, когда буду обсуждать эти проблемы.

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

p.s, так как я новичок в 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 Ответ

1 голос
/ 17 мая 2019

из документов , 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

, а затем выполните БПФ для данных, которые были сохранены в callback_output

...