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

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

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

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

Android

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

1回答

2263閲覧

Androidアプリ開発~周波数解析~要約

YuujiUnno

総合スコア22

Java

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

Android

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

3クリップ

投稿2014/11/17 06:26

前回の投稿ではわかりにくかったかもしれませんので、改めて現在解決したい問題点を簡潔に説明します。

マイクから入力された外部音の周波数解析をしたいのですが、下のソースコードで動かすとpower配列の中で最も大きい値を示すのが常に6000~12000Hz程になってしまいます。
なぜ、低い周波数の音源を与えてもこの結果となってしまうのでしょうか?
確認方法、原因と思われるものなどありましたら教えてください。

lang

1/** 2 * 3 */ 4package isa.android; 5 6/** 7 * @author Unno 8 * 9 */ 10 11import android.media.AudioFormat; 12import android.media.AudioRecord; 13import android.media.MediaRecorder; 14import android.util.Log; 15 16import java.lang.Math; 17 18public class SoundRecord implements Runnable { 19 // ボリューム感知リスナー 20 21 /* (非 Javadoc) 22 * @see java.lang.Runnable#run() 23 */ 24 int pmax=0; 25 public static double heltz; 26 27 private OnReachedVolumeListener mListener; 28 // 録音中フラグ 29 private boolean isRecoding = true; 30 // サンプリングレート 31 private static final int SAMPLE_RATE = 44100; 32 // FFTする要素数 33 private final static int FFT_SIZE = 2048; 34 // ボーダー音量 35 private short mBorderVolume = 3000; 36 // ボーダー音量をセット 37 public void setBorderVolume(short volume) { 38 mBorderVolume = volume; 39 } 40 // ボーダー音量を取得 41 public short getBorderVolume() { 42 return mBorderVolume; 43 } 44 // 録音を停止 45 public void stop() { 46 isRecoding = false; 47 } 48 // OnReachedVolumeListenerをセット 49 public void setOnVolumeReachedListener( 50 OnReachedVolumeListener listener) { 51 mListener = listener; 52 } 53 // ボーダー音量を検知した時のためのリスナー 54 public interface OnReachedVolumeListener { 55 // ボーダー音量を超える音量を検知した時に 56 // 呼び出されるメソッドです。 57 void onReachedVolume(short volume); 58 } 59 60 public static int bufferSize = AudioRecord.getMinBufferSize( 61 SAMPLE_RATE, 62 AudioFormat.CHANNEL_CONFIGURATION_MONO, 63 AudioFormat.ENCODING_PCM_16BIT); 64 AudioRecord audioRecord = new AudioRecord( 65 MediaRecorder.AudioSource.MIC, 66 SAMPLE_RATE, 67 AudioFormat.CHANNEL_CONFIGURATION_MONO, 68 AudioFormat.ENCODING_PCM_16BIT, 69 bufferSize); 70 public static double[] fbuffer = new double[FFT_SIZE]; 71 public static double[] power = new double[FFT_SIZE/2]; 72 73 public void hamming(double[] x) /*ハミング窓*/ 74 { 75 int i; 76 77 for(i=0;i<FFT_SIZE;i++){ 78 x[i] = 0.54 - 0.46*Math.cos((2 * Math.PI * i)/(FFT_SIZE - 1)); 79 } 80 } 81 82 @Override 83 // スレッド開始(録音を開始) 84 public void run() { 85 android.os.Process.setThreadPriority( 86 android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 87 88 short[] buffer = new short[FFT_SIZE]; 89 audioRecord.startRecording(); 90 while(isRecoding) { 91 audioRecord.read(buffer, 0, FFT_SIZE); 92 short max = 0; 93 for (int i=0; i<FFT_SIZE; i++) { 94 // 最大音量を計算 95 max = (short)Math.max(max, buffer[i]); 96 // 最大音量がボーダーを超えていたら 97 if (max > mBorderVolume) { 98 if (mListener != null) { 99 // リスナーを実行 100 mListener.onReachedVolume(max); 101 FastFourieTransform fft = new FastFourieTransform(); 102 103 double[] x = new double[FFT_SIZE]; 104 hamming(x); 105 for(int j=0; j < buffer.length; j++){ 106 fbuffer[j] = buffer[j]*x[j]; 107 } 108 fft.fft(fbuffer , FFT_SIZE); 109 110 //スペクトルを求める 111 for(int k=0; k < power.length; k++){ 112 power[k] = Math.sqrt(Math.pow(fbuffer[2*k], 2) + Math.pow(fbuffer[2*k + 1],2)); 113 } 114 //求めたスペクトルの最も大きな値を持つ添え字を求める 115 for(int k=0; k < power.length; k++){ 116 if(power[k] > power[pmax]) 117 pmax = k; 118 Log.d("SoundRecord", "power[" + k + "] =" + power[k]); 119 } 120 121 //周波数を求める 122 heltz = pmax * (SAMPLE_RATE/2) / (FFT_SIZE/2); 123 //Log.d("SoundRecord", "heltz=" + heltz); 124 Log.d("SoundRecord", "pmax=" + pmax); 125 126 break; 127 } 128 } 129 } 130 } 131 audioRecord.stop(); 132 audioRecord.release(); 133 } 134 135} 136

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

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

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

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

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

guest

回答1

0

まずは最大音量のチェックやスペクトルの最大値を気にせずスペクトログラムが正しく求められているかを確認する等、一つ一つの処理を細かく確認したほうが原因がわかると思います。

投稿2014/11/17 13:49

sho_cs

総合スコア3541

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問