代码之家  ›  专栏  ›  技术社区  ›  Warrior

如何在iPhone上执行WAV文件的FFT?

  •  5
  • Warrior  · 技术社区  · 14 年前

    我应该把WAV文件转换成NSData还是别的什么?

    以前有人在iPhone中成功地执行过WAV文件的FFT吗?我试着用 iPhoneFFT 为了这个,没有成功。

    例如,那里的代码声明

     // 2. Then fill up an array with data with your own function
       fillUpInputSignalWithMyData(myFFT.inputData);
    

    3 回复  |  直到 13 年前
        1
  •  6
  •   Warrior    13 年前
    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;
    }
    

        2
  •  4
  •   hotpaw2    14 年前

    研究你的C数据类型。

    FFT通常可以将数据作为几种C数据类型之一的C数组(而不是NSArray)。。。这包括iOS 4内置的加速框架FFTs。类型可以是短整数、长整数、浮点数或双精度数的数组。在最新的iOS设备上,使用短浮点执行fft通常是最快的。检查所选FFT需要的数据类型。许多需要一个实向量和一个虚向量作为复数输入。

    for (i=0;i<n;i++) { 
        myFloatArray_RealPart[i] = wavInts[i+22]; 
        myFloatArray_ImaginaryPart[i] = 0.0; 
    }
    

    (但您需要验证您拥有的wave文件的类型以及确保所需的FFT参数!)

        3
  •  1
  •   ahmet emrah    14 年前

    嗯,根据: http://github.com/alexbw/iPhoneFFT/blob/master/OouraFFT.h

    double *inputData;
    

    所以,您将fopen()wav文件,去掉头并获得双数组。