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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

1回答

1748閲覧

Android Audiorecordの動作

HiroakiTsugawa

総合スコア13

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/06/23 06:58

編集2016/06/23 06:59

現在AudioRecord(audioRec1)を使用してFFTのプログラムを作成しています。
以下のコードをTimerTaskを使用して定期的に実行しているのですが、1回目の出力では正しくFFTが行われていない状態になります。2回目以降は恐らくバッファに溜まっているので正しくFFTが行われていると思います。
本来は1回目から正しい値を取得したいと考えています。
似たような経験をされた方はいますでしょうか?
解決方法も分かればご教授お願いします。

public

1 short buf[] = new short[bufSize1]; 2 audioRec1.startRecording(); 3 audioRec1.read(buf, 0, buf.length); 4 DoubleFFT_1D fft = new DoubleFFT_1D(FFT_SIZE1) ; 5 double[] FFTdata = new double[FFT_SIZE1]; 6 for(int i=0;i<FFT_SIZE1;i++){ 7 FFTdata[i] = (double) buf[i]; 8 } 9 fft.realForward(FFTdata); 10 double[] dbfs = new double[FFT_SIZE1/2]; 11 double max_db = 0; 12 int max_i = 0; 13 for(int i=418;i<FFT_SIZE1;i+=2){ //i=0;i<FFT_SIZE;i+=2 14 dbfs[i/2]=(int) 15 ( Math.sqrt(Math.pow(FFTdata[i], 2) 16 +Math.pow(FFTdata[i+1], 2))); 17 if(max_db<dbfs[i/2]){ 18 max_db = dbfs[i/2]; 19 max_i = i/2; 20 } 21 } 22 Date now = new Date(System.currentTimeMillis()); 23 String nowText = formatter.format(now); 24 Log.d("Time",""+nowText); 25 Log.d("db", "Hz" + (SAMPLING_RATE/ (double) FFT_SIZE1)*max_i + "maxdb" + max_db); 26コード

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

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

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

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

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

guest

回答1

0

startRecording()してすぐにread(buf, 0, buf.length)しているからでは無いでしょうか?
レコーディングを開始して一定時間(もしくは一定回数)読みだした後にFFTを掛ければ1回めからOKになると思います。

投稿2016/06/23 08:07

PineMatsu

総合スコア3579

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

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

HiroakiTsugawa

2016/06/23 08:17

回答ありがとうございます。 アプリ起動時にstartRecording()を行い、ボタンを押された時にこのTimerTaskを使用する方法に変えたのですが、なぜか一回目は、正しくFFTが行えていないのが現状です。
PineMatsu

2016/06/23 08:32

アプリ起動時にstartRecording()しているのなら、タイマータスクの先頭でまたstartRecording()すると最初からレコーディングをしてしまわないですか?(AudioRecは使ったことがないのでよくわかりませんが、普通に考えるとstartRecording()というのはレコード開始だと思うのですが)
HiroakiTsugawa

2016/06/27 14:45

最初からレコーディングする形で構わない状態です。定期的にFFTを行い最新のバッファが得られれば十分なので。AudioRecordはバッファが一杯になり次第、バッファの先頭から上書きしていきます。遅くなりましたが、その後も色々やってみたのですが、うまく行かずやはりある程度、startRecording()の後に時間を置いて、read(buf, 0, buf.length)する必要があるみたいです。
PineMatsu

2016/06/28 08:09

startRecording()て、バッファをクリアしてしまうんじゃないでしょうか? read()する前にレコード済みのデータ長が判れば、条件分岐できると思うんのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問