1

私は現在、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]);
}
4

2 に答える 2

0

私がしていたことに問題が見つかりました。これは ac ポインターの問題でした。私はこれまで C で実際にプログラミングしたことがなかったので、もちろん間違っていました。

inBuffer->mAudioData を int 配列に直接キャストすることはできません。だから私が単純にしたことは次のことでした

SInt16 *buffer = malloc(sizeof(SInt16)*kBufferByteSize);
buffer = inBuffer->mAudioData;

これは問題なく機能し、データの長さが正しくなり、データが適切に表現されるようになりました。

于 2012-06-05T01:52:02.120 に答える
0

私はあなたの答えを見ました。スワップされているバイトのエンディアンの問題が原因で、間違ったサンプルデータバイトを与える根本的な問題もあります。

-(void)feedSamplesToEngine:(UInt32)audioDataBytesCapacity audioData:(void *)audioData { int sampleCount = audioDataBytesCapacity / sizeof(SAMPLE_TYPE);

SAMPLE_TYPE *samples = (SAMPLE_TYPE*)audioData;
//SAMPLE_TYPE *sample_le = (SAMPLE_TYPE *)malloc(sizeof(SAMPLE_TYPE)*sampleCount );//for swapping endians

std::string shorts;
double power = pow(2,10);
for(int i = 0; i < sampleCount; i++)
{
    SAMPLE_TYPE sample_le =  (0xff00 & (samples[i] << 8)) | (0x00ff & (samples[i] >> 8)) ; //Endianess issue
    char dataInterim[30];
    sprintf(dataInterim,"%f ", sample_le/power); // normalize it.
    shorts.append(dataInterim);
}
于 2017-06-22T13:54:53.713 に答える