gpt4 book ai didi

java - 单频 FFT

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:26 25 4
gpt4 key购买 nike

我需要获取特定频率下信号的幅度。我使用 FFTAnalysis 函数。但我得到了所有频谱。如何修改它以获得特定频率下信号的幅度?

例如我有:

数据 = 1024 点的数组;

如果我使用 FFTAnaanalysis,我会得到 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 不需要为每个点单独调用(或查找)三角库函数,因为它通常在其算法的一部分中包含三角递归。

关于java - 单频 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24633971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com