14

我正在使用 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 的功率谱密度条形图

4

3 回答 3

9

我认为您需要将输出数据解释如下:

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

[抱歉,我现在有两个单独的答案 - 我认为在我处理新答案时,两个相关的问题已经合并]

于 2011-02-15T22:46:12.510 回答
1

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

给定频率中的功率密度只是该频率中变换的复振幅的大小。复数的大小是从它的分量计算出来的,你应该没有问题得到这个

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

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

希望这可以帮助

于 2011-02-14T20:30:30.690 回答
0

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

对于您特定的 FFTre[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]))
于 2011-02-14T20:41:42.037 回答