2017-12-21 2 views
1

wavファイルから頻度を抽出しようとしていますが、何かがうまくいかないようです。wavファイルから頻度を抽出する

まず最初に、ファイルからバイトを抽出してからFFTを適用し、最後にマグニチュードを見つけます。

出力が実際の値に近くないので、私は何か間違っているようです。 以下はそのコードです。

try{ 

     File log = new File("files/log.txt"); 
     if(!log.exists()) log.createNewFile(); 
     PrintStream ps = new PrintStream(log); 

     File f = new File("files/5000.wav");      
     FileInputStream fis = new FileInputStream(f); 
     int length = (int)f.length(); 
     length = (int)nearestPow2(length); 
     double[] ibr = new double[length]; //== real 
     double[] ibi = new double[length]; //== imaginary 
     int i = 0; 
     int l=0; 
     //fis.skip(44); 
     byte[] b = new byte[1024]; 
     while((l=fis.read(b))!=-1){ 
      try{ 

       for(int j=0; j<1024; j++){ 
        ibr[i] = b[j]; 
        ibi[i] = 0; 
        i++; 
       } 
      }catch(Exception e){} 
     } 

     double[] ftb = FFTBase.fft(ibr, ibi, true); 
     double[] mag = new double[ftb.length/2]; 
     double mxMag = 0; 
     long avgMg = 0; 
     int reqIndex = 512; //== no need to go till end 
     for(i=1;i<ibi.length; i++){ 
      ibr[i] = ftb[i*2]; 
      ibi[i] = ftb[i*2+1]; 
      mag[i] = Math.sqrt(ibr[i]*ibr[i]+ibi[i]*ibi[i]); 
      avgMg += mag[i]; 
      if(mag[i]>mxMag) mxMag = mag[i]; 
      ps.println(mag[i]); 
     } 
     avgMg = avgMg/ibi.length; 
     ps.println("MAx===="+mxMag); 
     ps.println("Average===="+avgMg); 

    }catch(Exception e){e.printStackTrace();} 

このコードを5KHZファイルに実行すると、これらの値が表示されます。 https://pastebin.com/R3V0QU4G

これは完全な出力ではなく、やや似ています。

周波数を抽出おかげ

+1

'} catch(Exception e){}'←**決して**空のキャッチブロックを書く。 try/catchを完全に削除する必要があります。何かがうまくいかなければ、あなたはそれを知る方法がありません。 – VGR

+0

これは意図的なものでした。 – viv

答えて

1

、または「ピッチ」だけFFTを行うと、「最大音量」周波数またはそのような何かを検索することで、残念ながらほとんど不可能です。少なくとも、音楽信号からそれを抽出しようとしている場合。

また、さまざまな種類のトーンがあります。楽器の大部分(すなわち、ギターまたは私たちの声)は、あるパターンに従ういくつかの周波数からなる高調波を生成する。

しかし、一つだけピーク/周波数を有するトーンもある(すなわちwhistleing)

さらにあなたは通常、すべての調性ではない信号のノイズに対処する必要があります。これはバックグラウンドノイズである可能性がありますが、これは機器自体によって生成される可能性があります。たとえば、ギターは非常に大きなノイズ部分を持っていますが、アタックフェイズです。

さまざまな手法を使用できます。つまり、信号のピッチをその種類に応じて見つけることができます。私たちは、周波数ドメイン(FFT)と私たちは例の高調波を見つけ、知覚される周波数がfundamental frequencyを、推測する統計的パターンマッチングを使用していますtwo way mismatch algorithmのためにそこにある高調波の音を分析したいと仮定して滞在する場合

私たちの耳の音として。

例の実装はここにあります:https://github.com/ausmauricio/audio_dspこのレポはcourseraでのオーディオ信号処理に関する完全なコースの一部ですが、これは参考になるかもしれません。

+0

こんにちは、あなたが言ったことはまったく正しいですが、私がテストしているオーディオファイルはフラットなスペクトルを持っているので、そこにピークがあることは疑いの余地があります。 しかし、コードでは、私は定数ではない値を取得しています。 – viv

+0

ああ、申し訳ありません...正直言って、私はあなたが "大小を見つける"という意味を理解していません。 1つのマグニチュード値を探しているような感じです。私の理解では、「マグニチュード」はfftからのスペクトル上のy軸であるため、スペクトル内の各ビンの大きさがあります。 – treeno

+0

はい、スペクトルがフラットラインの場合は、すべてのポイントで同じですか?少なくとも十分に近いはずですか? – viv

関連する問題