作为一名软件工程师,我在处理信号处理问题时遇到了一些困难。我在这方面没有多少经验。
我尝试做的是以44100采样率采样环境声音,并使用固定尺寸的窗口测试特定频率(20KHz)是否存在并且高于阈值。
以下是我根据How to extract frequency information from samples from PortAudio using FFTW in C
中的完美答案所做的事情从44100采样率的音频端口收集102400个采样(2320 ms)。样本值介于0.0和1.0之间
int samplingRate = 44100;
int numberOfSamples = 102400;
float samples[numberOfSamples] = ListenMic_Function(numberOfSamples,samplingRate);
窗口大小或FFT大小为1024个样本(23.2 ms)
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功能。
我不能确定的是,当给出FFT函数的N(1024)个样本作为输入时,samplingRate / 2(22050)分贝值作为输出返回。这是一个FFT功能吗?
据我所知,由于奈奎斯特频率,我最多可以检测到一半的采样率频率。但是,每个频率的分贝值是否可以达到samplingRate / 2(22050)Hz?
谢谢, 瓦希特
答案 0 :(得分:6)
请参阅How do I obtain the frequencies of each value in an FFT?
从1024个样本输入中,您可以获得512个有意义的频率级别。
所以,是的,在你的窗口内,你将获得奈奎斯特频率的水平。
您将看到的最低频率级别是DC(0 Hz),下一个将是SampleRate / 1024,或大约44 Hz,下一个是2 * SampleRate / 1024,依此类推,向上至512 * SampleRate / 1024 Hz。
答案 1 :(得分:2)
由于您的FFT中只使用了一个波段,因此即使使用适当的窗口,我也希望您的结果会受到边带效应的影响。它可能会起作用,但您可能也会因某些输入频率而出现误报。此外,您的信号接近您的信号,因此您假设信号路径相当于您的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