我必须在iPhone应用程序中为.wav文件执行FFT。我已经看过那里的FFT算法,但是如何解析WAV文件并在这样的算法中使用?
我应该将WAV文件转换为NSData还是别的什么?
之前有没有人在iPhone上成功执行过WAV文件的FFT?我尝试使用iPhoneFFT,但没有成功。
例如,那里的代码
// 2. Then fill up an array with data with your own function
fillUpInputSignalWithMyData(myFFT.inputData);
我如何将WAV文件中的数据提供给这样的东西?
答案 0 :(得分:6)
MyAudioFile *audioFile = [[MyAudioFile alloc]init];
OSStatus result = [audioFile open:var ofType:@"wav"];
int numFrequencies=16384;
int kNumFFTWindows=10;
OouraFFT *myFFT = [[OouraFFT alloc] initForSignalsOfLength:numFrequencies*2 andNumWindows:kNumFFTWindows];
for(long i=0; i<myFFT.dataLength; i++)
{
myFFT.inputData[i] = (double)audioFile.audioData[i];
}
[myFFT calculateWelchPeriodogramWithNewSignalSegment];
for (int i=0;i<=8192;i++) {
NSLog(@"the spectrum data %d is %f ",i,myFFT.spectrumData[i]);
}
我创建了包含
的MyAudioFile类-(OSStatus)open:(NSString *)fileName ofType:(NSString *)fileType{
OSStatus result = -1;
CFStringRef filePath=fileName;
CFURLRef audioFileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, false);
//open audio file
result = AudioFileOpenURL (audioFileURL, kAudioFileReadPermission, 0, &mAudioFile);
if (result == noErr) {
//get format info
UInt32 size = sizeof(mASBD);
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mASBD);
UInt32 dataSize = sizeof packetCount;
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &dataSize, &packetCount);
NSLog([NSString stringWithFormat:@"File Opened, packet Count: %d", packetCount]);
UInt32 packetsRead = packetCount;
UInt32 numBytesRead = -1;
if (packetCount > 0) {
//allocate buffer
audioData = (SInt16*)malloc( 2 *packetCount);
//read the packets
result = AudioFileReadPackets (mAudioFile, false, &numBytesRead, NULL, 0, &packetsRead, audioData);
NSLog([NSString stringWithFormat:@"Read %d bytes, %d packets", numBytesRead, packetsRead]);
}
}
else
NSLog([NSString stringWithFormat:@"Could not open file: %@", filePath]);
CFRelease (audioFileURL);
return result;
}
多数民众赞成。我正在获得功率谱阵列。我已经用样本正弦波检查了。它工作正常。
答案 1 :(得分:4)
研究您的C数据类型。
FFT通常可以将数据作为几种C数据类型之一(不是NSArray)的C数组...这包括iOS 4内置的加速框架FFT。类型可能是一个短整数,长整数,浮点数或双精度数组。使用短浮点执行FFT通常是最新iOS设备上最快的。检查所选FFT所需的数据类型。许多人需要一个真实的向量和一个虚构的向量作为复杂的输入。
最常见的wav文件只有一个带有44字节头的块,然后是原始PCM数据作为短整数阵列,单声道或立体声交错。只需将此数组转换为FFT所需的数据类型即可。对于单声道数据,这可能很简单:
for (i=0;i<n;i++) {
myFloatArray_RealPart[i] = wavInts[i+22];
myFloatArray_ImaginaryPart[i] = 0.0;
}
(但您需要验证您拥有的波形文件的类型以及确保所需的FFT参数!)
答案 2 :(得分:1)
嗯,根据: http://github.com/alexbw/iPhoneFFT/blob/master/OouraFFT.h
您使用:
double *inputData;
所以,你将fopen()wav文件,摆脱标题并获得双数组。