我正在从音频输入流(从采样率Fs =44100 in的摄像机中获得数据)获得一个字节数组(大小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(双打)而不是fft.realForwardFull(双打),我是否应该将Fs的值除以2?也就是说,Fs = Fs/2?
再次感谢你的帮助和时间。
发布于 2014-06-25 01:37:25
在对数据执行FFT之前,您必须知道音频的比特深度(通常是16位或32位),这样才能重新组装样本。
例如,如果位深度为16Bits (2个字节),那么我们知道一个字节只包含样本的前8位,而另一个字节将包含最后8位,因此我们组合(而不是添加)字节形成一个sample.After,我们将这个样本除以2^(BitDepth - 1 ) = 2^15 = 32678,得到实际的规范化样本,这将是-1到1之间的一个样本。在这样做之后,我们可以对数据执行快速傅立叶变换。
您可能需要查看this question的答案,以查看显示如何实际转换和正常化的代码。
https://stackoverflow.com/questions/24403764
复制相似问题