public final class FFT {
public int logm;
final int MAXLOGM = 20; /* max FFT length 2^MAXLOGM */
final double TWOPI = 6.28318530717958647692;
final double SQHALF = 0.707106781186547524401;
int brseed[] = new int[4048];
float tab[][];
public FFT(int nlength) {
double dtemp = Math.log(nlength) / Math.log(2);
if ((dtemp - (int) dtemp) != 0.0) {
throw new Error("FFT length must be a power of 2.");
} else {
this.logm = (int) dtemp;
}
if (logm >= 4) {
creattab(logm);
}
}
/**
* Calculates the magnitude spectrum of a real signal. The returned vector
* contains only the positive frequencies.
*/
public float[] calculateFFTMagnitude(float x[]) {
int i, n;
n = 1 << this.logm;
if (x.length > n) {
throw new Error("Tried to use a " + n
+ "-points FFT for a vector with " + x.length + " samples!");
}
rsfft(x);
float[] mag = new float[n / 2 + 1];
mag[0] = x[0]; // DC frequency must be positive always
if (n == 1) {
return mag;
}
mag[n / 2] = (float) Math.abs(x[n / 2]); // pi (meaning: fs / 2)
// System.out.println("FFT before magnitude");
// IO.DisplayVector(x);
for (i = 1; i < n / 2; i++) {
mag[i] = (float) Math.sqrt(x[i] * x[i] + x[n - i] * x[n - i]);
// System.out.println(mag[i] + " " + x[i] + " " + x[n-i]);
}
// IO.DisplayVector(mag);
return mag;
}
/**
* Calculates the magnitude spectrum of a real signal. The returned vector
* contains only the positive frequencies.
*/
public double[] calculateFFTMagnitude(double inputData[]) {
int i, n;
n = 1 << this.logm;
if (inputData.length > n) {
throw new Error("Tried to use a " + n
+ "-points FFT for a vector with " + inputData.length
+ " samples!");
}
// System.out.println("magnitude test");
// double[] dtest = DSP.DFTMagnitude(inputData);
// IO.DisplayVector(dtest);
float[] x = new float[n];
for (i = 0; i < inputData.length; i++) {
x[i] = (float) inputData[i];
}
rsfft(x);
// System.out.println("FFT before magnitude");
// IO.DisplayVector(x);
double[] mag = new double[n / 2 + 1];
mag[0] = x[0]; // DC frequency must be positive always
if (n == 1) {
return mag;
}
mag[n / 2] = Math.abs(x[n / 2]); // pi (meaning: fs / 2)
for (i = 1; i < n / 2; i++) {
mag[i] = Math.sqrt(x[i] * x[i] + x[n - i] * x[n - i]);
// System.out.println(mag[i] + " " + x[i] + " " + x[n-i]);
}
// IO.DisplayVector(mag);
return mag;
}
/**
* Calculates the power (magnitude squared) spectrum of a real signal. The
* returned vector contains only the positive frequencies.
*/
public double[] calculateFFTPower(double inputData[]) {
int i, n;
n = 1 << this.logm;
// System.out.println("magnitude test");
// double[] dtest = DSP.DFTMagnitude(inputData);
// IO.DisplayVector(dtest);
float[] x = new float[n];
for (i = 0; i < inputData.length; i++) {
x[i] = (float) inputData[i];
}
rsfft(x);
// System.out.println("FFT before magnitude");
// IO.DisplayVector(x);
double[] mag = new double[n / 2 + 1];
mag[0] = x[0]; // DC frequency must be positive always
if (n == 1) {
return mag;
}
mag[n / 2] = Math.abs(x[n / 2]); // pi (meaning: fs / 2)
for (i = 1; i < n / 2; i++) {
mag[i] = x[i] * x[i] + x[n - i] * x[n - i];
// mag[i] = Math.sqrt(x[i]*x[i]+x[n-i]*x[n-i]);
// System.out.println(mag[i] + " " + x[i] + " " + x[n-i]);
}
// IO.DisplayVector(mag);
return mag;
}
/**
* In place calculation of FFT magnitude.
*/
public void FFTMagnitude(float x[]) {
int i, n;
rsfft(x);
n = 1 << this.logm;
if (n == 1)
return;
for (i = 1; i < n / 2; i++) {
x[i] = (float) Math.sqrt(x[i] * x[i] + x[n - i] * x[n - i]);
x[n - i] = x[i];
}
// Aldebaro modification:
x[n / 2] = Math.abs(x[n / 2]);
}
void rsfft(float x[]) {
/* creat table */
// if(logm>=4) creattab(logm);
/* Call recursive routine */
rsrec(x, logm);
/* Output array unshuffling using bit-reversed indices */
if (logm > 1) {
BR_permute(x, logm);
return;
}
}
/*
* -------------------------------------------------------------------- *
* Inverse transform for real inputs *
* --------------------------------------------------------------------
*/
void rsifft(float x[]) {
int i, m;
float fac;
int xp;
/* Output array unshuffling using bit-reversed indices */
if (logm > 1) {
BR_permute(x, logm);
}
x[0] *= 0.5;
if (logm > 0)
x[1] *= 0.5;
/* creat table */
// if(logm>=4) creattab(logm);
/* Call recursive routine */
rsirec(x, logm);
/* Normalization */
m = 1 << logm;
fac = (float) 2.0 / m;
xp = 0;
for (i = 0; i < m; i++) {
x[xp++] *= fac;
}
}
/*
* -------------------------------------------------------------------- *
* Creat multiple fator table *
* --------------------------------------------------------------------
*/
void creattab(int logm) {
int m, m2, m4, m8, nel, n, rlogm;
int cn, spcn, smcn, c3n, spc3n, smc3n;
double ang, s, c;
tab = new float[logm - 4 + 1][6 * ((1 << logm) / 4 - 2)];
for (rlogm = logm; rlogm >= 4; rlogm--)
{
m = 1 << rlogm;
m2 = m / 2;
m4 = m2 / 2;
m8 = m4 / 2;
nel = m4 - 2;
/* Initialize pointers */
cn = 0;
spcn = cn + nel;
smcn = spcn + nel;
c3n = smcn + nel;
spc3n = c3n + nel;
smc3n = spc3n + nel;
/* Compute tables */
for (n = 1; n < m4; n++) {
if (n == m8)
continue;
ang = n * TWOPI / m;
c = Math.cos(ang);
s = Math.sin(ang);
tab[rlogm - 4][cn++] = (float) c;
tab[rlogm - 4][spcn++] = (float) (-(s + c));
tab[rlogm - 4][smcn++] = (float) (s - c);
ang = 3 * n * TWOPI / m;
c = Math.cos(ang);
s = Math.sin(ang);
tab[rlogm - 4][c3n++] = (float) c;
tab[rlogm - 4][spc3n++] = (float) (-(s + c));
tab[rlogm - 4][smc3n++] = (float) (s - c);
}
}
}
/*
* -------------------------------------------------------------------- *
* Recursive part of the RSFFT algorithm. Not externally * callable. *
* --------------------------------------------------------------------
*/
void rsrec(float x[], int logm) {
int m, m2, m4, m8, nel, n;
int x0 = 0;
int xr1, xr2, xi1;
int cn = 0;
int spcn = 0;
int smcn = 0;
float tmp1, tmp2;
double ang, c, s;
/* Check range of logm */
try {
if ((logm < 0) || (logm > MAXLOGM)) {
System.err.println("FFT length m is too big: log2(m) = " + logm
+ "is out of bounds [" + 0 + "," + MAXLOGM + "]");
throw new OutofborderException(logm);
}
} catch (OutofborderException e) {
throw new OutOfMemoryError();
}
/* Compute trivial cases */
if (logm < 2) {
if (logm == 1) { /* length m = 2 */
xr2 = x0 + 1;
tmp1 = x[x0] + x[xr2];
x[xr2] = x[x0] - x[xr2];
x[x0] = tmp1;
return;
} else if (logm == 0)
return; /* length m = 1 */
}
/* Compute a few constants */
m = 1 << logm;
m2 = m / 2;
m4 = m2 / 2;
m8 = m4 / 2;
/* Build tables of butterfly coefficients, if necessary */
// if ((logm >= 4) && (tab[logm-4][0] == 0)) {
/* Allocate memory for tables */
// nel = m4 - 2;
/*
* if ((tab[logm-4] = (float *) calloc(3 * nel, sizeof(float))) == NULL)
* { printf("Error : RSFFT : not enough memory for cosine tables.\n");
* error_exit(); }
*/
/* Initialize pointers */
// tabi=logm-4;
// cn =0; spcn = cn + nel; smcn = spcn + nel;
/* Compute tables */
/*
* for (n = 1; n < m4; n++) { if (n == m8) continue; ang = n *
* (float)TWOPI / m; c = Math.cos(ang); s = Math.sin(ang);
* tab[tabi][cn++] = (float)c; tab[tabi][spcn++] = (float)(- (s + c));
* tab[tabi][smcn++] =(float)( s - c); } }
*

Liuyuew
- 粉丝: 0
- 资源: 1
最新资源
- x86-64-14.2.0-release-win32-seh-ucrt-rt-v12-rev1.7z
- 西门子PLC 200SMART控制下的水处理程序:双级反渗透与EDI工艺保障水质达到纯净度的提升之旅,西门子水处理系统:二级反渗透+EDI除盐水处理工艺,智能触摸屏控制,确保超纯水水质与电阻率达标,高
- DeepSeek大模型应用于消防软管公司的智能系统接入和技术实现方案
- 伺服电机两环系统控制仿真模型搭建与PSO粒子群算法优化速度环参数,基于PSO粒子群算法优化的伺服电机两环系统控制仿真模型参数寻优与算法优化研究,伺服电机两环系统控制仿真模型 PSO粒子群算法优化伺服电
- 基于BPSK调制解调+LDPC编译码通信链路matlab误码率仿真【包括程序,中文注释,程序操作视频】
- 嘉宾商学:用AI让你的工作效率提高10倍.pdf
- 基于模型预测控制MPC的逆变器并网仿真模型:三相全桥(两电平)电网电流控制效果与SVPWM开关信号的优化研究,基于MPC控制策略的三相全桥逆变器并网仿真模型研究:波形解析与电网电流控制目标实现,#模型
- MATLAB驱动的铁轨表面缺陷自动检测系统:基于DFT幅度与相位反变技术的高斯滤波二值化处理,MATLAB驱动的铁轨表面缺陷检测系统:基于DFT幅度与相位变换的高效处理算法,MATLAB 铁轨表面缺陷
- 基于二自由度动力学模型和Frenet坐标系的LQR车辆轨迹跟踪:高精度跟踪与五次多项式轨迹规划,Matlab代码与Simulink模型联合仿真 ,基于二自由度动力学模型和Frenet坐标系的LQR车辆
- 基于C++的OpenCV卡尺找直线工具:全功能拖拽测量,附全套源码与详尽注释,基于C++的OpenCV卡尺找直线工具:全套源码解析及拖拽测量功能的实现与应用,基于c++的opencv卡尺卡尺找直线工具
- MATLAB实现手写体数字识别程序:万字文档详解,附带GUI界面与图像预处理功能,MATLAB实现手写体数字识别程序:万字文档详解,附带GUI界面与图像预处理功能,基于matlab的手写体数字识别程序
- 基于MATLAB的深度学习人脸识别图形界面系统,基于MATLAB的人脸识别图形用户界面(GUI)设计与实现,基于MATLAB的人脸识别gui ,基于MATLAB; 人脸识别; GUI,基于MATLAB
- 成熟锂离子电池管理系统BSM方案及充放电模组详解:PCB与原理图概览,成熟锂离子电池管理系统BSM方案及关键模组介绍:高效电池组充放电管理与单电池模组概览,成熟锂离子电池管理系统BSM方案,包括pcb
- 基于改进蚁群算法的多机器人路径规划算法优化研究:去除冗余点,实现平滑路径与实时动态调整,《基于改进蚁群算法与多机器人动态路径规划技术研究:去冗平滑全局局部路径优化算法实现及代码解析》,改进蚁群算法多机
- DSSDSDSDSDSSSSDSDV6
- amr测试文件,包含语音文件,解压密码1722
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
- 4
- 5
- 6
前往页