#include
#define L 16 // 定义数组f的长度为16 #define N 256 // 定义采样点数为256
double t1[N], t2[N]; // 定义两个长度为256的浮点数数组t1和t2,用于存储采样数据
void fft(double *x, double *y) // 傅里叶变换函数,接收两个指向浮点数数组的指针 {
int i, j, k; // 循环计数器
double c, s, tr, ti; // 中间变量,用于存储计算结果
double angle; // 角度值,用于计算cos和sin值
for (i = 0; i < N; i++) { // 循环N次,计算每一个频率分量的值
y[i] = 0; // 将y数组初始化为0
angle = -2.0 * M_PI * i / N; // 计算角度值
for (j = 0; j < N; j++) { // 循环N次,计算每一个采样点在该频率分量下的贡献
c = cos(j * angle); // 计算cos值
s = sin(j * angle); // 计算sin值
tr = x[j] * c - y[j] * s; // 计算实部
ti = x[j] * s + y[j] * c; // 计算虚部
y[i] += tr; // 将该采样点在该频率分量下的贡献加入y数组中
}
}
}
int main() {
int i; // 循环计数器
double f[L]; // 定义一个长度为L的浮点数数组f,用于存储傅里叶变换后的结果
double V; // 定义一个浮点数V,用于存储计算得到的流速值
// 在这里读取t1和t2的采样数据
fft(t1, f); // 对t1数组进行傅里叶变换,结果存储在f数组中
// 计算傅里叶变换后的频率
for (i = 0; i < L; i++) { // 循环L次,计算前L个频率分量的幅值
f[i] = f[i] * f[i] / (N * N); // 计算幅值
f[i] = sqrt(f[i]); // 取平方根,得到幅度
}
// 利用频率计算流速
V = (f[2] - f[1]) / (2 * L * 2e-6); // 根据公式计算流速
printf("The flow speed is %.2f m/s\n", V); // 输出计算得到的流速值,保留两位小数
return 0; // 返回0,表示程序正常结束
}