7

作为一名软件工程师,我在处理信号处理问题时遇到了一些困难。我在这方面没有太多经验。

我尝试做的是以 44100 采样率和固定大小的窗口对环境声音进行采样,以测试是否存在特定频率(20KHz)并高于阈值。

这是我根据如何使用 C 中的 FFTW 从 PortAudio 的样本中提取频率信息中的完美答案所做的

从音频端口以 44100 采样率收集 102400 个样本(2320 毫秒)。样本值介于 0.0 和 1.0 之间

int samplingRate = 44100;
int numberOfSamples = 102400;
float samples[numberOfSamples] = ListenMic_Function(numberOfSamples,samplingRate);

窗口大小或 FFT 大小为 1024 个样本(23.2 毫秒)

int N = 1024;

窗口数量为 100

int noOfWindows = numberOfSamples / N;

将样本拆分为 noOfWindows (100) 个窗口,每个窗口的大小为 N (1024) 个样本

float windowSamplesIn[noOfWindows][N];
for i:= 0 to noOfWindows -1 
    windowSamplesIn[i] = subarray(samples,i*N,(i+1)*N);
endfor

在每个窗口上应用汉宁窗函数

float windowSamplesOut[noOfWindows][N];
for i:= 0 to noOfWindows -1 
    windowSamplesOut[i] = HanningWindow_Function(windowSamplesIn[i]);
endfor

在每个窗口上应用 FFT(在 FFT 函数内完成实数到复数的转换)

float frequencyData[noOfWindows][samplingRate/2]; 
for i:= 0 to noOfWindows -1 
    frequencyData[i] = RealToComplex_FFT_Function(windowSamplesOut[i], samplingRate);
endfor

在最后一步,我使用了这个链接中实现的 FFT 函数:http: //www.codeproject.com/Articles/9388/How-to-implement-the-FFT-algorithm;因为我无法从头开始实现 FFT 函数。

我不能确定的是,在将 N (1024) 个样本作为输入提供给 FFT 函数时,samplingRate/2 (22050) 分贝值作为输出返回。它是 FFT 函数的作用吗?

我知道由于奈奎斯特频率,我最多可以检测到一半的采样率频率。但是是否可以获得每个频率高达 samplingRate/2 (22050) Hz 的分贝值?

谢谢, 瓦希特

4

2 回答 2

7

请参阅如何获得 FFT 中每个值的频率?

从 1024 个样本输入,您可以获得 512 个有意义的频率电平。

所以,是的,在您的窗口内,您将恢复奈奎斯特频率的水平。

您将看到的最低频率级别是 DC (0 Hz),下一个是 SampleRate/1024,或大约 44 Hz,下一个是 2 * SampleRate/1024,依此类推,最高可达 512 *采样率 / 1024 赫兹。

于 2012-08-19T20:24:02.570 回答
2

由于您的 FFT 中只使用了一个波段,我希望您的结果会受到边带效应的影响,即使有适当的窗口也是如此。它可能有效,但您也可能会在某些输入频率下得到误报。此外,您的信号接近您的 niquist,因此您假设到 FFT 的信号路径相当好。我不认为这是正确的做法。

我认为这种信号检测的更好方法是使用高阶滤波器(根据您的要求,我猜四阶或五阶,实际上并没有那么高)。如果您不知道如何设计高阶滤波器,您可以串联使用两个或三个二阶滤波器。此处描述了设计二阶滤波器,有时称为“双二阶”:

http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt

尽管非常简洁并且带有一些先验知识的假设。我会使用转角频率尽可能低的高通 (HP) 滤波器,可能在 18 到 20 kHz 之间。请记住,拐角频率处有一些衰减,因此在多次应用滤波器后,您会丢弃一点信号。

过滤音频后,取 RMS 或平均幅度(即绝对值的平均值),以找到一段时间内的平均电平。

与您现在所做的相比,这种技术有几个优点,包括更好的延迟(您可以在几个样本内开始检测)、更好的可靠性(您不会因为杂散频率的响亮信号而得到误报)等等.

这篇文章可能是相关的:http: //blog.bjornroche.com/2012/08/why-eq-is-done-in-time-domain.html

于 2012-08-20T00:43:05.650 回答