に、私はマイクからの山車の流れをログに記録しています(沈黙する必要があります)iOSのAudioQueues:グリッチがオーディオフロートストリーム
私は典型的な256台の山車
のバッファサイズでセットアップオーディオ・キューを持っていますバッファは次のようになります。
PACKET 0.004791、 0.012512,0.008423,0.000122、-0.000519、-0.002991、-0.000031,0.001801、-0.000641、 0.001190、-0.003143、-0.001587,0.001587、-0.015503、 -0.019440、-0.015167、-0.017670、 -0.018158、-0.019928、-0.019409、-0.024017、-0.019684、-0.024719、-0.044128、-0.043579、 -0.043152、-0.046417、-0.045380、-0.050079、-0.050262、-0.049164、-0.040710、-0.036713、 -0.051056、-0.045868、-0.035034、-0.033722、-0.028534、-0.027161、-0.022186、-0.018036、 -0.012207,0.004303、-0.000824、-0.000610,0.014496,0.018005,0.019745,0.019226、 0.016144,0.013184、 0.009003,0.014557,0.003357、-0.011353、-0.007751、-0.007660、 -0.006409、-0.003357、-0.003510、-0.001038、-0.000092,0.007690,0.002655,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000, .000000,0.000000,0.000000.00.000000.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000.00.000000.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000 、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000、-0.006897、-0.000549,0.003174、 0.003540,0.003632、 0.004578,0.005280,0.001831,0.014771,0.014954,0.001801,0.009247,0.011139、 0.005249,0.008087,0.008636,0.007385,0.007263,0.016571,0.020264,0.010590、 0.014801,0.023132,0.027039,0.031128,0.031799,0.037109 、0.038757,0.049438, 0.057098,0.042786,0.045593,0.052032,0.0453 80,0.045227,0.045837,0.043793、 0.041931,0.043976,0.046570,0.030182,0.024475,0.029877,0.026184,0.026001、 0.026611,0.031921,0.035736,0.040710,0.053070,0.042572,0.039917,0.051636、 0.053009,0.053528,0.053009,0.054962 、0.055603,0.053833,0.060638,0.050171、 0.041779,0.049194,0.046356,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.041931、 0.038879,0.034515,0.031494 、0.026337,0.034576,0.028992,0.014038,0.018127, 0.017822,0.015137,0.015778,0.013519,0.015564,0.014832,0.023285,0.022034、 0.006317,0.010254,0.010742,0.004303,0.003784、-0.000153、-0.002502、〜
私がいるように見える理由を私は理解できません入力信号にゼロのランダムバンチがあります。不連続なものがあるようです。
私はまず左チャンネルと右チャンネルがあったと思いますが、右チャンネルは常にゼロを記録していました。しかし、私のコードを見て、私は明確に1つのチャンネルのためにそれを設定しました。
次に、私はこれらが信号に静寂の場所であると考えました。しかしそれは意味をなさない。もし私がちょうど十数0を持っていれば、確かに、0.000000のように.000007 .000014のような非常に小さい数字が続くと予想しますが、非ゼロの数字は0.01マークの周りにあるようです。
私は外付けのUSBマイクに私のオーディオ入力を切り替える試してみましたが、これは解像度を向上させます。非ゼロの数字は、今度は0.001マークの周りにあるようです。それでも顕著な不連続性がある...いくつかの計算は、このような場合には0に丸めチップ上で実行されている場合、私は疑問に思う
は、それを校正することができますか?何が起こっている?
私が気づいている2番目の本当に奇妙な問題は不正な値です。ここで
は、これらの値の一部が含まれているサンプルパケットである(USBマイクを使用して、この時、あなたは解像度が向上しているかを確認することができます):
〜PACKET -0.001343、 -0.001190、 - 0.001526、-0.001373、-0.000946、-0.001526、-0.001221、-0.001190、-0.001221、 -0.001190、-0.001373、-0.001190、-0.001312、-0.001312、-0.001434、-0.001282、-0.001312、 -0.001099、 - 0.001007、-0.001221、-0.001160、-0.001312、-0.001343、-0.001221、-0.001007、 -0.001068、-0.001404、-0.001068、-0.001038、-0.001404、-0.001038、-0.001190、-0.001404、 -0.001099、 - 0.001282、 - 0.001221、-0.001007、-0.001007、-0.001099、-0.001221、-0.001160、 -0.001038、-0.001038、-0.001007、-0.000946、-0.001129、-0.000916、-0.000946、-0.000946、 -0.000946、-0.000824、 - 0.000824、-0.001007、-0.000763、-0.001038、-0.000854、-0.000977、 -0.000916、-0.000641、-0.000977、-0.000916、-0.000946、-0.000732、-0.000824,0.000000、 0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000 、0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000 、0.000000,0.000000,0.000000, .000000,0.000000,0.000000.00.000000.000000.00.000000,0.000000,0.000000, .000000,0.000000,0.000000.00.000000.00.000000.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, -0.000000,2.000000、-2.000000 、0.000000、-0.000000,36893488147419103232.000000、-36893488147419103232.00 0000,0.000000、 -0.000000,8589934592.000000、-8589934592.000000,0.000000、-0.000000,158456325028528675187087900672.000000、-158456325028528675187087900672.000000,0.000000、 -0.000000,131072.000000、-131072.000000,0.000000、-0.000000,2417851639229258349412352.000000、-2417851639229258349412352.000000,0.000000、 -0.000000、 562949953421312.000000、-562949953421312.000000,0.000031、-0.000031,10384593717069655257060992658440192.000000、-10384593717069655257060992658440192.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000 、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0。000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000、
これは私を混乱さ。これらのグリッチの発生は少ない。 10フレーム中に1つ未満です。
これは私のオーディオストリームを前処理しなければならないということですか?
前回私がオーディオユニットを使用していたとき、私はそれをしたことはありません。私はちょうどオーディオをピッチ検出ルーチンに直接送り込んだ。それに問題はなかった。だから私はそこにもグリッチを得ていた場合、私は疑問に思う..
私はここで、両方の作り付けのMacBookのマイク付きグリッチや外付けUSBマイク
を取得することは、私のコードは次のとおりです。
//
// MicRecord.m
// PitchDetect
//
// Created by Pi on 05/01/2011.
//
#import "MicRecord.h"
void AudioInputCallback(
void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp * inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription * inPacketDescs) ;
@implementation MicRecord
@synthesize fftFrame;
/*
- (id) init
{
if (self = [super init])
{
[self setupWithSampleRate: 44100
buffers: 12
bufLen: 512 ];
}
return self;
}
*/
// - - - - - - - -
- (void) setupWithSampleRate: (int) in_sampRate
buffers: (int) in_nBuffers
step: (int) in_step
frameSize: (int) in_frameSize
target: (id) in_target
sel: (SEL) in_sel
{
sampRate = in_sampRate;
nBuffers = in_nBuffers;
bufLen = in_step;
frameSize = in_frameSize;
targ = in_target;
sel = in_sel;
audioBuffer = calloc(nBuffers, sizeof(AudioQueueBufferRef *));
[self setupAudioFormat];
[self setupAudioQueue];
fftFrame = calloc(frameSize, sizeof(float));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- (void) setupAudioFormat
{
// Set the format to 32 bit, single channel, floating point, linear PCM
const int four_bytes_per_float = 4;
const int eight_bits_per_byte = 8;
memset(& dataFormat,
(int) 0x00,
sizeof(dataFormat));
dataFormat.mSampleRate = sampRate;
dataFormat.mFormatID = kAudioFormatLinearPCM;
dataFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
dataFormat.mBytesPerPacket = four_bytes_per_float;
dataFormat.mFramesPerPacket = 1;
dataFormat.mBytesPerFrame = four_bytes_per_float;
dataFormat.mChannelsPerFrame = 1;
dataFormat.mBitsPerChannel = four_bytes_per_float * eight_bits_per_byte;
}
// - - - - - - - - - - - - - - - - -
- (void) setupAudioQueue
{
currentPacket = 0;
OSStatus status;
status = AudioQueueNewInput(& dataFormat,
AudioInputCallback,
self,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes,
0,
& queue);
for(int i = 0; i < nBuffers; i++)
{
status = AudioQueueAllocateBuffer(queue,
bufLen,
& audioBuffer[i]);
status = AudioQueueEnqueueBuffer(queue,
audioBuffer[i], 0, NULL);
}
status = AudioQueueFlush (queue);
printf("Status: %d", (int) status);
}
// - - - - - - - - - - - - - - - - -
- (void) start
{
OSStatus status = AudioQueueStart(queue, NULL);
printf("Status: %d", (int) status);
}
// - - - - - - - - - - - - - - -
- (void) stop
{
AudioQueueStop(queue, true);
for(int i = 0; i < nBuffers; i++)
AudioQueueFreeBuffer(queue, audioBuffer[i]);
AudioQueueDispose(queue, true);
}
// - - - - - - - - - -
- (void) dealloc
{
[self stop];
free (audioBuffer);
[super dealloc];
}
@end
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
void AudioInputCallback(
void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp * inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription * inPacketDescs
)
{
MicRecord * x = (MicRecord *) inUserData;
//if(inNumberPacketDescriptions == 0 && recordState->dataFormat.mBytesPerPacket != 0)
//{
// inNumberPacketDescriptions = inBuffer->mAudioDataByteSize/recordState->dataFormat.mBytesPerPacket;
//}
if (0)
printf("Handling buffer %d\n", (int) x->currentPacket);
int step = x->bufLen;
if (inBuffer->mAudioDataBytesCapacity != step)
{
printf("---");
}
static int k = -1;
k++;
static float lastVal = 0;
static int count = 0;
if (k < 32) {
if (k == 0)
printf("\nfloat buf[32*%d=%d] = {", step, 32*step);
float * in_buf = (float *) inBuffer->mAudioData;
printf("\n ~\nPACKET\n");
for (int i = 0; i < step; i++)
{
/*
if (fabs(in_buf[i]) < .0001 && fabs(lastVal) > .0001)
{
printf("%d Nonzeros\n",count);
count = 0;
}
if (fabs(in_buf[i]) > .0001 && fabs(lastVal) < .0001)
{
printf("%d Zeros\n",count);
count = 0;
}
count++;
lastVal = in_buf[i];*/
printf("%f,", in_buf[i]);
if (i % 8 == 0)
printf("\n");
//if (count % (8 * 64) == 0)
// printf("\n");
count++;
}
if (k == 31)
printf("}\n");
}
// shifty frame data down by 'step' elements
// to make room for new data
// imagine cutting out elts [0] thru [step-1] (ie 'step' of them)
// first new elt at pos [0] will be [step]
memmove(& x->fftFrame[0], // dest first
& x->fftFrame[step], // src
x->frameSize - step
);
memcpy(& x->fftFrame[x->frameSize - step],
inBuffer->mAudioData,
step * sizeof(float)
);
x->currentPacket += inNumberPacketDescriptions;
// }
AudioQueueEnqueueBuffer(x->queue, inBuffer, 0, NULL);
[x->targ performSelector: x->sel];
}
私はこれを閉じるために投票しています、私は問題が自分のいたずらなコーディングだとわかりました。私はn * sizeof(float)ではなくmalloc'd(n)を持っていたので、ランダムなゴミを読んでいました。 –
質問を削除することもできます。これはすばやく簡単です。あなたが問題を発見してうれしい。 – mtrw