【问题标题】:Detect frequency change point in audio signal检测音频信号中的频率变化点
【发布时间】:2015-06-10 01:52:21
【问题描述】:

我正在录制一个带有初步音调的 fsk 信号。采样率为 8000(采样/秒),初步音调的频率为 440Hz(以 8192 个采样表示 - 播放大约 1 秒)。数据信号包含两个频率,“1”为 934Hz,“0”为 510Hz,编码信息为字符“8”(00111000),每个比特用 8192 个样本表示,数据信号紧随其后初步的语气。我使用以下代码来捕获音频字节,唯一的区别是我将它们写入 ByteArrayOutputStream。 https://stackoverflow.com/questions/23432398/audio-recorder-in-android-process-the-audio-bytes

我试图找到频率从初步音调的 440Hz 转移到代表位“0”(510Hz)的频率的点。我正在做的一般想法是解码消息。我正在使用 FFT 算法,带有 Hann 窗口和 HPS 方法 (http://cnx.org/contents/8b900091-908f-42ad-b93d-806415434b46@2/Pitch_Detection_Algorithms)(我知道这不是最好的方法,还有其他算法可以执行得更好,但这些是我现在的说明)。

有什么方法可以检测到这一点吗?我可以使用 FFT 吗?

【问题讨论】:

  • 简短的回答是“是”。这些是正弦波还是有人在吹萨克斯?我认为,HPS 听起来像是令人难以置信的矫枉过正,但如果你必须使用它,它会给你窗口的基频。除此之外,您还要求什么?
  • 由于您先验知道感兴趣的频率,因此您可以忽略任何其他频率,例如谐波或其他失真产物和伪影。没有必要分析整个频谱(这就是为什么 FFT 方法首先是过大的) - 只需查看相关的 bin 并忽略其他所有内容。
  • 好的,但是正在寻找一种方法来了解音高变化的确切时间?如果是这样,Paul 是对的,您将不得不使用重叠的窗口和一些可接受的间距。他也是对的,首先没有必要采用这种方法。计算量太大。
  • 您可能不需要知道确切的瞬间。你的傅里叶变换中有多少样本?您的符号是如此之长(8192)个样本,而且您几乎肯定不会在每次计算中使用那么多,因此简单地连续进行转换可能会产生足够的精度来解码您的数据。如果您计算超过 256 个样本,您将有 32 倍的过采样来解码,而串行 UART 通常以 16 倍构建并且可以以 8 倍的速度工作。并确保您的 8 KSPS 数据来自频带受限的源,因为在可听范围内的组件将与之混叠。
  • @just_code_it 我很好奇你在做什么会产生谐波。波形有多复杂?我是否认为这是一个简单的语气?如果是这样,为什么过零不是一种足够的方法?

标签: android audio fft frequency-analysis


【解决方案1】:

长度为 8192 的 3 个滑动 Goertzel 过滤器可以工作。估计频率转换/变化时间在您发现任意 2 个滑动滤波器的幅度输出之间的差值最大的点。

同时检查您的音调发生器和麦克风,看看它们是否具有良好的频率响应,频率如此之低,这可能是您检测泛音的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多