Как реализовать фильтр верхних частот для аудиосигнала?

Я пытаюсь сделать приложение для идентификации музыки, например shazam. Это приложение для Android. Сначала я взял аудиосигнал через MIC. Затем я применил функцию окна hanning и FFT к звуковому сигналу, как показано в следующем коде:

private class RecordAudio extends AsyncTask<void, ******[],="" void=""> {
 @Override
 protected Void doInBackground(Void... params) {
 started = true;
 try {
 DataOutputStream dos = new DataOutputStream(
 new BufferedOutputStream(new FileOutputStream(
 recordingFile)));
 int bufferSize = AudioRecord.getMinBufferSize(frequency,
 channelConfiguration, *************);
 audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
 frequency, channelConfiguration, *************,
 bufferSize);

 short[] buffer = new short[blockSize];
 ******[] toTransform = new ******[blockSize];
 long t = System.currentTimeMillis();
 long end = t + 15000;
 audioRecord.startRecording();

 while (started) {
 //System.currentTimeMillis() < end
 int bufferReadResult = audioRecord.read(buffer, 0,
 blockSize);
 for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
 toTransform[i] = (******) buffer[i] / 32768.0;
 dos.writeShort(buffer[i]);
 }
 toTransform = hann(toTransform);
 transformer.ft(toTransform);
 publishProgress(toTransform);
 } 
 audioRecord.stop();
 dos.close();
 } catch (Throwable t) {
 Log.e("AudioRecord", "Recording Failed");
 }
 return null;
 }
</void,>

Теперь мой вопрос: как мне применить фильтр высоких частот к моему звуковому сигналу. Есть ли API для этого? Пожалуйста, помогите мне сделать эту функцию.

Часть изменения кода

private class RecordAudio extends AsyncTask<void, ******[],="" void=""> {
 @Override
 protected Void doInBackground(Void... params) {
 started = true;
 try {
 DataOutputStream dos = new DataOutputStream(
 new BufferedOutputStream(new FileOutputStream(
 recordingFile)));
 int bufferSize = AudioRecord.getMinBufferSize(sampleRate,
 channelConfiguration, *************);
 audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
 sampleRate, channelConfiguration, *************,
 bufferSize);

 short[] buffer = new short[blockSize];
 ******[] toTransform = new ******[blockSize];
 long t = System.currentTimeMillis();
 long end = t + 15000;
 audioRecord.startRecording();

 while (started) {
 //System.currentTimeMillis() < end
 int bufferReadResult = audioRecord.read(buffer, 0,
 blockSize);
 for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
 toTransform[i] = (******) buffer[i] / 32768.0;
 dos.writeShort(buffer[i]);
 }
 toTransform = hann(toTransform);
 transformer.ft(toTransform);
 publishProgress(toTransform);
 //new part
 //sample rate = 8000
 highPassFilter(toTransform, sampleRate);
 } 
 audioRecord.stop();
 dos.close();
 } catch (Throwable t) {
 Log.e("AudioRecord", "Recording Failed");
 }
 return null;
 }
</void,>

Вот мой метод фильтра высоких частот:

public void highPassFilter(****** []frequency, int samplerate){
 ****** [] f = new ******[frequency.length];
 for (int n=1; n
<p> Благодаря !!</p>
1 ответ

Я думаю, что обработка сигнала может быть выполнена только на родном уровне (C, C++). Вы можете попробовать

это (TarsosDSP)

Если вышеприведенное не поможет, попробуйте этот SO-ответ.

licensed under cc by-sa 3.0 with attribution.