首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于倒谱概念的kissfft基音检测

基于倒谱概念的kissfft基音检测
EN

Stack Overflow用户
提问于 2012-08-31 17:16:00
回答 1查看 605关注 0票数 0

我现在是音频信号处理的初学者,我正在尝试实现基音检测算法,我已经找到了倒谱的一些步骤,这是

代码语言:javascript
复制
result1 = IFFT(log(abs(FFT(Audio Input))))
peak = max(result);
out_frequency = 1/peak; // last step

因此,我使用kissfft和portaudio作为FFT和IFFT的库,用C语言实现了这些算法。问题是在我得到IFFT结果并做最后一步提取频率后,结果并不是我所期望的。(注:I在音符A(440 the )中演唱进行测试)

我不确定我错过了倒谱的最后一步,还是做错了。

要测试的麦克风是我的笔记本电脑麦克风,我知道它是一个电容器麦克风。我应该将麦克风改为动态麦克风,还是可以使用普通的Labtop麦克风

我听到的是我实现的代码

代码语言:javascript
复制
kiss_fft_cpx cin[FFT_SIZE];
kiss_fft_cpx cout[FFT_SIZE];
kiss_fft_cpx fftBins[FFT_SIZE];
for ( i = 0; i <FFT_SIZE; i++){
    cin[i].r = zero;
    cin[i].i = zero;
    cout[i].r = zero;
    cout[i].i = zero;
    fftBins[i].r = zero;
    fftBins[i].i = zero;
}
for(j=0;j < FFT_SIZE;j++){
    cin[j].r = *in++ ;
}
kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc( FFT_SIZE, 0, NULL, NULL );
kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc( FFT_SIZE, 1, NULL, NULL );

// FFT...
kiss_fftr( fftConfiguration, (kiss_fft_scalar*)cin, fftBins );
for(i = 0; i<FFT_SIZE;i++){
    fftBins[i].i = log(fabs(fftBins[i].r));
    fftBins[i].r = zero;
}
// iFFT...
kiss_fftri( ifftConfiguration, fftBins, (kiss_fft_scalar*)cout );
double maxi = 0;
double maxr = 0;
for(i = 0; i<FFT_SIZE;i++){
    if(maxi<cout[j].i){
        maxi = cout[j].i;
    }
    if(maxr<cout[j].r){
        maxr = cout[j].r;
    }
}
printf("%f\t%f\n",maxi,maxr);
double result;
result = 1./maxr;
printf("result = %f\n",result);
free(fftConfiguration);
free(ifftConfiguration);

关注

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-01 03:42:34

您将创建一个复杂数组(kiss_fft_cpx),然后将其用作实数组(kiss_fft_scalar)。您需要使用kiss_fft_scalar将您的麦克风样本发送到kiss_fftr。

实数fft返回N/2+1个复数。

在计算震级时,不要忽略虚部。您可以使用sqrt(re^2+im^2)或跳过sqrt,而不会影响倒谱的峰值。

需要根据fft大小和采样频率调整感兴趣的频率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12212345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档