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;
}

代码解释

  1. 头文件包含: stdio.h 用于输入输出操作, stdlib.h 用于内存分配, math.h 用于数学运算。
  2. PI 常量: 定义圆周率常数。
  3. dft 函数: 实现离散傅里叶变换的核心函数。函数接受四个参数:
    • x_re, x_im: 输入信号的实部和虚部。
    • y_re, y_im: 输出信号的实部和虚部。
    • N: 信号的采样点数。
  4. main 函数:
    • 获取用户输入的采样点数。
    • 动态分配内存用于存储输入和输出信号的实部和虚部。
    • 获取用户输入的信号采样值,并将其存储在 x_re 数组中,虚部初始化为 0。
    • 调用 dft 函数计算信号的 DFT。
    • 输出 DFT 结果。
    • 释放动态分配的内存。

总结

本代码示例展示了如何使用 C 语言在 Linux 环境下实现离散傅里叶变换。该示例代码可以作为学习 DFT 的基础,并可用于进一步的信号处理应用。

注意: 此代码示例仅包含 DFT 的基本实现。在实际应用中,可能需要考虑使用更高级的算法来提高效率,例如快速傅里叶变换 (FFT)。

C语言实现离散傅里叶变换 (DFT) - Linux 代码示例

原文地址: https://www.cveoy.top/t/topic/oT1F 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录