2013-04-17 7 views
1

Я пытаюсь написать небольшое дискретное преобразование Фурье в 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 * частоты дискретизации.

Что, черт возьми, я пропустил или сделал не так? Результаты странные.

Обратите внимание, что если я сделаю обратный ДПФ с комплексными значениями, я смогу снова восстановить звуковой сигнал!

ответ

0

Ответ на этот вопрос состоит в том, что если вы вычисляете преобразования Фурье, спектр амплитуды и т. Д., То индексы показывают относительные частоты, которые необходимо вычислить до их правильного значения.