什么可能导致" fft Window" Hanning归一化窗口中的值是NaN?

时间:2014-06-15 14:55:51

标签: ios iphone signal-processing fft accelerate-framework

我正在尝试构建一个检测声音/歌曲音高(或频率)的iOS 7应用程序,对于example: 349.23Hz, 392.00Hz, 440.00Hz......

所以,我下载了“Auto Correllation”项目(它是一个音乐家的句子http://musicianskit.com/developer.php),我在iOS 7模拟器上运行它,它工作正常,“hanning fft window”有价值(不是NaN),最终得到频率。

但是,它在iPhone设备上不起作用,它在“hanning fft window”中没有任何价值。 任何人都可以通过Kevin Murphy看看这些课程并告诉我如何修改它们以便在iPhone设备上工作(而不是iOS模拟器)? 非常感谢〜

我在下面粘贴了我的代码:

// PitchDetector.m

    -(id) initWithSampleRate: (float) rate lowBoundFreq: (int) low hiBoundFreq: (int) hi andDelegate: (id<PitchDetectorDelegate>) initDelegate {
        self.lowBoundFrequency = low;
        self.hiBoundFrequency = hi;
        self.sampleRate = rate;
        self.delegate = initDelegate;

        bufferLength = self.sampleRate/self.lowBoundFrequency;    

        hann = (float*) malloc(sizeof(float)*bufferLength);

        // applied the Hanning windows, the 'hann' is the Hanning fft Window
        vDSP_hann_window(hann, bufferLength, vDSP_HANN_NORM);

        sampleBuffer = (SInt16*) malloc(512);
        samplesInSampleBuffer = 0;

        result = (float*) malloc(sizeof(float)*bufferLength);

        return self;
    }

    -(void) performWithNumFrames: (NSNumber*) numFrames;
    {
        int n = numFrames.intValue;
        float freq = 0;    
        SInt16 *samples = sampleBuffer;

        int returnIndex = 0;
        float sum;
        bool goingUp = false;
        float normalize = 0;    
        for(int i = 0; i<n; i++) {
            sum = 0;
            for(int j = 0; j<n; j++) {
                //here I found the hann[j] is NaN. seems doesn't have value in hann('hann' is the Hanning fft Window)
                //if hann[j] is Not a Number (NaN), the value of sum also to be NaN.
                sum += (samples[j]*samples[j+i])*hann[j];            
            }
            if(i ==0 ) normalize = sum;        
            result[i] = sum/normalize;
        }
    ......
    ......
    }

1 个答案:

答案 0 :(得分:0)

我正在使用以下相同的程序: https://github.com/fotock/PitchDetectorExample/tree/1c68491f9c9bff2e851f5711c47e1efe4092f4de

虽然我还没有将它放在iPhone上,只有模拟器,但是在程序崩溃的时候我遇到了问题。我发现我需要从github上的代码“fork”手动更新它: https://github.com/fotock/PitchDetectorExample/network

我手动添加了Jordan Liggitt的错误修复程序,现在应用程序没有崩溃。我希望这有帮助,因为如果没有,那么当我在iPhone上加载这个应用程序时,我将面临同样的问题。

希望它有效!

<强> 更新 我现在已经在iPhone和模拟器上安装了它,它可以正常工作而不会出错或崩溃。