检测噪声数据中的单一频率

信息处理 过滤器 离散信号 过滤器设计 爪哇
2022-02-12 09:27:04

我在信号处理方面不是很有经验,看起来这应该是一个简单的问题。我有两台计算机,一台以 44.1 kHz 的采样率播放 19 kHz 的音调,另一台以 44.1 kHz 的采样率进行监听,并尝试查找是否存在 19kHz 音调。信号的传输是在嘈杂的环境中进行的,我尝试使用 FFT 和 Goertzel 找到 19 kHz 波的幅度,但都没有给我一个决定性的值(幅度非常小)。

对于 FFT,我使用 JTransform,运行 forwardFFT,然后找到 19 kHz 所在的 bin,并通过 (imaginary * imaginary + real * real) 获得该频率 bin 的分量的幅度。

对于 Goertzel,我遵循了该站点上的伪代码:http ://www.mstarlabs.com/dsp/goertzel/goertzel.html 。我觉得如果样本大小相同,FFT 和 Goertzel 都应该给出相同的幅度,但它们为该频率仓提供不同的值。

我预计幅度会大于 10,但我不相信这是可行的。作为第一步,我相信我至少需要滤除 19 kHz 以下的噪声,但我不确定。也许应该先做一些高通滤波?关于如何检测 19 kHz 正弦波的任何建议?谢谢你。更新:

这是我从麦克风获得的原始数据图:

在此处输入图像描述

我觉得这只是噪音,但我不确定。

3个回答

如果您的目标是只找到频率,那么这是一项简单的任务。Magnitude = sqrt(real*real + img*img) 这个数字永远是正数。现在,在数组中找到幅度的最大值。

此外,频率 = 最大幅度*(Fs/N)

Fs = 采样频率(在您的情况下为 44100),N = FFT 的大小现在您有了频率。但数值取决于您使用的 fft 大小,即 512 大小将导致 86Hz (+- 86)、1024 => 43Hz 等的精度。所以,频率将是 189__ 或 190__ 什么的 :)

对于决策标准,将 19 kHz FFT 结果箱中的能量与其他相邻频率箱中的能量进行比较,并根据您的噪声分布和级别确定幅度是否存在足够的统计学差异。

您可能还希望通过其他方式确定设置中的扬声器响应曲线和麦克风抗混叠滤波器不会在 19 kHz 以下滚降。

我认为答案在于找到一种算法,在该算法中您只处理一个频率的 pcm 文件,而不是像 FFT 那样处理许多频率。因此,就像您告诉例程查找任何频率 [< +/- 0.5 HZ] 一样,它会以某个结果数字告诉您该特定频率的幅度或能量。我从未见过这样的算法被公开并免费供公众使用。使用 BASIC 或 FORTRAN 语言。然而,我知道,这样一个单一用途的实用程序必须存在。