Запись звука полосового фильтра с использованием Accelerate Framework (vDSP) и Novocaine

Я довольно новичок в обработке сигналов, поэтому, пожалуйста, потерпите меня. Я пытаюсь реализовать полосовой фильтр для применения к аудиозаписи, полученной с iPad. Запись была преобразована в указатель Float32 с использованием функций ExtFile и AudioBufferList. Частота дискретизации составляет 44100 Гц. Запись длится около 9 секунд (это около 396900 сэмплов) и содержит частоту 2-6 кГц и немного окружающего шума. Мне нужно полосовой фильтр записи в диапазоне частот 2-6 кГц, чтобы определить, в какой момент времени происходит ЧИП. Я сослался на следующие ресурсы для создания полосового фильтра:

https://github.com/bartolsthoorn/NVDSP/blob/master/NVDSP.mm

https://github.com/bartolsthoorn/NVDSP/blob/master/Filters/NVBandpassFilter.m

У меня вопрос, могу ли я просто передать массив значений с плавающей запятой для записи в полосовой фильтр выше? Я пробовал это, но я не уверен, работает ли он, так как он, кажется, просто уменьшает значение каждого отдельного значения в массиве. Что я должен увидеть после прохождения записи?

Тем не менее, я видел, как некоторые источники говорят, что сначала мне нужно преобразовать значения из временной области в частотную область, используя FFT. Я попробовал следующий код, чтобы сделать это с помощью некоторых функций vDSP:

- (Float32 *)calculateFFT
{
    // Acquired from http://batmobile.blogs.ilrt.org/fourier-transforms-on-an-iphone/

    int numSamples = _recordingLength; //~9 seconds * 44100Hz ~= 396900 samples

    // Setup the length
    vDSP_Length log2n = log2f(numSamples);

    // Calculate the weights array. This is a one-off operation.
    FFTSetup fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);

    // For an FFT, numSamples must be a power of 2, i.e. is always even
    int nOver2 = numSamples/2;

    // Populate *window with the values for a hamming window function
    float *window = (float *)malloc(sizeof(float) * numSamples);
    vDSP_hamm_window(window, numSamples, 0);
    // Window the samples
    vDSP_vmul(_recordingSamples, 1, window, 1, _recordingSamples, 1, numSamples);

    // Define complex buffer
    COMPLEX_SPLIT A;
    A.realp = (float *) malloc(nOver2*sizeof(float));
    A.imagp = (float *) malloc(nOver2*sizeof(float));

    // Pack samples:
    // C(re) -> A[n], C(im) -> A[n+1]
    vDSP_ctoz((COMPLEX*)_recordingSamples, 2, &A, 1, numSamples/2);

    //Perform a forward FFT using fftSetup and A
    //Results are returned in A
    vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD);

    //Convert COMPLEX_SPLIT A result to magnitudes
    Float32 *amp = new Float32[numSamples];
    amp[0] = A.realp[0]/(numSamples*2);
    for(int i=1; i<numSamples; i++) {
        amp[i]=A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i];
        //printf("%f ",amp[i]);
    }

    return amp;
}

Но я не понимаю, что возвращается из этой функции. Если мне нужно применить БПФ перед передачей записи в фильтр, что нужно вернуть из функции CalculateFFT и затем передать в фильтр?

Заранее спасибо.

0 ответов

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