【问题标题】:How to detect fundamental frequency with comb filter?如何用梳状滤波器检测基频?
【发布时间】:2020-09-28 01:11:09
【问题描述】:
我必须使用梳状滤波器来检测声音文件的主要频率,或者如果它是声音序列的频率。我搜索了这个问题的任何实现或解释,但遗憾的是找不到任何东西。
到目前为止我得到了什么:我正在将一个 wav 文件加载到我的 java 应用程序中,然后使用 FFT 将其转换为频域。
接下来我该怎么做?以及如何实现这个用于频率检测的梳状滤波器?我不是要代码,只是告诉我应该如何解决这个问题。我不允许使用外部库。感谢您的任何建议。
【问题讨论】:
标签:
java
filter
fft
audio-processing
【解决方案1】:
在我的频率检测方法中,我使用以下方案生成了 N 个梳状滤波器:
filter1 -> 10-1010-1 ...
filter2 -> 100-100100-100...
filter3 -> 1000-10001000-1000...
filterN -> 1N0-1N0
计算fft后我的步骤:
- 从 fft 结果中获取幅度部分
- 用 fft 结果的幅度计算每个梳状滤波器的循环总和
- 如果当前和大于前一个,则将 sumMax 设置为当前和,并通过将每个梳子之间的空间与采样率和窗口大小的商相乘来计算频率
这种方法并不完美,但适用于基本声音的频率检测。
【解决方案2】:
查找“谐波乘积谱”算法或方法。
您可以使用固定梳状模板并将其与 FFT 频谱宽度的变化重新缩放进行匹配以获得最佳匹配,或者您可以将固定频谱与一系列不同频率间隔的“齿”梳进行匹配。插值或过滤可用于重新缩放(重新采样的一种形式)。逐次逼近可以改善最佳滤波器匹配,从而改善频率估计。最佳匹配应该是对基本音高或周期性频率的良好估计,或者可能是次谐波。