我正在使用 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)
计算真实数据的一维前向 DFT,将结果保存在 . 输出数据的物理布局如下:如果 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 的功率谱密度条形图