我正在使用智能手机中的麦克风进行一些声音分析。因此我正在录制声音并对其进行FFT。之后我打印我的价值观。
我使用低通滤波器来切断200hz以上的所有内容。
for (int i = 0; i < blockSize; i++){
// lowpass filter before analyzing, possibility to cut frequencies above
int cutFreqFilterLowPass = 200 ; // lowpass frequency
int cutFreqBandPass=600;
for (int ii = 0; ii < audioDataDoubles.length; ii += 2) {
// if (ii < (((cutFreqBandPass - 100) * (audioDataDoubles.length/2)) / SAMPLING_RATE)*2 ||
ii > (((cutFreqBandPass + 100) * (audioDataDoubles.length/2)) / SAMPLING_RATE)*2){
if (ii > ((cutFreqFilterLowPass * (audioDataDoubles.length/2)) / SAMPLING_RATE)*2){
audioDataDoubles[ii] = audioDataDoubles[ii + 1] = 0.0;}
// audioDataDoubles_copy[ii]=audioDataDoubles[ii];
// System.out.println("gecutteter Frequenzbereich "+audioDataDoubles[ii]);
}
}
但现在,当我吹口哨时,我会在第一个箱子里得到价值......为什么会这样?
for (int i = 0; i < blockSize; i++) {
// real is stored in first part of array
re[i] = audioDataDoubles[i * 2];
// imaginary is stored in the sequential part
im[i] = audioDataDoubles[(i * 2) + 1];
// magnitude is calculated by the square root of (imaginary^2 + real^2)
magnitude[i] = Math.sqrt((re[i] * re[i]) + (im[i] * im[i]));
}
我很想知道1-2的价值观。前两个箱中的东西大约在40-80和80-120赫兹之间。
我曾经把第一个垃圾箱归零了?这有用吗?
这是正常的还是我的FFT无法正常工作?
似乎没有理由为什么我在那里得到价值......
答案 0 :(得分:1)
两件事:
如果是低质量的麦克风或音频接口,或者存在高干扰(例如地面嗡嗡声[虽然可能不适用于移动设备],低质量PCB,信号中实际上可能存在低频噪声设计,附近的干扰源)。然而,你所看到的非常准确地表达了你的信号:
FFT有时会包含与源信号样本端点差异相关的其他频率成分。 FFT本质上假设您的输入块是一个循环,如果它没有干净地循环,您可能希望看到其他组件。例如,如果在某个纯正弦波信号的中间采用任意块,相位偏移可能需要在FFT中存在其他频率分量,以便精确地表示异相信号。
为了对抗#2,通常的方法是使用window functions,它用于修改输入信号以减少突然的边界效应。在块的边缘。在最基本的情况下,窗口函数可以是块开始时的简单线性淡入淡出,并且在块的结尾处淡出(但这是一个非常粗略的函数)。您选择的窗口功能将影响FFT的频率响应(通常,频率分析应用程序将为用户提供窗口函数选择,以便可以在运行中选择最适合给定情况的窗口函数)。查看this page以获得更好的概述并撰写。
该页面中一个很好的相关模糊和图形:
记录终点的突然不连续性产生原始信号中不存在的频率分量,这在FFT中引入了频谱泄漏。通过研究采样信号是正弦波的情况可以理解这一点:
![]()
顺便说一下,基于FFT的滤波器实现起来可能很棘手,因为在窗口化时会丢失一些信息,并且在去除FFT频率分量后,必须进行块的重叠和交叉衰落以消除块之间的可听边界(可以改变信号的相位和DC偏移。延迟也可能是一个问题,具体取决于所需的FFT分辨率。
如果您要做的只是将固定过滤器应用于音频,您可能需要查看FIR filters。它们高效且易于实施。有许多简单的FIR滤波器设计工具可供选择,其中许多都是免费的。
答案 1 :(得分:0)
录制现场音频时,通常会有环境噪声基底(室内噪音和/或热噪声层)。这种噪声通常是宽频谱的,因此可以出现在所有FFT频段中。您可以在安静时间记录噪声级别,计算此噪声的统计数据,并且只有在FFT结果箱中的某些内容高于某个统计阈值(3 sigma或某些此类值)时才会认为它是有效的。
任何冲动,无论是哨子开始时的咔哒声还是低音鼓都是广谱的,因此也可以出现在所有的箱子里。
窗口瞬态也可以通过将实时音频馈送到任何有限长度FFT所涉及的矩形窗口产生,并且这也可以在FFT宽度中不完全周期性的任何频率内容的所有频段中产生一些噪声。钟形窗口(von Hann,et.al。)将有助于减少这种伪影。 FFT输入中的调制DC偏移也可以在FFT结果中产生低频噪声。计算和减去任何DC偏移也有助于减少这种伪影。