Передача данных AudioQueueBufferREF в функцию FFT!
-
14-11-2019 - |
Вопрос
Я пытаюсь вычислить частоту данного звукового процесса через микрофон на iPhone.
Я прочитал весь пост о FFT (включая все примеры кода Apple E.g Auriotouch, Speathere), но не решение этой проблемы.
Я использую AudioQueue, но как мне передавать необработанные данные «audioqueuebufferref» из функции обратного вызова AudioQueue (MyinputbufferHandler) Inbuffer-> Maudiodata.К фактическому типу данных FFT «DSPSPLITComplex», чтобы я мог вычислить его.Все это использует ускоренные рамки.
// AudioQueue callback function, called when an input buffers has been filled.
void AQRecorder::MyInputBufferHandler( void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp * inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription* inPacketDesc)
{
for(int i=0; i<inNumPackets; i++) {
printf("%d ",((int*)inBuffer->mAudioData)[i]);
}
}
.
ФФТ ФФТ.
RealFFTUsageAndTiming(){
COMPLEX_SPLIT A; //DSPSplitComplex datatype
FFTSetup setupReal;
uint32_t log2n;
uint32_t n, nOver2;
int32_t stride;
uint32_t i;
float *originalReal, *obtainedReal;
float scale;
/* Set the size of FFT. */
log2n = N;
n = 1 << log2n;
stride = 1;
nOver2 = n / 2;
/* Allocate memory for the input operands and check its availability,
* use the vector version to get 16-byte alignment. */
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
originalReal = (float *) malloc(n * sizeof(float));
obtainedReal = (float *) malloc(n * sizeof(float));
//How do I pass the data from AudioQueue callback to function?
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_INVERSE);
}
.
Я не нашел нигде, как это сделать.Пожалуйста, помогите!
Решение
Вы должны знать тип данных C данных в аудио буфере и типов данных, которые поддерживает FFT.Если они не одинаковы (обычно 16-битные подписанные INT против короткого поплавка), то вам придется преобразовать при распаковке и копировании массивов данных PCM (в контуре для цикла).Учитывая реальные данные, вы можете отнулить воображаемую массив ввода в FFT.
Кроме того, длина буфера аудио очереди может быть не такой, как длина FFT, поэтому вам, возможно, придется сохранить данные от обратного вызова аудио очереди к другой очереди внутренней в вашем приложении, и передает другой рабочий потокданные для вашего анализа / FFT процедуры в качестве очереди заполняются.
Другие советы
Значения амплитуды:
for(i=0;i<nover2;i++) {
print log10(A.realp[i])
}
.
Распечатайте его после использования vdsp_fft_zrip
......