python中的Web音频api分析器节点

时间:2018-06-01 21:40:57

标签: python fft web-audio-api

我尝试在python中实现web音频API的一部分。我正好尝试实现getByteFrequencyData方法。

过程是:

  • 从.wav文件或麦克风
  • 获取数据
  • 应用Blackman窗口
  • 计算FFT
  • 随着时间的推移平滑
  • 转换为db
  • 将范围计算为0 - > 255

对于我的用例,我需要这个步骤,除了"随着时间的推移平滑"。对我来说很重要,当我在webaudio api中加载文件和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()

以下是Webaudio api代码的链接:Web Audio API - Analyser Node

更新:

不工作:从web音频api开始,我从fft获得了另一个输出。我认为问题是fft计算的实现不一样。我理解FFT通常是如何工作的,但在代码中实现它是一个更为明显的故事; - )

更新

FFT输出完全不同。它看起来像这样(40.7474782 + 0.5674489j)。我不知道这是什么数字。我认为当FFT输出正确时,其他计算工作正常。

我实现这一点的原因是我需要在客户端和服务器上做一些DSP,这个处理需要基于相同的FFT计算。对于简单城市,我会使用web audio api进行客户端实现。

对于测试,我使用500hz的正弦波wav文件。

0 个答案:

没有答案