Вопрос по android, audio – Android AudioRecord фильтр диапазона частот

1

Я использую платформу Android, из следующего справочного вопроса я узнаю, что с помощью класса AudioRecord, который возвращает необработанные данные, я могу фильтровать диапазон звуковой частоты, зависит от моих потребностей, но для этого мне понадобится алгоритм, может кто-нибудь помочь мне найти алгоритм фильтрации диапазона ч / б 14 400 б / ч и 16 200 б / ч.

Я пробовал "JTransform", но я не знаю, могу ли я достичь этого с помощью JTransform или нет? В настоящее время я использую «jfftpack» для отображения визуальных эффектов, который работает очень хорошо, но я не могу добиться аудио-фильтра, используя это.

Ссылка здесь

пасибо @help Спасибо заранее. Ниже приведен мой код, как я упоминал выше, я использую библиотеку "jfftpack", чтобы вы могли найти эту ссылку на библиотеку в коде, пожалуйста, не путайте с этим

private class RecordAudio extends AsyncTask<Void, double[], Void> {
        @Override
        protected Void doInBackground(Void... params) {
try {
    final AudioRecord audioRecord = findAudioRecord();
                    if(audioRecord == null){
                        return null;
                    }

                    final short[] buffer = new short[blockSize];
                    final double[] toTransform = new double[blockSize];

                    audioRecord.startRecording();


    while (started) {
                        final int bufferReadResult = audioRecord.read(buffer, 0, blockSize);

                        for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                            toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit
                        }

                        transformer.ft(toTransform);
                        publishProgress(toTransform);

                    }
audioRecord.stop();
                audioRecord.release();
} catch (Throwable t) {
                Log.e("AudioRecord", "Recording Failed");
            }
            return null;

/**
         * @param toTransform
         */
        protected void onProgressUpdate(double[]... toTransform) {
            canvas.drawColor(Color.BLACK);
            for (int i = 0; i < toTransform[0].length; i++) {
                int x = i;
                int downy = (int) (100 - (toTransform[0][i] * 10));
                int upy = 100;
                canvas.drawLine(x, downy, x, upy, paint);
            }
            imageView.invalidate();
        }
Это может помочь тебе: / Stackoverflow.com вопросы / 7504409 / ... Kazekage Gaara

Ваш Ответ

1   ответ
2

которые могут вас повесить. Этот код не проверен, и я не делаю аудио-фильтрацию очень часто, поэтому вы должны быть Чрезвычайно подозрительно здесь. Это основной процесс фильтрации аудио:

Получить аудио буфер Возможно преобразование аудио буфера (байт в число с плавающей точкой) (необязательно) Применить функцию управления окнами, т. е. Ханнинг Возьми БПФ Частоты фильтра Возьми обратное БПФ

Я предполагаю, что у вас есть базовые знания об Android и записи аудио, поэтому мы рассмотрим шаги 4-6 здесь.

//it is assumed that a float array audioBuffer exists with even length = to 
//the capture size of your audio buffer

//The size of the FFT will be the size of your audioBuffer / 2
int FFT_SIZE = bufferSize / 2;
FloatFFT_1D mFFT = new FloatFFT_1D(FFT_SIZE); //this is a jTransforms type

//Take the FFT
mFFT.realForward(audioBuffer);

//The first 1/2 of audioBuffer now contains bins that represent the frequency
//of your wave, in a way.  To get the actual frequency from the bin:
//frequency_of_bin = bin_index * sample_rate / FFT_SIZE

//assuming the length of audioBuffer is even, the real and imaginary parts will be
//stored as follows
//audioBuffer[2*k] = Re[k], 0<=k<n/2
//audioBuffer[2*k+1] = Im[k], 0<k<n/2

//Define the frequencies of interest
float freqMin = 14400;
float freqMax = 16200;

//Loop through the fft bins and filter frequencies
for(int fftBin = 0; fftBin < FFT_SIZE; fftBin++){        
    //Calculate the frequency of this bin assuming a sampling rate of 44,100 Hz
    float frequency = (float)fftBin * 44100F / (float)FFT_SIZE;

    //Now filter the audio, I'm assuming you wanted to keep the
    //frequencies of interest rather than discard them.
    if(frequency  < freqMin || frequency > freqMax){
        //Calculate the index where the real and imaginary parts are stored
        int real = 2 * fftBin;
        int imaginary = 2 * fftBin + 1;

        //zero out this frequency
        audioBuffer[real] = 0;
        audioBuffer[imaginary] = 0;
    }
}

//Take the inverse FFT to convert signal from frequency to time domain
mFFT.realInverse(audioBuffer, false);
Обратите внимание, что хотя вы можете выполнять фильтрацию между БПФ и его инверсией, более традиционно использовать что-то, например, реализацию БИХ-фильтра с дискретным временем или КИХ-фильтра на основе свертки. Chris Stratton
Для большинства программистов это ничего не значит, возможно, вы можете уточнить. Error 454
Любопытный найдет много информации в очевидных местах. Chris Stratton
Поскольку это очевидное место для поиска ответов, полезно знатьЗаче читатель будет заинтересован в поиске более традиционного подхода, нежели описанный выше. Error 454
ереполнение стека @ для ответов на вопросы. Этон основной источникИнформаци - задача SO не состоит в том, чтобы заново создавать все мировые справочные онлайн-материалы по одной странице в ответ на запросы. Chris Stratton

Похожие вопросы