Я пытаюсь получить частоты из массива, сгенерированного из обратного вызова pyAudio().
def callback(in_data, frame_count, time_info, flag):
audio_data = np.fromstring(in_data, dtype=np.float32)
freq_data = np.fft.fft(audio_data)
freq = np.abs(freq_data)
# Operations here
recovered_signal = np.fft.ifft(filtered_freq).astype(np.float32).tostring()
Я получаю массив длины 2048 и не знаю, что делать дальше. Я сузил список операций, которые мне нужно выполнить, и попытался применить к нему БПФ, но понял, что мне нужно распаковать данные, а документации pyAudio немного не хватает (а тем более иногда даже в Интернете).
Часть моей проблемы в том, что я не понимаю, что такое in_data
. Из того, что я могу сказать из исследований, это байты, которые numpy преобразует для меня в массив. Однако, прочитав статью об обработке сигналов для python, у меня сложилось впечатление, что я должен быть в состоянии извлечь это в частоты, а затем выполнить это для базового фильтра полосы пропускания.
for f in freq:
if index > LOWCUT and index < HIGHCUT:
if f > 1:
filtered_freq.append(f)
#print(index)
else:
filtered_freq.append(0)
else:
filtered_freq.append(0)
index += 1
Я также просмотрел np.fft.fftfreq
, но он также по-прежнему создает массив длиной 2048 вместо массива, содержащего все частоты и их мощность.
Редактировать: я знаю, что с двумя каналами они переплетаются, но моя проблема в основном заключается в том, что я не понимаю, что представляет собой преобразованный массив с помощью numpy и может быть использован.
in_data
— это аудиоданные, которые имеют строковый формат, а в функцииaudio_data
— массив аудиоданных. Если вы открыли файл WAV, это должны быть 16-битные двухканальные данные 48 кГц, и как только они будут в Numpy ndarray, вы можете делать с ними все, что захотите. Документы дляnumpy.fft.fft
кажутся довольно ясными, и есть примеры. Прочтите минимально воспроизводимый пример. - person wwii   schedule 16.05.2018