android - 无法修复错误的数据库均方根刻度

标签 android audio google-project-tango audiorecord

我和我的团队正在创建一个应用程序,其中包含一个显示rmsDb值的旁路音频源。我们希望得到的刻度范围从-155到0,但是我们得到的值的范围是-70到-19。我们不知道音阶出了什么问题,因为我们都是音频编程的新手。

编辑:这与Google Project Tango有关,因为我们使用的设备是Lenovo Phab2Pro,这是唯一一款商用的支持Tango的设备,我们专门购买该设备是为了使用Tango进行音频工作。因此,这影响了探戈技术的采用。

public class RecordingThread {
private static final String LOG_TAG = RecordingThread.class.getSimpleName();
private static final int SAMPLE_RATE = 22050;
public float centerFrequency = 1000;
private short[] audioBuffer;
private short[] audioBuffer2;
private double rms;
private double mGain;
private double rmsdB;

public RecordingThread(AudioDataReceivedListener listener) {
    mListener = listener;
}

private boolean mShouldContinue;
private AudioDataReceivedListener mListener;
private Thread mThread;

public boolean recording() {
    return mThread != null;
}

public void startRecording() {
    if (mThread != null)
        return;

    mShouldContinue = true;
    mThread = new Thread(new Runnable() {
        @Override
        public void run() {
            record();
        }
    });
    mThread.start();
}

public void stopRecording() {
    if (mThread == null)
        return;

    mShouldContinue = false;
    mThread = null;
}

private void record() {
    rms = 0;
    android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);

    // buffer size in bytes
    int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    if (bufferSize == AudioRecord.ERROR || bufferSize == AudioRecord.ERROR_BAD_VALUE) {
        bufferSize = SAMPLE_RATE * 2;
    }

    audioBuffer = new short[bufferSize / 2];
    audioBuffer2 = new short[bufferSize / 2];

    AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSize);

    if (record.getState() != AudioRecord.STATE_INITIALIZED) {
        Log.e(LOG_TAG, "Audio Record can't initialize!");
        return;
    }
    record.startRecording();

    Log.v(LOG_TAG, "Start recording");

    long shortsRead = 0;
    while (mShouldContinue) {
        int numberOfShort = record.read(audioBuffer, 0, audioBuffer.length);
        shortsRead += numberOfShort;

        /*
         * Noise level meter begins here
         */
        // Compute the RMS value. (Note that this does not remove DC).
        for (int i = 2; i < audioBuffer.length; i++) {
            if(i % 3 == 0) {
                audioBuffer2[i] = BiQuad.bqfilter(audioBuffer[i], audioBuffer[i - 1], audioBuffer[i - 2], audioBuffer2[i], audioBuffer2[i - 1], audioBuffer2[i - 2], SAMPLE_RATE, centerFrequency, 5);
                rms += audioBuffer2[i] * audioBuffer2[i];
            }
        }
        rms = Math.sqrt(rms / audioBuffer2.length);
        mGain = 1.0/32767; //0.0044;
        rmsdB = 20.0 * Math.log10(mGain * rms);
    }

    record.stop();
    record.release();

    Log.v(LOG_TAG, String.format("Recording stopped. Samples read: %d", shortsRead));
    }
}

任何帮助将不胜感激。

最佳答案

可能需要进行一些校准,即在rmsdB值上添加一个常数。

进行几次测量,然后与标准声强计进行比较。

通过绘制声强(y轴上以dB为单位)与rmsdB值(x轴上)的关系图,您可以将一条线拟合到这些数据,然后该图的y截距将告诉您您要添加的常量,例如

rmsdB = calibrationCostant + 20.0 * Math.log10(mGain * rms);

关于android - 无法修复错误的数据库均方根刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44660316/

相关文章:

android - 在 Android 中设置来电时的自定义振动

android - 在某些情况下,Android 中 GCM ID 不可用的原因是什么

javascript - 如何在 PhantomJS 中使用 JavaScript 检测网页上的声音?

audio - 产生诺基亚短信声音的技术参数是什么?

android - 从四元数旋转到角度 (0 - 360°)

c - Project Tango - 服务坐标系开始,C API

android - 无法停止媒体播放器?

android - 如何清除 ListView 回收站中的 View ?

javascript - 如何用JavaScript制作狗吠

java - 找不到处理 Intent android.intent.action.REQUEST_TANGO_PERMISSION 的 Activity (有额外功能)