【发布时间】:2014-08-15 17:26:44
【问题描述】:
我从音频输入流(来自采样率 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(doubles) 而不是 fft.realForwardFull(doubles),我应该将 Fs 除以 2 吗?即Fs = Fs/2?
再次感谢您的帮助和时间..
【问题讨论】:
-
你知道你的数据的位深吗(多少位组成一个样本)?。
-
我应该能够从我用相机记录的 .wav 文件中提取这个数字。但是,如果我知道它,我该如何使用它?谢谢!
-
我不确定我是否理解您要执行的操作,您的意思是将频率除以 2 是什么意思?你的最终目标是什么?你想得到音频的 FFT 吗?
-
我从文档中得到的是 fft.realForward 和 fft.realForwardFull 是相似的,唯一的区别是 fft.realForward 只会返回 fft 结果的一半。
-
我绘制了数据并认为我不必将 Fs 除以 2。:)
标签: java arrays inputstream fft