我需要比较两个音频信号,signal1 和 signal2。 Signal1 是白噪声。信号 2 与信号 1 是相同的信号,具有用于切割或衰减某些频率的特定均衡。 如何获得频域中两个音频信号的比率? (例如:在 100Hz 频率下,信号 2 相对于信号 1 衰减 50%)。 我需要此信息来通过应用与信号 2 中的信号 1 的变换相同的均衡来处理第三个信号。
我用了this library处理我的数据并从时域传递到频域。此代码对于 signal1 和 signal2 是相同的。
DoubleFFT_1D fft1 = new DoubleFFT_1D (FFT_SIZE);
double[] input1 = new double[FFT_SIZE];
double[] fftBuff1 = new double[FFT_SIZE * 2];
this.wavFileDoubleInputStreamMic.read(input1, 0, FFT_SIZE);
for (int i = 0; i < FFT_SIZE; i++){
fftBuff1[2*i] = input1[i];
fftBuff1[2*i+1] = 0;
}
fft1.complexForward(fftBuff1);
如何使用 FFT 结果(来自信号 1 和信号 2)来实现我的目标?
最佳答案
您需要计算频域中每个信号的幅度,以获得每个信号的功率谱估计,然后进行除法,即
- 获取信号 1 和信号 2
- 对两个信号应用合适的窗函数(例如 von Hann)
- 对加窗信号应用 FFT
- 计算 FFT 输出的幅度,
mag = sqrt(re*re+im*im)
- 这给出了实值功率谱 - 将信号 1 的功率谱除以信号 2 的功率谱,得到实值比与频率的关系
要将此修正应用于信号 3,您可以使用 overlap-add或overlap-save方法 - 本质上是对 signal3 进行 FFT,将每个复数值乘以上面获得的实数值,然后使用逆 FFT 返回到时域。唯一稍微复杂的是需要重叠连续的样本窗口并正确处理这种重叠(请参阅上面的重叠添加/重叠保存方法的链接。)
关于java - 如何获得频域中两个音频信号的比率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559516/