2015-07-20 5 views
0

Я пишу небольшую программу для удаления атмосферного шума в реальном времени с помощью PortAudio. Чтобы выполнить некоторые необходимые вычисления (например, преобразования Фурье), мне нужно предоставить образцы данных, но мне также нужно точно знать, сколько образцов я работаю в данный момент времени.Определить количество выборок в звуковом буфере

Как определить количество звуковых образцов в буфере?

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

int ambienceCallback(const void * inputBuffer, 
      void * outputBuffer, 
      unsigned long framesPerBuffer, 
      const PaStreamCallbackTimeInfo * timeInfo, 
      PaStreamCallbackFlags statusFlags, 
      void * userData) 
{ 
    const SAMPLE * in = (const SAMPLE *) inputBuffer; 
    PaStreamParameters * inputParameters = (PaStreamParameters *) userData; 
    PaTime time = timeInfo->inputBufferAdcTime; 
    int sampleCount = (time - callbackTime) * Pa_GetDeviceInfo(inputParameters->device)->defaultSampleRate; 
    callbackTime = time; 
    // extraneous ... 
} 

, где callbackTime переменная объявлена ​​в заголовочном файле, и инициализируется при запуске входного потока аудио.

// extraneous ... 
error = Pa_StartStream(stream); 
callbackTime = Pa_GetStreamTime(stream); 
// extraneous ... 

Однако расчетное время всегда будет равным нулю. В результате я не мог придумать, чтобы просто умножить частоту дискретизации на истекшее время работы. Другая переменная, framesPerBuffer показалась ей полезной для вычисления количества отсчетов, если бы я мог найти, сколько образцов было в кадре, но я не мог справиться с этим.

Опять же, как я могу определить, сколько образцов находится в буфере? Как отказ от ответственности, я новичок в аудиопрограмме. Я, вероятно, смешиваю некоторые термины или понятия, заставляя более опытных поцарапать свои головы. (Приношу свои извинения!)

+0

Один «кадр» - это один образец, IIRC – Dmitri

+0

То есть, кадр представляет собой один образец для каждого канала; например. для стерео, один образец для левого канала и один для правильного канала. – Dmitri

+0

@Dmitri Не совсем. Кадр представляет собой набор выборок, а не один образец для каждого канала. – dmitri

ответ

1

Получите количество образцов из параметров обратного вызова! :)

framesPerBuffer дает вам количество кадров. Кадр представляет собой набор образцов, которые происходят одновременно. Для стереопотока кадр представляет собой два образца.

Временные метки не полезны для вашей цели, например. Pa_GetStreamTime() возвращает текущее время потока в секундах. Это разрешение не позволит вам рассчитать количество выборок.