БПФ для одной частоты

1

Мне нужно получить амплитуду сигнала с определенной частотой. Я использую функцию FFTAnalysis. Но я получаю весь спектр. Как я могу изменить это для получения амплитуды сигнала с определенной частотой?

Например, у меня есть:

data = массив из 1024 точек;

Если я использую FFTAnalysis, я получаю массив FFTdata из 1024 точек.

Но мне нужно только 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;

}
Теги:
fft

2 ответа

1

Алгоритм (или фильтр) Goertzel аналогичен вычислению величины только для одного бина БПФ.

Алгоритм Герцеля идентичен 1 биту БПФ, за исключением числовых артефактов, если период частоты является точным субмультиплом вашей длины фильтра Герцеля. В противном случае есть некоторые добавленные эффекты скручивания из прямоугольного окна непериодического размера в апертуре и как это окно относится к фазе ввода.

Умножение на сложную синусоиду и измерение величины комплексной суммы также вычисляемо аналогично Goertzel, за исключением того, что Goertzel не требует отдельного вызова (или поиска) функции триггерной библиотеки каждой точки, поскольку она обычно включает в себя триггерную рекурсию на части его алгоритма.

0

Вы умножаете (сложную) синусоидальную волну на входные данные и объединяете результат.

Умножение на сложный синус равно сдвигу частоты, вы хотите сдвинуть целевую частоту до 0 Гц. Интеграция представляет собой этап фильтрации нижних частот, причем ширина полосы пропускания является обратной величине длины выборки.

Затем вы получите сложное число, которое будет таким же числом, которое вы нашли бы в БПФ-буфере для этой частоты (потому что по сути это то, что делает FFT).

  • 0
    К вашему сведению, этот алгоритм известен как алгоритм Гёртцела - по сути, он представляет собой однопоточную ДПФ и широко используется для таких приложений, как обнаружение тона.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню