Tengo dificultades para extraer datos de amplitud del PCM lineal en el iPhone almacenado en un audio.caf.Extracción de datos de amplitud desde PCM lineal en el iPhone
Mis preguntas son:
- tiendas PCM lineal de amplitud muestras como valores de 16 bits. ¿Es esto correcto?
- ¿Cómo se almacena la amplitud en paquetes devueltos por AudioFileReadPacketData()? Al grabar PCM lineales mono, ¿no es cada muestra, (en un cuadro, en un paquete) solo una matriz para SInt16? ¿Cuál es el orden de bytes (big endian vs. little endian)?
- ¿Qué significa físicamente cada paso en la amplitud PCM lineal?
- Cuando se graba PCM lineal en el iPhone, ¿el punto central es 0 (SInt16) o 32768 (UInt16)? ¿Qué significan los valores mínimos máximos en la forma de onda física/presión de aire?
y una pregunta adicional: ¿Hay formas de ondas de presión de sonido/aire que el micrófono iPhone no puede medir?
Mi código de la siguiente manera:
// get the audio file proxy object for the audio
AudioFileID fileID;
AudioFileOpenURL((CFURLRef)audioURL, kAudioFileReadPermission, kAudioFileCAFType, &fileID);
// get the number of packets of audio data contained in the file
UInt64 totalPacketCount = [self packetCountForAudioFile:fileID];
// get the size of each packet for this audio file
UInt32 maxPacketSizeInBytes = [self packetSizeForAudioFile:fileID];
// setup to extract the audio data
Boolean inUseCache = false;
UInt32 numberOfPacketsToRead = 4410; // 0.1 seconds of data
UInt32 ioNumPackets = numberOfPacketsToRead;
UInt32 ioNumBytes = maxPacketSizeInBytes * ioNumPackets;
char *outBuffer = malloc(ioNumBytes);
memset(outBuffer, 0, ioNumBytes);
SInt16 signedMinAmplitude = -32768;
SInt16 signedCenterpoint = 0;
SInt16 signedMaxAmplitude = 32767;
SInt16 minAmplitude = signedMaxAmplitude;
SInt16 maxAmplitude = signedMinAmplitude;
// process each and every packet
for (UInt64 packetIndex = 0; packetIndex < totalPacketCount; packetIndex = packetIndex + ioNumPackets)
{
// reset the number of packets to get
ioNumPackets = numberOfPacketsToRead;
AudioFileReadPacketData(fileID, inUseCache, &ioNumBytes, NULL, packetIndex, &ioNumPackets, outBuffer);
for (UInt32 batchPacketIndex = 0; batchPacketIndex < ioNumPackets; batchPacketIndex++)
{
SInt16 packetData = outBuffer[batchPacketIndex * maxPacketSizeInBytes];
SInt16 absoluteValue = abs(packetData);
if (absoluteValue < minAmplitude) { minAmplitude = absoluteValue; }
if (absoluteValue > maxAmplitude) { maxAmplitude = absoluteValue; }
}
}
NSLog(@"minAmplitude: %hi", minAmplitude);
NSLog(@"maxAmplitude: %hi", maxAmplitude);
Con este código casi siempre dan un mínimo de 0 y un máximo de 128! Eso no me hace sentido a .
estoy grabando el audio usando el AVAudioRecorder de la siguiente manera:
// specify mono, 44.1 kHz, Linear PCM with Max Quality as recording format
NSDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
// store the sound file in the app doc folder as calibration.caf
NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *audioFileURL = [NSURL fileURLWithPath:[documentsDir stringByAppendingPathComponent: @"audio.caf"]];
// create the audio recorder
NSError *createAudioRecorderError = nil;
AVAudioRecorder *newAudioRecorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL settings:recordSettings error:&createAudioRecorderError];
[recordSettings release];
if (newAudioRecorder)
{
// record the audio
self.recorder = newAudioRecorder;
[newAudioRecorder release];
self.recorder.delegate = self;
[self.recorder prepareToRecord];
[self.recorder record];
}
else
{
NSLog(@"%@", [createAudioRecorderError localizedDescription]);
}
Gracias por cualquier idea puede ofrecer. Este es mi primer proyecto usando Core Audio, ¡así que siéntete libre de romper mi enfoque!
P.S. He intentado buscar en los archivos de la lista Core Audio, pero la solicitud sigue dando un error: (http://search.lists.apple.com/?q=linear+pcm+amplitude&cmd=Search%21&ul=coreaudio-api)
P.P.S. He mirado:
http://en.wikipedia.org/wiki/Sound_pressure
http://en.wikipedia.org/wiki/Linear_PCM
http://wiki.multimedia.cx/index.php?title=PCM
Get the amplitude at a given time within a sound file?
http://music.columbia.edu/pipermail/music-dsp/2002-April/048341.html
También he leído la totalidad del Core Audio Descripción y la mayor parte del audio Programación de sesión Guía, pero mis preguntas permanecen.