来自jTransforms DoubleFFT_1D的功率谱密度

时间:2011-02-15 22:27:33

标签: fft spectral-density

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

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

给定频率中的功率密度仅是该频率中变换的复振幅的大小。复数的大小是从其组件计算出来的,你不应该在获得这个

时遇到问题

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

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

希望这会有所帮助

答案 2 :(得分:0)

要获得bin k的大小,你需要计算sqrt(re * re + im * im),更重要的是,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]))