傅里叶变换是一种将信号从时域转换到频域的算法,可以用于信号处理、图像处理等领域。下面是一个用C语言实现傅里叶变换的例子。

#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846

// 复数结构体
typedef struct {
    double re;  // 实部
    double im;  // 虚部
} complex;

// 求两个复数的乘积
complex c_mul(complex a, complex b) {
    complex c;
    c.re = a.re * b.re - a.im * b.im;
    c.im = a.re * b.im + a.im * b.re;
    return c;
}

// 求两个复数的和
complex c_add(complex a, complex b) {
    complex c;
    c.re = a.re + b.re;
    c.im = a.im + b.im;
    return c;
}

// 傅里叶变换实现
void fft(complex *x, int n) {
    if (n <= 1) {
        return;
    }
    // 分别对偶数项和奇数项做傅里叶变换
    complex even[n/2], odd[n/2];
    for (int i = 0; i < n/2; i++) {
        even[i] = x[2*i];
        odd[i] = x[2*i+1];
    }
    fft(even, n/2);
    fft(odd, n/2);
    // 计算每个频率分量的值
    for (int k = 0; k < n/2; k++) {
        complex t = c_mul(odd[k], (complex){cos(-2*PI*k/n), sin(-2*PI*k/n)});
        x[k] = c_add(even[k], t);
        x[k+n/2] = c_add(even[k], c_mul(t, (complex){1, -1}));
    }
}

int main() {
    int n = 8;
    complex x[n];
    // 初始化输入信号
    for (int i = 0; i < n; i++) {
        x[i].re = sin(2*PI*i/8);
        x[i].im = 0;
    }
    // 傅里叶变换
    fft(x, n);
    // 输出频域表示
    for (int i = 0; i < n; i++) {
        printf('%g + %gi
', x[i].re, x[i].im);
    }
    return 0;
}

这个例子实现了一个递归的傅里叶变换算法,通过对输入信号逐层分治,最终计算出每个频率分量的值。在实际使用中,还需要对结果进行归一化和进行逆变换等操作。

C语言实现傅里叶变换算法详解

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

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