マイク データで FFT を実行するアプリケーションを作成しようとしています。たとえば、入力で最も大きな周波数を調べることができます。
オーディオ入力を取得する方法はたくさんあります (RemoteIO AudioUnit、AudioQueue サービス、および AVFoundation) が、AVFoundation が最も単純なようです。私はこのセットアップを持っています:
// Configure the audio session
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:NULL];
[session setMode:AVAudioSessionModeMeasurement error:NULL];
[session setActive:YES error:NULL];
// Optional - default gives 1024 samples at 44.1kHz
//[session setPreferredIOBufferDuration:samplesPerSlice/session.sampleRate error:NULL];
// Configure the capture session (strongly-referenced instance variable, otherwise the capture stops after one slice)
_captureSession = [[AVCaptureSession alloc] init];
// Configure audio device input
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
[_captureSession addInput:input];
// Configure audio data output
AVCaptureAudioDataOutput *output = [[AVCaptureAudioDataOutput alloc] init];
dispatch_queue_t queue = dispatch_queue_create("My callback", DISPATCH_QUEUE_SERIAL);
[output setSampleBufferDelegate:self queue:queue];
[_captureSession addOutput:output];
// Start the capture session.
[_captureSession startRunning];
(さらにエラーチェック、読みやすくするためにここでは省略)。
次に、次のAVCaptureAudioDataOutputSampleBufferDelegateメソッドを実装します。
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSLog(@"Num samples: %ld", CMSampleBufferGetNumSamples(sampleBuffer));
// Usually gives 1024 (except the first slice)
}
次のステップがどうあるべきかわかりません。フォーマットは正確に何CMSampleBuffer
を記述していますか (また、もしあれば、それについてどのような仮定を立てることができますか)? vDSP_fft_zrip
追加の前処理を最小限に抑えて生のオーディオ データを取得するにはどうすればよいですか? (また、私が見た生データが正しいことを確認するために何をすることをお勧めしますか?)