AudioQueueBufferRefデータをFFT機能に渡す!
-
14-11-2019 - |
質問
私はiPhone上のマイクロフォンを通して特定のサウンドプロセスの頻度を計算しようとしています。
FFTについてのすべての投稿を読んでください(すべてのApple Code Examples E.g Auriotouch、Speakhereを含む)がこの問題に対する解決策を読みました。
AidioQueueを使用していますが、AudioQueueコールバック関数(MyInputBufferHandler)Inbuffer-> MaudioDataから生データ "AudioQueueBufferRef"を渡すにはどうすればよいですか。実際の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]);
}
}
.
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);
}
.
これを行う方法のどこにも見つけていません。助けてください!
解決
FFTがサポートするオーディオバッファ内のデータのCデータ型とデータ型を知っておく必要があります。同じでない場合(一般的に16ビット署名されたint vers hart float)、PCMデータの配列を解凍してコピーするときに変換する必要があります(FORループ内)。実際のデータを考えると、入力の虚数配列をFFTにゼロにゼロにすることができます。
また、オーディオキューバッファの長さはFFT長と同じではない可能性があるため、オーディオキューコールバックからアプリケーションの内部にある別のキューにデータを保存し、他のワーカースレッドがそれを渡してもよい。キューの塗りつぶしとしての分析/ FFTルーチンへのデータ。
他のヒント
振幅値は次のとおりです。
for(i=0;i<nover2;i++) {
print log10(A.realp[i])
}
.
vdsp_fft_zrip
を使用した後に印刷する......