我需要获得某个频率的信号幅度。
我使用FFTAnalysis函数。但是我掌握了所有频谱。如何修改此值以获得某个频率下的信号幅度?

例如,我有:

数据= 1024点数组;

如果我使用FFTAnalysis,则会得到1024点的FFTdata数组。

但我只需要FFTdata [454]作为实例();

public static float[] FFTAnalysis(short[] AVal, int Nvl, int Nft) {
  double TwoPi = 6.283185307179586;
  int i, j, n, m, Mmax, Istp;
  double Tmpr, Tmpi, Wtmp, Theta;
  double Wpr, Wpi, Wr, Wi;
  double[] Tmvl;
  float[] FTvl;

  n = Nvl * 2;
  Tmvl = new double[n];
  FTvl = new float[Nvl];
  for (i = 0; i < Nvl; i++) {
    j = i * 2; Tmvl[j] = 0; Tmvl[j+1] = AVal[i];
  }

  i = 1; j = 1;
  while (i < n) {
    if (j > i) {
      Tmpr = Tmvl[i]; Tmvl[i] = Tmvl[j]; Tmvl[j] = Tmpr;
      Tmpr = Tmvl[i+1]; Tmvl[i+1] = Tmvl[j+1]; Tmvl[j+1] = Tmpr;
    }
    i = i + 2; m = Nvl;
    while ((m >= 2) && (j > m)) {
      j = j - m; m = m >> 1;
    }
    j = j + m;
  }

  Mmax = 2;
  while (n > Mmax) {
    Theta = -TwoPi / Mmax; Wpi = Math.sin(Theta);
    Wtmp = Math.sin(Theta / 2); Wpr = Wtmp * Wtmp * 2;
    Istp = Mmax * 2; Wr = 1; Wi = 0; m = 1;

    while (m < Mmax) {
      i = m; m = m + 2; Tmpr = Wr; Tmpi = Wi;
      Wr = Wr - Tmpr * Wpr - Tmpi * Wpi;
      Wi = Wi + Tmpr * Wpi - Tmpi * Wpr;

      while (i < n) {
        j = i + Mmax;
        Tmpr = Wr * Tmvl[j] - Wi * Tmvl[j-1];
        Tmpi = Wi * Tmvl[j] + Wr * Tmvl[j-1];

        Tmvl[j] = Tmvl[i] - Tmpr; Tmvl[j-1] = Tmvl[i-1] - Tmpi;
        Tmvl[i] = Tmvl[i] + Tmpr; Tmvl[i-1] = Tmvl[i-1] + Tmpi;
        i = i + Istp;
      }
    }

    Mmax = Istp;
  }

  for (i = 0; i < Nft; i++) {
    j = i * 2; FTvl[Nft - i - 1] = (float) Math.sqrt((Tmvl[j]*Tmvl[j]) + (Tmvl[j+1]*Tmvl[j+1]));
  }
return FTvl;

}

最佳答案

Goertzel算法(或滤波器)类似于仅针对FFT的1 bin计算幅度。

如果频率的周期恰好等于您的Goertzel滤波器长度的约数,则Goertzel算法与FFT的1 bin相同,除了数值失真外。否则,非周期性光圈大小的矩形窗口会增加一些扇形效果,以及该窗口如何与输入相位相关。

在计算上,乘以一个复杂的正弦曲线并取一个复杂的和的幅度也类似于Goertzel,只是Goertzel不需要在每个点上分别调用(或查找)trig库函数,因为它通常在一部分包含trig递归其算法。

07-24 22:20