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