1

私はiphoneのマイクを通して与えられたサウンドプロセスの周波数を計算しようとしています。

FFTに関するすべての投稿(aurioTouch、SpeakHereなどのすべてのアップルコード例を含む)を読みましたが、この問題の解決策ではありません。

私はAudioQueueを使用していますが、AudioQueueコールバック関数(MyInputBufferHandler)inBuffer->mAudioDataから生データ"AudioQueueBufferRef"を渡すにはどうすればよいですか。実際のFFT「DSPSplitComplex」データ型に変換するので、計算できます。これはすべて、Accelerateフレームワークを使用しています。

// 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);
}

これを行う方法についてはどこにも見つかりません。助けてください!

4

2 に答える 2

2

オーディオバッファ内のデータのCデータ型と、FFTがサポートするデータ型を知っている必要があります。それらが同じでない場合(通常、16ビットのsignedintとshortfloat)、PCMデータの配列を(forループで)解凍およびコピーするときに変換する必要があります。実際のデータが与えられると、FFTへの入力の虚数配列をゼロにすることができます。

また、オーディオキューバッファの長さはFFTの長さと同じではない可能性があるため、オーディオキューコールバックからアプリ内部の別のキューにデータを保存し、別のワーカースレッドにそのデータを渡す必要がある場合があります。キューがいっぱいになると、分析/FFTルーチンが実行されます。

于 2011-05-16T19:07:43.313 に答える
0

振幅値は次のとおりです。

for(i=0;i<nover2;i++) {
    print log10(A.realp[i])
}

使用後に印刷するvdsp_fft_zrip.....。

于 2011-09-10T15:00:20.777 に答える