首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Visualizer onFftDataCapture -- byte[]索引是否代表频率?

Visualizer onFftDataCapture -- byte[]索引是否代表频率?
EN

Stack Overflow用户
提问于 2017-09-12 20:48:25
回答 1查看 943关注 0票数 2

我已经了解了安卓视觉器的

代码语言:javascript
运行
复制
onFftDataCapture((Visualizer visualizer, 
            byte[] fft, 
            int samplingRate)

我如何知道哪个频率由fft中的哪个fft表示

例如,索引是否是频率的表示?就像index = frequency

对于指数0,频率为0 Hz,指数1为1Hz,等等?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-13 15:58:25

FFT产生复数,其中每个数字反映包含连续范围频率的桶的频域信息。解释FFT数据的通常方法如下:

  • 首先,通过将FFT表的长度除以采样率来确定频率桶大小,我们称之为bucketSize
  • 然后,每个桶的索引i (假设它的基础是0)包含信息的频率范围从i * bucketSize(i + 1) * bucketSize赫兹;
  • 对于实值信号,FFT表的后半部分(samplingRate / 2以上的频率桶)的值将仅仅是前半部分的镜像,因此它们通常被丢弃;
  • 另外,对于第一个(索引0)和最后一个(索引samplingRate / 2)桶,FFT表的值也是实的(假设是实值信号);
  • 要找到桶中频率的大小(信号电平),需要从这个桶的FFT表中提取复数值,比如它是a + ib,并计算sqrt(a*a + b*b)

现在回到onFftDataCapture的结果。这里,fft数组包含复数作为连续的字节对,除了前两个元素,所以fft[2]fft[3]包含第一个桶、fft[4]fft[5] --第二个元素的复数,等等。而fft[0]是0阶频率(DC)的FFT值(实),而fft[1]是最后一次频率。

因为,正如我前面提到的,对于实值信号,FFT表的第二部分并没有带来任何好处,所以是而不是fft数组中提供的。但是,由于每个快速傅立叶变换桶采用两个阵列单元,所以以赫兹为单位的桶大小仍将被计算为fft.length / samplingRate。注意,fft.length实际上是可视化器的setCaptureSize方法设置的捕获大小。

使用Math.hypot函数可以很容易地计算频率桶的大小,例如,对于第一个桶,它是Math.hypot(fft[2], fft[3])。对于DC桶,它只是Math.abs(fft[0]),对于最后一个频率桶,它是Math.abs(fft[1])

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46185101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档