Я пишу небольшую программу для удаления атмосферного шума в реальном времени с помощью 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
показалась ей полезной для вычисления количества отсчетов, если бы я мог найти, сколько образцов было в кадре, но я не мог справиться с этим.
Опять же, как я могу определить, сколько образцов находится в буфере? Как отказ от ответственности, я новичок в аудиопрограмме. Я, вероятно, смешиваю некоторые термины или понятия, заставляя более опытных поцарапать свои головы. (Приношу свои извинения!)
Один «кадр» - это один образец, IIRC – Dmitri
То есть, кадр представляет собой один образец для каждого канала; например. для стерео, один образец для левого канала и один для правильного канала. – Dmitri
@Dmitri Не совсем. Кадр представляет собой набор выборок, а не один образец для каждого канала. – dmitri