Мне нужно получить амплитуду сигнала с определенной частотой. Я использую функцию 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;
}
Алгоритм (или фильтр) Goertzel аналогичен вычислению величины только для одного бина БПФ.
Алгоритм Герцеля идентичен 1 биту БПФ, за исключением числовых артефактов, если период частоты является точным субмультиплом вашей длины фильтра Герцеля. В противном случае есть некоторые добавленные эффекты скручивания из прямоугольного окна непериодического размера в апертуре и как это окно относится к фазе ввода.
Умножение на сложную синусоиду и измерение величины комплексной суммы также вычисляемо аналогично Goertzel, за исключением того, что Goertzel не требует отдельного вызова (или поиска) функции триггерной библиотеки каждой точки, поскольку она обычно включает в себя триггерную рекурсию на части его алгоритма.
Вы умножаете (сложную) синусоидальную волну на входные данные и объединяете результат.
Умножение на сложный синус равно сдвигу частоты, вы хотите сдвинуть целевую частоту до 0 Гц. Интеграция представляет собой этап фильтрации нижних частот, причем ширина полосы пропускания является обратной величине длины выборки.
Затем вы получите сложное число, которое будет таким же числом, которое вы нашли бы в БПФ-буфере для этой частоты (потому что по сути это то, что делает FFT).