Web Audio API有一个分析器节点,允许您在正在使用的音频上获取FFT数据,并具有获取数据的字节和浮点数.字节版本有点意义,返回看起来像标准化(取决于最小和最大分贝值)强度频谱,其中0不是特定频率仓的音频分量而255是最大值.
但是我想要比8位更多的细节,但使用float版本会产生奇怪的结果.
freqData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(freqData);
Run Code Online (Sandbox Code Playgroud)
这给了我介于-891.048828125和0. -891之间的值对应于静音,因此它在某种程度上是最小值,而我猜0是等于最大值.
这是怎么回事?为什么-891.048828125显着?为什么一个大的负面是沉默,零是最大的?我使用错误的FloatArray还是存在配置错误?Float64给出0值.
也许我正在做一些奇怪的事情,但是在使用numpy时可能会发现令人惊讶的性能损失,无论使用的功率如何都显得一致.例如,当x是随机的100x100阵列时
x = numpy.power(x,3)
Run Code Online (Sandbox Code Playgroud)
比约慢60倍
x = x*x*x
Run Code Online (Sandbox Code Playgroud)
各种阵列尺寸的加速图显示了一个最佳尺寸10k左右的阵列和其他尺寸的5-10倍速度.

在你自己的机器上测试下面的代码(有点乱):
import numpy as np
from matplotlib import pyplot as plt
from time import time
ratios = []
sizes = []
for n in np.logspace(1,3,20).astype(int):
a = np.random.randn(n,n)
inline_times = []
for i in range(100):
t = time()
b = a*a*a
inline_times.append(time()-t)
inline_time = np.mean(inline_times)
pow_times = []
for i in range(100):
t = time()
b = np.power(a,3)
pow_times.append(time()-t)
pow_time = np.mean(pow_times)
sizes.append(a.size)
ratios.append(pow_time/inline_time)
plt.plot(sizes,ratios)
plt.title('Performance of inline vs numpy.power')
plt.ylabel('Nx …Run Code Online (Sandbox Code Playgroud) 针对Chrome Canary的http://code.google.com/p/chromium/issues/detail?id=112367阻止获取麦克风输入的错误现已修复.这部分似乎确实有效.我可以将麦克风输入分配给音频元素,并通过扬声器听到结果.
但我想连接分析仪节点以进行FFT.如果我将音频源设置为本地文件,分析器节点可以正常工作.问题是当连接到mic音频流时,分析器节点只返回基值,就好像它根本没有音频流一样.(如果你好奇的话,一遍又一遍-100.)
谁知道怎么了?它还没有实现吗?这是一个铬虫吗?我在Windows 7上运行26.0.1377.0并启用了getUserMedia标志,并通过python的simpleHTTPServer通过localhost服务,因此它可以请求权限.
码:
var aCtx = new webkitAudioContext();
var analyser = aCtx.createAnalyser();
if (navigator.getUserMedia) {
navigator.getUserMedia({audio: true}, function(stream) {
// audio.src = "stupid.wav"
audio.src = window.URL.createObjectURL(stream);
}, onFailure);
}
$('#audio').on("loadeddata",function(){
source = aCtx.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(aCtx.destination);
process();
});
Run Code Online (Sandbox Code Playgroud)
同样,如果我将audio.src设置为注释版本,它可以工作,但是使用麦克风则不行.流程包含:
FFTData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(FFTData);
console.log(FFTData[0]);
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用createMediaStreamSource并绕过音频元素 - 例4 - https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html.也不成功.:(
if (navigator.getUserMedia) {
navigator.getUserMedia({audio: true}, function(stream) {
var microphone = context.createMediaStreamSource(stream);
microphone.connect(analyser);
analyser.connect(aCtx.destination);
process();
}
Run Code Online (Sandbox Code Playgroud)
我想有可能将mediasteam写入缓冲区,然后使用dsp.js或其他东西来做fft,但我想在我走这条路之前先检查一下.
是否有一种原生的numpy方式来转换布尔字符串表示的数组,例如:
['True','False','True','False']
Run Code Online (Sandbox Code Playgroud)
对于我可以用于屏蔽/索引的实际布尔数组?我可以做一个for循环并重建数组,但对于大型数组,这很慢.
我有一堆json对象需要压缩,因为它占用了太多的磁盘空间,大约20 gigs价值几百万.
理想情况下,我想要做的是单独压缩每个,然后当我需要读取它们时,只需迭代加载和解压缩每个.我尝试通过创建一个文本文件来做到这一点,每个行都是通过zlib压缩的json对象,但这是失败的
decompress error due to a truncated stream,
我认为这是由于包含新行的压缩字符串.
有人知道这样做的好方法吗?
我正在阅读的论文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf使用每个字符的比特作为评估文本生成计算机模型质量的测试指标.没有参考如何计算.谷歌搜索,我真的找不到任何关于它的东西.
有谁知道如何计算它?Python最好,但伪代码或任何东西都有效.谢谢!
python ×4
javascript ×2
numpy ×2
algorithm ×1
arrays ×1
compression ×1
entropy ×1
fft ×1
file-io ×1
html5 ×1
html5-audio ×1
json ×1
nlp ×1
performance ×1
webkit ×1
webrtc ×1
zlib ×1