了解Jtransform和ColumbiaFFT

时间:2019-04-21 13:06:11

标签: java fft

当我应用Jtransform的FFT时,会得到一个我不理解的结果。

我得到的输出频率与我期望的不同。

当前,我尝试使用Jtransform。在该库中,我使用了realForward(double[] a)

为了测试该应用程序,我使用了以下参数:

  • 输入频率= 50 hz
  • 采样率= 1 Khz
  • 信号长度= 1024

下面是我编写的测试方法的代码段:

private static void test() {
    //double[] signal = {980, 988, 1160, 1080, 928, 1068, 1156, 1152, 1176, 1264};

    int signalLength = 1024;
    double[] signal = new double[signalLength];
    double sampleRate = 1000;
    // Generate sin signal f = 50 , SampleRate = 0,001
    for (int i = 0; i < signal.length; i++) {
        signal[i] = Math.sin(2 * Math.PI * i * 50.0 / sampleRate);
    }
    // Copy signal for columbiaFFT
    double signal2[] = signal.clone();
    // Calculate FFT using Jtransforms
    DoubleFFT_1D fft_1D = new DoubleFFT_1D(signal.length);
    fft_1D.realForward(signal);

    double[] magResult = new double[signal.length / 2];

    double re, im;
    magResult[0] = signal[0];
    for (int i = 1; i < magResult.length - 1; i++) {
        re = signal[i * 2];
        im = signal[i * 2 + 1];
        magResult[i] = Math.sqrt(re * re + im * im);
    }
    // converting bin to frequency values
    double[] bin2freq = new double[magResult.length];

    // sampleRate is in Hz
    for (int i = 0; i < bin2freq.length; i++) {
        bin2freq[i] = i * sampleRate / magResult.length;
        //bin2freq[i] = i  * sampleRate / * signal.length;
    }
    System.out.println("freq 1 " + bin2freq[1]);


    // Calculate FFT using columbiaFFT
    FFTColumbia fftColumbia = new FFTColumbia(signalLength);
    double[] imaginary = new double[signal2.length];
    fftColumbia.fft(signal2, imaginary);
    double[] magColumbia = new double[signal2.length];
    for (int i = 0; i < magColumbia.length; i++) {
        magColumbia[i] = Math.sqrt(Math.pow(signal2[i], 2) + Math.pow(imaginary[i], 2));
    }

}

当我绘制信号幅度时,除了看到噪声,而且对幅度的结果是负数(我认为这可能是由于不应用窗口而引起的)时,通过应用Jtransform的fft({ 3}})。

我还想问问image here是直接显示频率和幅度还是是否也在显示bin,因此我必须将其转换为F。

FFT Columbia algorithm

蓝色信号是FFT哥伦比亚输出 红色信号是FFT Jtransform输出

如果是这种情况,我可能会产生错误的信号。

0 个答案:

没有答案