我正在使用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到.5 Hz之间的数量。
jTransform函数的文档说明(其中a是数据集):
public void realForward(double[] a)
计算实数数据的一维正向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到.5Hz产生功率谱密度条形图。