ip camera和FFT的音频采样率

时间:2014-06-25 08:30:34

标签: java arrays inputstream 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,我应该以某种方式纠正率采样Fs的值吗? 非常感谢澄清。

EDITED: 我想,当我组合字节对时,数组的大小将变为64/2 = 32。对于每一对都会这样做:

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

结果是一系列双打,正是我需要的。现在,当我计算出来的时候 频率(归一化后)freq = i * Fs / N,N = 32.是否正确?

另外,由于我使用的是fft.realForward(双打)而不是fft.realForwardFull(双打),我应该将Fs除以2吗?也就是说,Fs = Fs / 2?

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

1 个答案:

答案 0 :(得分:0)

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

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

您可能希望查看this question的答案,以查看代码,了解如何完成实际的转换和规范化。