Как получить частоту от записи необработанного звука?

Я хочу получить частоту из моей аудиозаписи одновременно

вот мой код:

Мой SoundProcessing .java и Основной класс

public class SoundProcessing extends Activity {

private WaveformView mRealtimeWaveformView;
private RecordingThread mRecordingThread;
private PlaybackThread mPlaybackThread;
private static final int REQUEST_RECORD_AUDIO = 13;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tab_sound_processing);

    mRealtimeWaveformView = (WaveformView) findViewById(R.id.waveformView);
    mRecordingThread = new RecordingThread(new AudioDataReceivedListener() {
        @Override
        public void onAudioDataReceived(short[] data) {
            mRealtimeWaveformView.setSamples(data);
        }
    });
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (!mRecordingThread.recording()) {
                startAudioRecordingSafe();
            } else {
                mRecordingThread.stopRecording();
            }
        }
    });
}

и мой RecordingThread.java:

открытый класс RecordingThread {

private static final String LOG_TAG = RecordingThread.class.getSimpleName();
private static final int SAMPLE_RATE = 44100;

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() {
    Log.v(LOG_TAG, "Start");
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_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;
    }

    short[] audioBuffer = 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;

        // Notify waveform
        mListener.onAudioDataReceived(audioBuffer);
    }

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

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

и мой AudioDataReceivedListener.java

public interface AudioDataReceivedListener {

    void onAudioDataReceived(short[] data);
}

1 ответ

Чтобы получить частоту сигнала, необходимо проанализировать ее, например, с помощью преобразования Фурье. В технических приложениях вы используете быстрое / дискретное преобразование Фурье (БПФ). Необработанный звук - это сигнал, записанный во времени, БПФ позволяет вам увидеть, какие частоты включены в ваш сигнал.

В вашем случае означает, что вам нужно применить БПФ на audioBuffer, Есть классы Java, а также код C/C++ (с NDK). Для приложений реального времени C/C++ должен быть быстрее.

Другие вопросы по тегам