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
これは完全な出力ではなく、やや似ています。
周波数を抽出おかげ
'} catch(Exception e){}'←**決して**空のキャッチブロックを書く。 try/catchを完全に削除する必要があります。何かがうまくいかなければ、あなたはそれを知る方法がありません。 – VGR
これは意図的なものでした。 – viv