Я получаю результат, которого не понимаю, когда применяю БПФ Jtransform.
Выходная частота, которую я получаю, отличается от ожидаемой.
В настоящее время я пытаюсь использовать Jtransform. Из этой библиотеки я использовал realForward(double[] a)
.
Для тестирования приложения я использовал следующие параметры:
- входная частота = 50 Гц
- частота дискретизации = 1 кГц
- длина сигнала = 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));
}
}
Когда я строю амплитуду сигнала, кроме того, что вижу шум и получаю отрицательный результат для амплитуды, которая, я думаю, может возникнуть из-за отсутствия окна, я получаю неожиданный f-график от применения fft Jtransform ( изображение здесь ).
Я также хотел бы спросить, отображает ли алгоритм FFT Columbia непосредственно частоту и амплитуду, или если он также отображает ячейку, и поэтому мне пришлось бы преобразовать его в F.
См. Печать FFT Колумбия против Jtransform
Синий сигнал - выход FFT Columbia
Красный сигнал FFT Jtransform вывод
Если бы это было так, я мог бы сгенерировать сигнал неправильно.