Я новичок в Android и хочу написать приложение для измерения уровня звука в децибелах. Идея состоит в том, что когда звук достигает определенного уровня, пользователь получает предупреждение. Вот и все. Может ли кто-нибудь помочь мне с этим. Могу ли я сделать это с помощью HTML5/Javascript? любая помощь будет оценена.
Шумомер децибел для Android
Ответы (3)
Взято из Проигрыватель Android Media Player в децибелах
Для собственного расчета децибел на основе android/java для MediaRecorder:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
mRecorder.prepare();
mRecorder.start();
public double getAmplitude() {
if (mRecorder != null)
return (mRecorder.getMaxAmplitude());
else
return 0;
}
Чтобы рассчитать значение дБ:
powerDb = 20 * log10(getAmplitude() / referenceAmp);
Ссылка: http://en.wikipedia.org/wiki/Decibel#Field_quantities
Не уверен, что вы могли бы сделать это в HTML5 на Android
этот код работает для меня:
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;
public class Noise extends Activity {
TextView mStatusView;
MediaRecorder mRecorder;
Thread runner;
private static double mEMA = 0.0;
static final private double EMA_FILTER = 0.6;
final Runnable updater = new Runnable(){
public void run(){
updateTv();
};
};
final Handler mHandler = new Handler();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.noiselevel);
mStatusView = (TextView) findViewById(R.id.status);
if (runner == null)
{
runner = new Thread(){
public void run()
{
while (runner != null)
{
try
{
Thread.sleep(1000);
Log.i("Noise", "Tock");
} catch (InterruptedException e) { };
mHandler.post(updater);
}
}
};
runner.start();
Log.d("Noise", "start runner()");
}
}
public void onResume()
{
super.onResume();
startRecorder();
}
public void onPause()
{
super.onPause();
stopRecorder();
}
public void startRecorder(){
if (mRecorder == null)
{
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
try
{
mRecorder.prepare();
}catch (java.io.IOException ioe) {
android.util.Log.e("[Monkey]", "IOException: " + android.util.Log.getStackTraceString(ioe));
}catch (java.lang.SecurityException e) {
android.util.Log.e("[Monkey]", "SecurityException: " + android.util.Log.getStackTraceString(e));
}
try
{
mRecorder.start();
}catch (java.lang.SecurityException e) {
android.util.Log.e("[Monkey]", "SecurityException: " + android.util.Log.getStackTraceString(e));
}
//mEMA = 0.0;
}
}
public void stopRecorder() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public void updateTv(){
mStatusView.setText(Double.toString((getAmplitudeEMA())) + " dB");
}
public double soundDb(double ampl){
return 20 * Math.log10(getAmplitudeEMA() / ampl);
}
public double getAmplitude() {
if (mRecorder != null)
return (mRecorder.getMaxAmplitude());
else
return 0;
}
public double getAmplitudeEMA() {
double amp = getAmplitude();
mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
return mEMA;
}
}
Я думаю, вам нужно уточнить, что вы подразумеваете под «децибел». Есть несколько различных типов дБ, которые означают совершенно разные вещи. В примере, который дает вам Сохэм, вычисляется пиковое значение дБ относительно эталонной амплитуды, для которой в исходной статье предлагается использовать максимальное цифровое значение 1,0. Это означает, что значение, которое вы получите, будет находиться в диапазоне от -96 дБ до 0 дБ для захвата 16-битного звука.
Я подозреваю, однако, что вы хотите измерить уровень звукового давления (диапазон, в котором речь составляет около 50 дБ, реактивный над головой 120 дБ). На самом деле это называется 'db (SPL)'. Вы не сможете сделать это на своем устройстве, если у вас нет средств калибровки вашего устройства по определенным уровням мощности.
Есть дополнительные соображения, которые вам необходимо сделать. Во-первых, нужны ли вам пиковые или среднеквадратичные уровни мощности (пиковые для мгновенных событий, среднеквадратичные значения для непрерывного звука, такого как музыка). Также вам нужно знать, как отключить любую автоматическую регулировку усиления на устройстве, так как это сделает любые измерения бессмысленными.