我正在尝试构建一个检测声音/歌曲音高(或频率)的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;
}
......
......
}
答案 0 :(得分:0)
我正在使用以下相同的程序: https://github.com/fotock/PitchDetectorExample/tree/1c68491f9c9bff2e851f5711c47e1efe4092f4de
虽然我还没有将它放在iPhone上,只有模拟器,但是在程序崩溃的时候我遇到了问题。我发现我需要从github上的代码“fork”手动更新它: https://github.com/fotock/PitchDetectorExample/network
我手动添加了Jordan Liggitt的错误修复程序,现在应用程序没有崩溃。我希望这有帮助,因为如果没有,那么当我在iPhone上加载这个应用程序时,我将面临同样的问题。
希望它有效!
<强> 更新 强> 我现在已经在iPhone和模拟器上安装了它,它可以正常工作而不会出错或崩溃。