将音频采样从时域转换为频域



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

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

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

从音频端口以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毫秒)

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

在每个窗口上应用Hanning窗口函数

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函数的作用吗?

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

谢谢,Vahit

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

从1024个样本输入中,可以返回512个有意义的频率级别。

所以,是的,在你的窗口内,你会得到奈奎斯特频率的一个水平。

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

由于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

最新更新