C语言实现离散傅里叶变换 (DFT) - Linux 代码示例
C语言实现离散傅里叶变换 (DFT) - Linux 代码示例
本文将提供一个使用 C 语言在 Linux 环境下实现离散傅里叶变换 (DFT) 的代码示例。DFT 是一个将时域信号转换为频域信号的数学工具,在信号处理、图像处理等领域有着广泛的应用。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979323846
void dft(double *x_re, double *x_im, double *y_re, double *y_im, int N) {
int k, n;
double w_re, w_im, s_re, s_im;
for (k = 0; k < N; k++) {
s_re = 0.0;
s_im = 0.0;
for (n = 0; n < N; n++) {
w_re = cos(2 * PI * n * k / N);
w_im = -sin(2 * PI * n * k / N);
s_re += x_re[n] * w_re - x_im[n] * w_im;
s_im += x_re[n] * w_im + x_im[n] * w_re;
}
y_re[k] = s_re;
y_im[k] = s_im;
}
}
int main() {
int N, k;
double *x_re, *x_im, *y_re, *y_im;
printf("Enter the number of samples: ");
scanf("%d", &N);
x_re = (double *) malloc(N * sizeof(double));
x_im = (double *) malloc(N * sizeof(double));
y_re = (double *) malloc(N * sizeof(double));
y_im = (double *) malloc(N * sizeof(double));
printf("Enter the samples:\n");
for (k = 0; k < N; k++) {
scanf("%lf", &x_re[k]);
x_im[k] = 0.0;
}
dft(x_re, x_im, y_re, y_im, N);
printf("The DFT result is:\n");
for (k = 0; k < N; k++) {
printf("%d: %lf + %lfi\n", k, y_re[k], y_im[k]);
}
free(x_re);
free(x_im);
free(y_re);
free(y_im);
return 0;
}
代码解释
- 头文件包含:
stdio.h用于输入输出操作,stdlib.h用于内存分配,math.h用于数学运算。 - PI 常量: 定义圆周率常数。
- dft 函数: 实现离散傅里叶变换的核心函数。函数接受四个参数:
x_re,x_im: 输入信号的实部和虚部。y_re,y_im: 输出信号的实部和虚部。N: 信号的采样点数。
- main 函数:
- 获取用户输入的采样点数。
- 动态分配内存用于存储输入和输出信号的实部和虚部。
- 获取用户输入的信号采样值,并将其存储在
x_re数组中,虚部初始化为 0。 - 调用
dft函数计算信号的 DFT。 - 输出 DFT 结果。
- 释放动态分配的内存。
总结
本代码示例展示了如何使用 C 语言在 Linux 环境下实现离散傅里叶变换。该示例代码可以作为学习 DFT 的基础,并可用于进一步的信号处理应用。
注意: 此代码示例仅包含 DFT 的基本实现。在实际应用中,可能需要考虑使用更高级的算法来提高效率,例如快速傅里叶变换 (FFT)。
原文地址: https://www.cveoy.top/t/topic/oT1F 著作权归作者所有。请勿转载和采集!