将AudioQueueBufferref数据传递给FFT功能!
-
14-11-2019 - |
题
我正在尝试通过iPhone上的麦克风计算给定声道过程的频率。
我已经阅读了关于FFT的所有帖子(包括所有Apple代码示例e.g oUniotouch,讲话),但不是解决这个问题。
我正在使用quotqueue,但如何从quotequeue回调函数(myinputbufferhandler)中的原始数据“audioqueuebumumbumbuelf”中的ubuffer-> maudionata。到实际的FFT“DSPSPLITCOMPLECPLECPLECPLED”数据类型,因此我可以计算它。所有这些都使用加速框架。
// 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]);
}
}
.
fft函数。
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
后打印它......
不隶属于 StackOverflow