WebAudio API允许我使用create an AnalyserNode,它可以让我访问一组音频样本的FFT计算频谱(以无符号字节数组或浮点数组-11)。我希望可以使用这些值来计算同一组样本的总功率(RMS)。

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

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

最佳答案

是的,可以从FFT中找到RMS值,您需要确保AnalyserNote不在信号上应用任何窗口(汉宁,布莱克曼,凯撒等)!

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

RMS1 =平方毫米FFOutput的总和除以样本长度

RMS2 =绝对FF的总和除以采样长度再除以采样长度

我在这里进行测试,在450赫兹下创建了一个正弦波db = 50

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

关于javascript - 从频谱功率电平恢复RMS和/或峰值(FFT输出),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19744176/

10-09 01:40