2013-11-02 40 views
1

WebAudio API允许我使用create an AnalyserNode,它可以让我访问一组音频采样的FFT计算频谱(无论是无符号字节数组还是浮点数阵列-11)。我希望我可以使用这些值来计算同一组样本的总体功率(RMS)。从频谱功率水平恢复RMS和/或峰值(FFT输出)

我不认为这是像32个窗口值一样简单,将它们相加并除以32.(0dB的正弦波只会填满一个窗口,其中一些相邻窗口稍微点亮,而0dB处的白噪声会填满所有窗口。)是否可以从FFT/DFT输出中计算出RMS值?

我想这样做的原因是我需要建立一个有效的RMS计。虽然我可以访问原始样本,但是处理它们甚至可以在每个缓冲区中找到一个峰值,这是过多的开销。浏览器以本机代码运行FFT,比用JavaScript做所有这些计算要有效得多。如果我可以从32个FFT窗口计算RMS,那将更有效率。

回答

1

是的,您可以从FFT中找到RMS值,您需要确保AnalyserNote不在信号上应用任何窗口(hanning,blackman,kaiser等)!

两个简单的方法来获得相同的结果:

RMS1 =平方absulute FFOutput通过样品

的长度除以SUMM

RMS2 = absulute FFOutput的SUMM平方通过的长度又分为样品长度除以样品

我测试这里我创建一个正弦波分贝= 50,在450赫兹

dbimput = 50; 
t = [ 0 : 1 : 10000];   
f = 450;      
Fs = 44100;      
data =10^(dbimput/20)*sin(2*pi*f/Fs*t)';   


FFTDATA = fft(data); 

rms1 = sum(abs(FFTDATA /length(data)).^2) 

rms2 = sum(abs(FFTDATA .^2)/length(data))/(length(data)) 

dblevel1 = 20 * log10(sqrt(rms1)) 

dblevel2 = 20 * log10(sqrt(rms2)) 

为它的结果是:

rms1 = 4.9976e+04 
rms2 = 4.9976e+04 
dblevel1 = 46.988 
dblevel2 = 46.988 
+0

谢谢你的回答。不幸的是,根据http://lists.w3.org/Archives/Public/public-audio/2012OctDec/0684.html上的信息,似乎在FFT之前使用了Blackman窗口。看起来我无法从结果中计算出正确的RMS值,但您的答案无论如何都是有帮助的! – Brad

2

对于它的价值 - 我有一个应用程序在使用getByteTimeDomainData()一个​​环任何地方从12到20的轨道计算RMS,它是足够快。在这些计算和绘制结果中,每16.7ms以<canvas>作为米,我始终在Chrome和Firefox中获得60fps。

现代JS引擎在合理快速地进行数学方面非常出色。