【问题标题】:How to check the FFT results in iphone?如何在iphone中查看FFT结果?
【发布时间】:2010-10-28 08:10:22
【问题描述】:

我已经使用 OouraFFTl 对音频文件进行了 FFT。如何检查采样输出是否正确。有什么更好更简单的检查方法。这是我的代码。

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];
NSLog(@"the spectrum data 1 is  %f ",myFFT.spectrumData[1]);
NSLog(@"the spectrum data 2 is  %f",myFFT.spectrumData[2]);
NSLog(@"the spectrum data 8192 is  %f ",myFFT.spectrumData[8192]);

我创建了 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 signal-processing fft


    【解决方案1】:

    您需要绘制 FFT 输出的幅度。我不熟悉你的编程语言,但在 Python 中你会使用类似plot(abs(fft(a))) 的东西。对于静默输入,输出应全为零。对于正弦波输入,您应该看到两个尖峰:

    对于真实信号,尖峰从左到右是对称的。但是,如果您正在执行real FFT(计算效率更高),您只会得到图的左半部分作为输出,因为它忽略了冗余镜像。

    如果频率更高,尖峰将更靠近中心。如果the frequency is perfectly in sync with the chunk size,尖峰将只有一个点宽,其他一切都将非常接近 0。否则它将像上面一样有一个逐渐变细的“裙子”。

    【讨论】:

      【解决方案2】:

      检查 FFT 的简单方法是对正弦信号进行 FFT。除了十几个非零值之外,输出应该全为零。

      【讨论】:

        【解决方案3】:

        最常见的方法是进行 FFT,然后使用 iFFT(快速傅里叶逆变换)将得到的频谱转换回时域。然后你必须将你的输入时间信号与结果时间信号进行比较。进行比较的最简单方法是计算两个 RMS 之间的差异。

        例子:

        给定一个长度为 n 的时间信号 x。找到X=FFT(x),然后找到y=iFFT(X)。 y 将具有相同的长度 n。然后,为了比较 x 和 y,计算

        RMS_x=sqrt(x[0]*x[0] + x[1]*x[1] + ... + x[n]*x[n])
        RMS_y=sqrt(y[0]*y[0] + y[1]*y[1] + ... + y[n]*y[n])
        

        最后,

        Error=abs(RMS_x - RMS_y)
        

        这个误差越小,FFT/iFFT的质量就越好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 2014-12-07
          • 2021-03-27
          • 1970-01-01
          • 1970-01-01
          • 2016-02-11
          相关资源
          最近更新 更多