我正在使用 Jtransforms java 库对给定的数据集执行分析。

数据示例如下:

980,988,1160,1080,928,1068,1156,1152,1176,1264

我在 jTransforms 中使用 DoubleFFT_1D 函数。数据输出如下:

10952, -152, 80.052, 379.936, -307.691, 12.734, -224.052, 427.607, -48.308, 81.472

我无法解释输出。据我了解,输出数组中的第一个元素是 10 个输入的总和 (10952)。它是

我不理解输出数组的其他元素。最终,我想在图表上绘制输入数据的功率谱密度,并最终找到 0 到 0.5 Hz 之间的量。

jTransform 函数的文档指出(其中 a 是数据集):

public void realForward(double[] a) 计算真实数据的1D向前DFT,将结果置于a中。输出数据的物理布局如下:

如果 n 是偶数那么

a[2*k] = Re[k], 0 <= k < n / 2
a[2*k+1] = Im[k], 0 < k < n / 2
a[1] = Re[n/2]

如果 n 是奇数则

a[2*k] = Re[k], 0 <= k < (n+1)/2
a[2*k+1] = Im[k], 0 < k< (n-1)/2
a[1] = Im[(n-1)/2]

此方法仅计算实变换的一半元素。另一半满足对称条件。如果您想要完整的真实前向变换,请使用realforwardfull。要获取原始数据,请在此方法的输出上使用realinverse。

参数:a - 要转换的数据

现在使用上面的方法:(由于我的数据数组的长度是10,所以使用“n是偶数”方法)

Re[0] = 10952
Re[1] = 80.052
Re[2] = -307.691
Re[3] = -224.052
Re[4] = -48.308
Re[5] = 12.734

Im[0] = -152
Im[1] = 379.936
Im[2] = 12.734
Im[3] = 427.607
Im[4] = 81.472

那么一些问题:这个输出看起来正确吗?在我看来,Re[0] 不应该是 10952,它是原始数组中所有元素的总和。

似乎输出应该稍微更正:(我错了吗?)

Re[0] = 80.052
Re[1] = -307.691
Re[2] = -224.052
Re[3] = -48.308
Re[4] = -152

Im[0] = 379.936
Im[1] = 12.734
Im[2] = 427.607
Im[3] = 81.472

现在使用论坛中发布的以下方法:

要获得 bin k 的大小,您需要计算 sqrt(re * re + im * im), ,其中 re、im 是 bin k 的 FFT 输出中的实部和虚部。

对于您特定的 FFT re[k] = a[2*k] and im[k] = a[2*k+1]. 。因此计算功率谱:

for k in 0 to N/2 - 1
{
    spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
}

因此:

spectrum[0] = 388.278
spectrum[1] = 307.955
spectrum[2] = 482.75
spectrum[3] = 94.717

一些问题。这个数据看起来正确吗?我走在正确的轨道上吗?这个频谱数据会绘制出如下所示的结果:

388.278 at .125 Hz
307.955 at .25 Hz
482.75 at .375 Hz
94.717 at .5 Hz

我还差得远吗?我的目标是生成 0 到 0.5Hz 的功率谱密度条形图

有帮助吗?

解决方案

我认为您需要按如下方式解释输出数据:

10952       Re[0] = sum of all inputs = DC component
 -152       Re[5] - see note about a[1] being special - there is no Im[0]
   80.052   Re[1]
  379.936   Im[1]
 -307.691   Re[2]
   12.734   Im[2]
 -224.052   Re[3]
  427.607   Im[3]
  -48.308   Re[4]
   81.472   Im[4]

因此,其幅度为:

spectrum[0] = 10952
spectrum[1] = sqrt(80.052^2 + 379.936^2) = 388.278
spectrum[2] = sqrt(-307.691^2 + 12.734^2) = 307.427
spectrum[3] = sqrt(-224.052^2 + 427.607^2) = 482.749
spectrum[4] = sqrt(-48.308^2 + 81.472^2) = 94.717

[抱歉,我现在有两个单独的答案 - 我认为在我研究新答案时两个相关的问题被合并了]

其他提示

变换中的每个条目代表样本中频率的(复数)幅度。

给定频率下的功率密度只是该频率下变换的复振幅的大小。复数的大小是根据其分量计算的,获得此值应该不会有问题

每列代表增加频率的幅度,从 0(第一个条目)开始,然后 2 Pi/T(其中 T 是样本的长度),直到最后一个样本 2*Pi*N /T(其中 N 是数字)样品)

还有其他约定,其中变换返回 -Pi * N /T 频率直至 Pi * N / T,并且 0 频率分量位于数组的中间

希望这可以帮助

要获得 bin k 的幅度,您需要计算 sqrt(re * re + im * im),其中 re、im 是 bin k 的 FFT 输出中的实部和虚部。

对于您特定的 FFT re[k] = a[2*k]im[k] = a[2*k+1]. 。因此计算功率谱:

for k in 0 to N/2 - 1
  spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top