【发布时间】: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