我正在尝试使用JTransform查找声音信号的主导频率。
我从什么开始:声音信号在byteArray中 (例如:[0、1、2、1、0,-1,-2,-1、0、1、2、1、0])
我要结束的是:各个频率的振幅数组。 (例如:[0、0、10、0、0]->主频为3 Hz)
我创建了一个byte [],并用400Hz声音信号(以每秒44100个样本的采样率)填充(计算得出用于测试)。将其写入文件可产生完美的400Hz声音,因此我知道阵列已正确填充。
现在,我一直在尝试了解FloatFFT_1D realForward()函数的用法,但我似乎还是不明白如何使用它。加上这个数学并不是我的强项,所以我不太了解它是如何工作的。
文档站点提供以下内容: (https://wendykierp.github.io/JTransforms/apidocs/) FloatFFT_1D:计算复杂和真实的单精度数据的一维离散傅里叶变换(DFT)。 realForward(float [] a); :计算实际数据的一维正向DFT,结果保留在a中。
1)在这种情况下,“ float [] a”包含什么?只是包含音频数据的floatArray吗?它是由实数(数组中的偶数位)和复数(数组中的奇数位,因为音频数据是实数,复数部分= 0)数据点组成的数组吗? (这意味着float [] a = [2,0,9,0,4,4,0,3,0,6,0,...],在这种情况下为非零值)。>
2)由于它没有返回类型,并且说将数据放在'float [] a'中,这是否意味着传递给函数的原始数组被返回的数组破坏/替换了?
3)Wikipedia指出:“离散傅里叶变换(DFT)将函数的等距采样的有限序列转换为等时离散傅里叶变换(DTFT)的等长采样序列,这是频率的复数值函数。”。
通过此DTFT,您应该能够计算每个频率的幅度,但是如何?我记得读过一些有关(real * real + imag * imag)的东西,但是哪个是实部,哪个是虚部,如果我计算这个,如何得到一个频率振幅数组?频率的数量(/频率间隔(1hz,1.1hz,1.2hz))是否与带有信号数据的原始输入数组的数量相同?
int getDomFrequency(byte[] inputArray)
{
//Making a new float array with the size of the inputArray
float[] floatDataArray = new float[inputArray.length];
//Converting the byte[] inputArray into a float[] which is needed for the FFT
for(int i = 0; i < inputArray.length; i++)
{
floatDataArray[i] = (float) inputArray[i];
}
//Creating a new instance of the FloatFFT_1D class called 'fft'
FloatFFT_1D fft = new FloatFFT_1D( (float) inputArray.length);
//Using the realForward function to get the DTFT
fft.realForward(floatDataArray);
/*
* using the new floatDataArray which now contains the DTFT of the input signal
* to calculate the dominant frequency of the input signal.
*/
return dominantFrequency;
}
但是,这将出现以下错误: 创建FloatFFT_1D类时出现“ java.lang.NoClassDefFoundError:pl / edu / icm / jlargearrays / LargeArray”,这使我相信我在这里做错了。
最后,我需要弄清楚如何使用DTFT来获得一系列的频率幅度,以便能够找到主导频率,而且即使有DTFT,我也不知道如何到达那里。
>如果有人可以回答一些问题给我一些新的建议,那将是很棒的。谢谢!