Я пытаюсь реализовать часть веб-аудио 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.