iphone - 如何在 iPhone 上对 WAV 文件执行 FFT?

标签 iphone signal-processing fft

我必须在 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 文件中的数据提供给类似的文件?

最佳答案

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;
}

就是这样。我正在获取功率谱阵列。我已经检查了样本正弦波。它工作正常。

关于iphone - 如何在 iPhone 上对 WAV 文件执行 FFT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3987868/

相关文章:

iphone - 将核心数据中的元素添加到字典中,然后添加到 nsmutablearray?

iphone - 如何显示 CFStringType?喜欢 kABHomeLabel

ios - Facebook注销iOS SDK

matlab - 为什么从matlab获得的卷积与理论上获得的不同?

audio - 从麦克风/耳机捕获声音并以特定频率触发 Action

ios - 如何获得iOS的FFT FFT频率幅度结果?

java - FFT 声音分析

iphone - "no eligible Bundle IDs for iOS apps"怎么解决?

java - 频谱乘以常数后声音失真

c++ - C++ 中用于生成频谱图的 vector 和矩阵