我尝试在python中实现web音频API的一部分。我正好尝试实现getByteFrequencyData方法。
过程是:
对于我的用例,我需要这个步骤,除了"随着时间的推移平滑"。对我来说很重要,当我在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文件。