Как получить частоту от записи необработанного звука?
Я хочу получить частоту из моей аудиозаписи одновременно
вот мой код:
Мой 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++ должен быть быстрее.