Sya*_*ati 9 java signal-processing fft apache-commons
我想使用用于FFT(FastFourierTransformer类)的Apache数学公共实现来处理一些虚拟数据,其中8个数据样本对一个完整的正弦波有贡献.最大振幅230.我尝试过的代码片段如下:
private double[] transform()
{
double [] input = new double[8];
input[0] = 0.0;
input[1] = 162.6345596729059;
input[2] = 230.0;
input[3] = 162.63455967290594;
input[4] = 2.8166876380389125E-14;
input[5] = -162.6345596729059;
input[6] = -230.0;
input[7] = -162.63455967290597;
double[] tempConversion = new double[input.length];
FastFourierTransformer transformer = new FastFourierTransformer();
try {
Complex[] complx = transformer.transform(input);
for (int i = 0; i < complx.length; i++) {
double rr = (complx[i].getReal());
double ri = (complx[i].getImaginary());
tempConversion[i] = Math.sqrt((rr * rr) + (ri * ri));
}
} catch (IllegalArgumentException e) {
System.out.println(e);
}
return tempConversion;
}
Run Code Online (Sandbox Code Playgroud)
1)现在方法变换返回的数据是一个复数数组.该数组是否包含有关输入数据的频率组件信息?或者我创建的tempConversion数组是否包含频率信息?tempConversion数组中的值为:
2.5483305001488234E-16
920.0
4.0014578493024757E-14
2.2914314707516465E-13
5.658858581079313E-14
2.2914314707516465E-13
4.0014578493024757E-14
920.0
Run Code Online (Sandbox Code Playgroud)
2)我搜索了很多但是在大多数地方都没有明确的文档说明数据算法的格式是什么(在示例代码方面要更好地理解)以及如何使用结果数组来计算包含在信号?
Pau*_*l R 11
您的输出数据看起来正确.您已计算出每个频率仓的复数FFT输出的幅度,该频率对应于该仓的相应频率的输入信号中的能量.由于您的输入纯粹是真实的,因此输出是复共轭对称的,最后3个输出值是冗余的.
所以你有了:
Bin Freq Magnitude
0 0 (DC) 2.5483305001488234E-16
1 Fs/8 920.0
2 Fs/4 4.0014578493024757E-14
3 3Fs/8 2.2914314707516465E-13
4 Fs/2 (Nyq) 5.658858581079313E-14
5 3Fs/8 2.2914314707516465E-13 # redundant - mirror image of bin 3
6 Fs/4 4.0014578493024757E-14 # redundant - mirror image of bin 2
7 Fs/8 920.0 # redundant - mirror image of bin 1
Run Code Online (Sandbox Code Playgroud)
除了箱1(和箱6)之外,所有值实际上都是0,其对应于Fs/8预期的频率.