来自 jTransforms DoubleFFT_1D 的功率谱密度
-
14-11-2019 - |
题
我正在使用 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]))