私は現在、iPhone のマイクからオーディオを読み取り、いくつかの処理とビジュアルを行うアプリケーションを構築中です。もちろん、最初はオーディオから始めていますが、小さな問題が 1 つあります。
サンプリング レートを 44100 Hz に定義し、バッファを 4096 サンプルを保持するように定義しています。どちらがそうです。ただし、このデータを印刷して MATLAB にコピーし、精度を再確認します。使用する必要があるサンプル レートは、iPhone で定義したレートの半分、つまり 22050 Hz です。
次のコードと、パケットごとに 2 バイトを配置する方法と関係があると思います。バッファをループすると、バッファはパケット全体を吐き出します。これは私のコードでは単一の数値であると想定されています。そこで気になるのは、どうやってそれらのパケットを分割して個々の番号として読み取るかということです。
- (void)setupAudioFormat {
memset(&dataFormat, 0, sizeof(dataFormat));
dataFormat.mSampleRate = kSampleRate;
dataFormat.mFormatID = kAudioFormatLinearPCM;
dataFormat.mFramesPerPacket = 1;
dataFormat.mChannelsPerFrame = 1;
// dataFormat.mBytesPerFrame = 2;
// dataFormat.mBytesPerPacket = 2;
dataFormat.mBitsPerChannel = 16;
dataFormat.mReserved = 0;
dataFormat.mBytesPerPacket = dataFormat.mBytesPerFrame = (dataFormat.mBitsPerChannel / 8) * dataFormat.mChannelsPerFrame;
dataFormat.mFormatFlags =
kLinearPCMFormatFlagIsSignedInteger |
kLinearPCMFormatFlagIsPacked;
}
私が説明したことが不明な場合は、お知らせください。ありがとう!
編集
データの印刷に使用したコードを追加する
float *audioFloat = (float *)malloc(numBytes * sizeof(float));
int *temp = (int*)inBuffer->mAudioData;
int i;
float power = pow(2, 31);
for (i = 0;i<numBytes;i++) {
audioFloat[i] = temp[i]/power;
printf("%f ",audioFloat[i]);
}