网络摄像机的音频采样率和FFT



我从音频输入流(来自采样率Fs = 44100Hz的相机,在java中)获得字节数组(大小为64)。然后我将该数组转换为双精度数组(该数组的大小变为8),并使用jtransforms库执行FFT:

DoubleFFT_1D fft = new DoubleFFT_1D(8);
fft.realForward(doubles);

然后计算频率:freq = I *Fs/N。我的问题是,N=8还是N=64?如果N=8,我是否应该纠正速率采样f的值?如能澄清,将不胜感激。

编辑:我认为,当我组合成对的字节时,数组的大小将变成64/2=32。对每一对都这样做:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(firstByte);
bb.put(secondByte);
double val = bb.getDouble(0);

结果是一个双精度数组,这正是我所需要的。现在,当我计算频率(归一化后)频率= i*Fs/N, N = 32。对吗?

另外,当我使用fft.realForward(double)而不是fft.realForwardFull(double)时,我应该将f除以2吗?也就是Fs = Fs/2?

再次感谢您的帮助和时间…

在执行数据的FFT之前,您必须知道音频的位深度(这通常是16位或32位),以便您可以重新组装样本。

例如,如果位深度是16Bits(2字节),那么我们知道一个字节只包含样本的前8位,另一个字节将包含最后8位,所以我们组合(而不是添加)字节来形成样本。在此之后,我们将这个样本除以2^(BitDepth -1) = 2^15 = 32678,以获得实际的归一化样本,这将是一个介于-1和1之间的样本。在此之后,我们可以继续对数据执行FFT。

您可能想要查看这个问题的答案,以查看显示实际的强制转换和规范化如何完成的代码。

最新更新