作为一名软件工程师,我在处理信号处理问题时遇到了一些困难。我在这方面没有太多经验。
我尝试做的是以 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 的分贝值?
谢谢, 瓦希特