前提・実現したいこと
研究でAndroid開発をしているのですが、何分プログラム初心者で困っています。
アンドロイドで録音をして保存をする。そのファイルをFFTし、特定の周波数にフィルタリングした後、逆FFTをしてその波形を見たいと考えています。
録音して保存するところまではできたのですが、JTransformsを用いたFFT(内部のWAVを読み込んで)がうまくいきません。
どこを直せばいいのか教えていただけると幸いです。
該当のソースコード
Java
1public class MainActivity extends AppCompatActivity { 2 3 4 @Override 5 public void onCreate(Bundle savedInstanceState) { 6 7 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 int FFT_SIZE = 8; 12 double[] data; 13 data = new double[FFT_SIZE]; 14 15 16 17 // オリジナルデータを出力 18 19 { 20 21 InputStream is = null; 22 BufferedReader br = null; 23 String pcm = ""; 24 try { 25 try { 26 is = this.getAssets().open("tsp18.pcm"); 27 br = new BufferedReader(new InputStreamReader(is)); 28 29 // 1行ずつ読み込み、改行を付加する 30 String str; 31 while ((str = br.readLine()) != null) { 32 pcm += str + "\n"; 33 } 34 35 } finally { 36 if (is != null) is.close(); 37 if (br != null) br.close(); 38 } 39 } catch (Exception e) { 40 // エラー発生時の処理 41 } 42 43 Double pcm2 = Double.parseDouble(pcm); 44 45 46 DoubleFFT_1D fft = new DoubleFFT_1D(FFT_SIZE); 47 double[] FFTdata = new double[FFT_SIZE]; 48 for (int i = 0; i < FFT_SIZE; i++) { 49 FFTdata[i] = (double) pcm2; 50 } 51 fft.realForward(FFTdata); 52 // data[0]は実数成分、data[1]は虚数成分~data[n]は実数成分、data[n+1}は虚数成分 53 for (int i = 0; i < FFT_SIZE; i++) { 54 // フーリエ変換後のデータを出力 55 Log.d("FFT", "i=" + i + " val=" + FFTdata[i]); 56 } 57 58 // 逆フーリエ変換 59 fft.realInverse(data, true); 60 for (int i = 0; i < FFT_SIZE; i++) { 61 // 逆フーリエ変換後のデータを出力 62 Log.d("IFFT", "i=" + i + " val=" + FFTdata[i]); 63 } 64 } 65 66 } 67
試したこと
データを直接書き込んでだとFFTは動作しました。
ファイルの読み込み部分がおかしいのかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/31 14:44
2018/07/31 15:18
2018/07/31 16:34
2018/08/02 05:13