【问题标题】:How can I get the ratio of two audio signals in the frequencies domain?如何获得频域中两个音频信号的比率?
【发布时间】:2013-05-15 07:46:07
【问题描述】:

我需要比较两个音频信号,signal1 和 signal2。 Signal1 是白噪声。信号 2 与信号 1 是相同的信号,具有用于切割或衰减某些频率的特定均衡。 如何获得频域中两个音频信号的比率? (例如:在 100Hz 的频率下,信号 2 与信号 1 相比衰减了 50%)。 我需要这些信息来处理第三个信号,方法是应用应用于信号 2 中的变换信号 1 的相同均衡。

我使用this library 处理我的数据并从时域传递到频域。此代码对于信号 1 和信号 2 是相同的。

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)来实现我的目标?

【问题讨论】:

  • 为什么要对第三个信号做同样的均衡?
  • 我需要用相同的均衡来转换第三个信号,而对均衡本身没有先验知识。这只是一个实验

标签: java signal-processing fft


【解决方案1】:

你需要计算每个信号在频域的幅度,得到每个信号的功率谱估计,然后做除法,即

  • 获取信号 1 和信号 2
  • 对两个信号应用合适的窗函数(例如 von Hann)
  • 将 FFT 应用于加窗信号
  • 计算 FFT 输出的幅度,mag = sqrt(re*re+im*im) - 这给出了一个实值功率谱
  • 将信号 1 的功率谱除以信号 2 的功率谱,得到实值与频率的比值

要将此校正应用于信号 3,您可以使用 overlap-addoverlap-save 方法 - 本质上是对信号 3 进行 FFT,将每个复数值乘以上面获得的实数值,然后使用逆 FFT 得到返回到时域。唯一轻微的复杂性是需要重叠连续的示例窗口并正确处理这种重叠(请参阅上面的重叠添加/重叠保存方法的链接。)

【讨论】:

  • 谢谢你,保罗。这是我认为正确的解决方案。但是现在我该如何处理signal3?我可以应用 FFT(信号 3),计算 FFT 输出的幅度,使用先前计算的比率来转换信号 3 的功率谱。但是,我怎样才能将功率谱还原为时域中的信号呢?
  • 好的 - 我现在又添加了一个段落。
  • 谢谢。因此,在计算 FFT(signal3) 之后,无需计算 FFT 输出的幅度,然后再用计算的比率转换信号。对吗?
  • 没错 - 您可以在频域中缩放复数值。
  • 谢谢你,保罗!似乎该解决方案完美无缺!我快疯了,因为使用 realInverse(fftBuff, false);我得到了奇怪的结果。然后我使用了 realInverse(fftBuff, true) (来自文档:如果为真,则执行缩放),结果似乎是正确的。那是什么样的“缩放”?
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 2023-01-03
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多