【问题标题】:Audio sampling rate of an ip camera and FFT网络摄像机和 FFT 的音频采样率
【发布时间】: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


【解决方案1】:

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

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

您可能想查看this question 的答案,以查看显示如何进行实际转换和规范化的代码。

【讨论】:

  • 非常感谢!我会先研究这个,然后给出反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多