質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

989閲覧

Android StudioでのFFT解析について

Keifjub

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/07/31 13:08

編集2022/01/12 10:55

前提・実現したいこと

研究で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は動作しました。
ファイルの読み込み部分がおかしいのかと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Androidのイベントメソッドは迅速に抜けなければなりません。時間のかかる処理を記述すると、アプリ無応答として強制終了されます。それが発生している可能性があります。

ファイルを読み込んでから変換するまでの処理を

Java

1 new Thread(new Runnable() { 2 @Override 3 public void run() { 4 // この部分に処理を記述 5 } 6 }).start();

のようにしてみてはどうでしょうか。

投稿2018/07/31 14:08

keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Keifjub

2018/07/31 14:44

ありがとうございます。ただ、これを行うとpcm2がCannot resolve symbolと出てしまいます。 恐らく、thread間のデータの引き渡し?などが必要なのかなと思って調べてみたのですが分からず…申し訳ないですが対処法を教えていただけますでしょうか?
keicha_hrs

2018/07/31 15:18

ご提示いただいたコードではpcm2という変数はごく狭い範囲でしか使われていないようなので、宣言・代入と参照がrun()の中に含まれているならば、名前未解決になる要素はなさそうに思えますが・・・。ご提示いただいていない部分でもこの変数を用いているのでしょうか?
Keifjub

2018/07/31 16:34

いえ、この部分しかプログラムがない非常に短いものなので他の部分では全く使っていません。
keicha_hrs

2018/08/02 05:13

修正後のコードを見てみないと何とも言えないですね。別の質問を拝見する限り、Threadを用いることに関してはクリアされているように思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問