Узел анализатора веб-аудио API в Python - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь реализовать часть веб-аудио API в Python.Именно я пытаюсь реализовать метод getByteFrequencyData.

Процесс:

  • Получить данные из файла .wav или микрофона
  • Применить окно Blackman
  • Рассчитать БПФ
  • Сглаживание во времени
  • преобразование в дБ
  • рассчитать диапазон до 0 -> 255

Для моего случая использования яНужны эти шаги, кроме «Сглаживание во времени».Для меня важно, когда я загружаю файл в API Webaudio и файл в версии Python, я получаю точно такой же вывод.

Вот моя попытка, это не работает:

import scipy.fftpack as fftpack
from scipy.signal import blackman
import scipy.io.wavfile as wav
import os
import os.path as path
import numpy as np
import matplotlib.pyplot as plt

def main():
  filePath = path.normpath(path.join(os.getcwd(), '../reference-files/500hz.wav'))
  minDb = -90
  maxDb = -20
  rangeScale = 1 / (maxDb - minDb)

  sampleFreq, samples = wav.read(filePath)     # Load the audio file

  fft_size = 2048                                          # FFT Size
  window = np.blackman(fft_size)                           # Create the window (blackman)
  win_samples = samples[0:fft_size] * window                 # Take a slice and multiply by a window

  fftData = fftpack.fft(win_samples)                           # Calculate the FFT                       # Convert to dbfs#/ freq_range = np.arange((fft_size / 2) + 1) / (float(fft_size) / sampleFreq)       

  # Normalize
  scaledValues = np.array([])

  for i in range(fftData.size):
    dbMag = 20 * np.log10(fftData[i])
    scaledValue = 255 * (dbMag - minDb) * rangeScale

    if (scaledValue < 0):
      scaledValue = 0

    if (scaledValue > 255):
      scaledValue = 255

    scaledValues = np.append(scaledValues, scaledValue)


if __name__ == "__main__":
    main()

Вот ссылка на код API Webaudio: API веб-аудио - Узел анализатора

Обновление:

Не работает: я получил еще один вывод из fft по состоянию навеб-аудио API.Я думаю, проблема в том, что это не та же реализация, что и при вычислении fft.Я понимаю, как обычно работает БПФ, но это не та история, чтобы реализовать это в коде; -)

Обновление:

Вывод БПФ совершенно другой.Это выглядит так (40.7474782 + 0.5674489j).Я не знаю, что это за номер.Я думаю, что при правильном выводе FFT другие вычисления работают правильно.

Причина, по которой я буду это реализовывать, заключается в том, что мне нужно выполнить несколько DSP на клиенте и на сервере, и эта обработка должна основываться на том жеБПФ расчет.Для простоты я использовал бы web audio api для реализации на стороне клиента.

Для теста я использую wav-файл 500hz sinus.

...