我已经了解了安卓视觉器的
onFftDataCapture((Visualizer visualizer,
byte[] fft,
int samplingRate)
我如何知道哪个频率由fft
中的哪个fft
表示
例如,索引是否是频率的表示?就像index = frequency
对于指数0,频率为0 Hz,指数1为1Hz,等等?
发布于 2017-09-13 15:58:25
FFT产生复数,其中每个数字反映包含连续范围频率的桶的频域信息。解释FFT数据的通常方法如下:
bucketSize
;i
(假设它的基础是0)包含信息的频率范围从i * bucketSize
到(i + 1) * bucketSize
赫兹;samplingRate / 2
以上的频率桶)的值将仅仅是前半部分的镜像,因此它们通常被丢弃;0
)和最后一个(索引samplingRate / 2
)桶,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])
。
https://stackoverflow.com/questions/46185101
复制相似问题