Java ip摄像机的音频采样率和FFT

Java ip摄像机的音频采样率和FFT,java,arrays,inputstream,fft,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的值? 如能澄清,我将不胜感激 编辑: 我

我从音频输入流(从采样率为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的值? 如能澄清,我将不胜感激

编辑: 我计算出,当我组合字节对时,数组的大小将变为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(double)而不是fft.realForwardFull(double),我应该将Fs设置为2吗?也就是说,Fs=Fs/2


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

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

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


您可能希望查看答案,以查看显示如何进行实际转换和归一化的代码。

您知道数据的位深度(一个样本中有多少位)?。我应该能够从我用相机录制的.wav文件中提取此数字。但是如果我知道的话,我怎么能使用它呢?非常感谢。我不知道我是否明白你想做什么,你说的频率除以2是什么意思?你的最终目标是什么?你想得到音频的FFT吗?我从文档中得到的是FFT.realForward和FFT.realForwardFull是相似的,唯一的区别是FFT.realForward只返回FFT结果的一半。我绘制了数据,并计算出我不必将Fs除以2。:)非常感谢你!我会先研究一下,然后给出反馈。