【问题标题】:Input for the 1D FFT一维 FFT 的输入
【发布时间】:2012-04-21 20:47:50
【问题描述】:

我有一个从传感器获取的浮点数组,我想在通过 FFT 运行信号后获得幅度(在此之前,样本是使用高通滤波器和 Hann 窗函数处理的)。

使用 AForge.Math 库 FFT 类,它将一个复数数组作为参数,我想出了以下代码:

Complex[] complex = new Complex[1024];
for (int i = 0; i < 1024 - 1; i++)
{
     complex[i] = new Complex(windowedSamples[i], 0);
}

FourierTransform.FFT(complex, FourierTransform.Direction.Forward);
return complex.Select(x =>  Math.Sqrt(Math.Sqrt(x.Re) + Math.Sqrt(x.Im))).ToArray();

运行这个我得到了一些奇怪的结果,并且无法锁定问题。

前 10 个输入值:

0 0 -3.8454E-05 0.0001737584 0.0006910793 0.001071334 0.00204984 0.00276812 0.001741312 0.001796867

前 10 个输出值:

0.482303347948843 0.706458195192639 NaN NaN NaN NaN NaN NaN NaN NaN

我的第一个猜测是它可能与虚部有关,但到目前为止我读到的所有内容都说在这种情况下它应该设置为 0。

我真的很感激能帮我解决这个问题。

【问题讨论】:

  • 您正在取 x.Re 和 x.Im 的平方根。你确定这些都是正值吗?
  • Gebb 是对的,您使用错误的方法计算得到的复数的绝对值。

标签: c# .net math signal-processing fft


【解决方案1】:

这个表达式

Math.Sqrt(Math.Sqrt(x.Re) + Math.Sqrt(x.Im))

对我来说有点奇怪。你想在这里得到x 的绝对值吗?那么你可能应该将虚部和实部提高到 2 的幂,而不是取它们的平方根。

如果绝对值是您想要的,那么只需将该表达式替换为

x.Magnitude

【讨论】:

  • Math.Sqrt(x.Rex.Re+x.Imx.Im)
猜你喜欢
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2012-07-22
相关资源
最近更新 更多