Я пытаюсь написать небольшое дискретное преобразование Фурье в Java, чтобы найти спектр величины в ясном 400 Гц Sinus сигнала (1 секунду как РСМ подписанной-короткий)амплитудного спектр в ДПФЕ
Итак, сначала я вычислить ДПФ для комплексных значений:
public void berechneDFT(int abtastwerte) {
int i;
int N = abtastwerte;
ReX = new double[N/2+1];
ImX = new double[N/2+1];
TextFileOperator tfo = new TextFileOperator(file.substring(0, file.length()-4)+"_DFT.txt");
try {
tfo.openOutputStream();
tfo.writeString("ReX ImX\n");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// real-Anteil berechnen
for (i=0, ReX[i] = 0, ImX[i] = 0; i <= N/2; i++)
{
for(int n=0; n < N; n++)
{
ReX[i] += x[n] * Math.cos((2.0 * Math.PI * n * i)/(double) N);
ImX[i] += - (x[n] * Math.sin((2.0 * Math.PI * n * i)/(double) N));
}
tfo.writeString(ReX[i] +" "+ImX[i]+"\n");
}
x = null;
tfo.closeOutputStream(); // flush
System.out.println("Anteile berechnet.");
}
И тогда я пытаюсь вычислить спектр величину:
public void berechneBetragsSpektrum() {
int N = ReX.length;
TextFileOperator tfo = new TextFileOperator("betragsspektrum_400hz.txt");
try {
tfo.openOutputStream();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
double powerAtFreq;
int marker = 0;
double maxPowerAtFreq = 0;
for(int i=0; i < N; i++)
{
double A1 = ReX[i] * ReX[i];
double A2 = ImX[i] * ImX[i];
powerAtFreq = Math.sqrt(A1+A2);
if(powerAtFreq > maxPowerAtFreq)
{
maxPowerAtFreq = powerAtFreq;
marker = i;
}
tfo.writeString(powerAtFreq+"\n");
}
tfo.closeOutputStream();
System.out.println("Stärkste Frequenz: "+(marker)+" Hz");
}
Но по какой-то причине я только получаю результат 400 Гц в «маркер», если Я хочу проверить все 16000 образцов. Но разве я не должен видеть пик в 400 Гц, также, если бы я выбрал только 800 образцов, потому что с 800 я мог видеть 800/2 = 400 Гц как максимальную частоту?
Я думаю, что некоторые вещи должны быть неправильными с кодом, потому что, если я выберу 800 образцов, я получаю 20 Гц, для 1600 образцов я получаю 40 Гц, что всегда составляет 1/40 * частоты дискретизации.
Что, черт возьми, я пропустил или сделал не так? Результаты странные.
Обратите внимание, что если я сделаю обратный ДПФ с комплексными значениями, я смогу снова восстановить звуковой сигнал!