【问题标题】:kissfft pitch detection using cepstrum concept in C/ and Proper input Mic使用 C/ 中的倒谱概念和适当的输入麦克风进行 Kissfft 音高检测
【发布时间】:2012-08-31 09:15:59
【问题描述】:

我是音频信号处理的初学者 现在我正在尝试实现音高检测算法 我发现了一些倒谱步骤

result1 = IFFT(log(abs(FFT(Audio Input))))
peak = max(result);
out_frequency = 1/peak; // last step

因此,我通过使用 Kissfft 和 portaudio 作为 FFT 和 IFFT 库在 C 中实现这些算法 问题是在我得到 IFFT 结果并执行最后一步提取频率之后,结果不是我所期望的。 (注。我通过在音符A(440Hz)中唱歌来测试)

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

要测试的麦克风是我的笔记本电脑麦克风,我知道它是电容麦克风。 我应该将 MIC 更改为 Dynamic Mic 还是可以使用普通 Labtop mic

听到的是我一直在执行的代码

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);

考虑

【问题讨论】:

    标签: kissfft


    【解决方案1】:

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

    真正的 fft 返回 N/2+1 个复点。

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

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

    【讨论】:

    • 非常感谢您的建议,但我仍然混淆了通过采样率和 fftsize 调整结果的最后部分我的采样率是 44100 和 fftsize 是 4096 我应该怎么做这个结果 = 1./ maxr 部分考虑
    • 那么你的 FFT 的频率分辨率是 44100/4096 Hz。第零个 bin 表示 DC (0Hz),第一个 bin 是 ~10Hz,第二个 bin ~20 Hz...另外,我刚刚注意到您正在独立搜索最大实部和虚部 - 这没有任何意义。您应该寻找最大量级的元素。
    • 嗨,马克,现在我逐步检查所有输出数字并使用 Qt 绘制图形。问题发生在我将大小为 4096/2 的 fftBins 记录(abs(fftBins))真实和 img 部分,然后我把它放到 ifft 但它给了我 1.#QNAN0 img 和 real,我考虑一下将kiss_fft lib设置为反向fft可能是我的错误,或者它可能是另一种解决方案,请建议考虑
    • imageshack.us/photo/my-images/850/cepstrummagnitude.png 这是我按照你的建议计算幅度后得到的。接下来该怎么做仍然很困惑,我搜索了一些概念,比如找到峰值并提取它,请建议
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2013-04-04
    • 2021-07-01
    • 1970-01-01
    • 2015-02-06
    • 2018-01-13
    相关资源
    最近更新 更多