【问题标题】:Determine whether a specific frequency is contained in signal确定信号中是否包含特定频率
【发布时间】:2020-03-19 18:18:02
【问题描述】:

我需要编写一个脚本,它必须检测频率并找到一个特定的频率(如果它包含在信号中)。问题是我在使用 FFT 后得到了大量不同的频率,并且没有应该的频率。例如,如果我只是发送简单的 440 Hz,找到峰值并打印相应的频率,效果很好。但是如果我发送带有其他噪声的高频信号,它就不起作用了。这个案例对我来说更有趣。

我在做什么:

from scipy.io import wavfile
import numpy as np
from numpy import fft

fs, data = wavfile.read('./signal.wav')
frs = np.fft.fftfreq(len(data))
res = abs(frs*fs)

在 res 中,我可以看到很多“额外”频率。主要任务是检测是否存在特定频率。例如,21487 赫兹。我还找到了 Goertzel 算法的实现,但它需要很多时间。有没有快速简单的方法来解决我的问题?

提前谢谢你

【问题讨论】:

  • “大量不同频率”是由噪声造成的。检查波形文件是否真的包含那个高频率。如果 f0 由于抗混叠过滤而接近 Fs/2,则可能不会。
  • 好吧,为了检查它,我生成了高频信号并使用了显示捕获频率的移动应用程序。我发送的频率是 15342 Hz。
  • 等效实现的 Goertzel 算法比 FFT 更快。

标签: python audio fft frequency


【解决方案1】:

据我了解,np.fft.fftfreq 命令只返回频率仓的频率向量,而不是信号的 fft。

要在信号中找到一个频率,您必须执行 fft,然后搜索例如向量中的最大值,然后计算返回的女巫频率。或者你知道向量中的位置,你可以在 res 向量中查找频率。

因为 fftfreq 不计算 fft,所以计算 Goertzel 算法要快得多。

Description of np.fft.fftfreq

【讨论】:

  • 搜索最大值并不能解决问题,因为 1. 那里有很多值。 2.有噪音。因此,取最大值可能会返回错误的另一个频率,而不是我想看到的频率。
  • 没错,max 可能不是最好的。但我认为你的问题是,fftfreq 不计算你的信号的fft。当您计算 fft 时,您知道在女巫箱中所需的频率是,然后您可以检查该值是否高于阈值。 (当您的频率不完全位于一个垃圾箱中时,也许您必须另外检查相邻的垃圾箱)
  • 我明白你的意思。我尝试调用 fftfreq(fft(data)),发现值超过某个阈值,然后发现索引为 abs(fft(data)) > 阈值并找到峰值。但它仍然无法在高频下正常工作。
  • 我不知道你的问题的答案。采样率是否足够高? (fs>2*21487 赫兹)
  • 当然fs大于2*f。我认为,很难在有很多噪音的 wav 文件中检测到特定的高频..
猜你喜欢
  • 2017-07-23
  • 2013-02-22
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2013-02-04
相关资源
最近更新 更多