java - 如何获得频域中两个音频信号的比率?

标签 java signal-processing fft

我需要比较两个音频信号,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-addoverlap-save方法 - 本质上是对 signal3 进行 FFT,将每个复数值乘以上面获得的实数值,然后使用逆 FFT 返回到时域。唯一稍微复杂的是需要重叠连续的样本窗口并正确处理这种重叠(请参阅上面的重叠添加/重叠保存方法的链接。)

关于java - 如何获得频域中两个音频信号的比率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559516/

相关文章:

java - 主机上的 ServerSocket.accept() 不接受源自 guest VM 的连接

algorithm - 是否有用于生成带限锯齿的恒定时间算法?

python-2.7 - 计算物理学,FFT分析

java - 如何迭代arraylist并存储到另一个arraylist?

java - 如何为多个部署平台维护相同的代码库

python - 使用 scipy.signal.spectral.lombscargle 进行周期发现

python - FFT - 峰峰值、峰值、RMS

python - 如何估计具有非均匀平移/旋转的图像之间的亚像素偏移

matlab - 傅里叶级数 - 在 Matlab 中绘图

java - 如何自动使用m2e在eclipse中配置checkstyle?