[MM32生态] C语言实现FFT

[复制链接]
2104|1
 楼主| 51xlf 发表于 2024-4-21 18:15 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. void bitreverse(float *x, int N) {
  5.     int i, j, k;
  6.     for (i = 0; i < N; i++) {
  7.         k = i;
  8.         for (j = 0; j < log2(N); j++) {
  9.             if (k & (N >> 1))
  10.                 k = (k ^ (N >> 1)) >> 1;
  11.             else
  12.                 k = k >> 1;
  13.         }
  14.         if (k > i) {
  15.             float temp = x[i];
  16.             x[i] = x[k];
  17.             x[k] = temp;
  18.         }
  19.     }
  20. }

  21. void fft(float *x, int N) {
  22.     bitreverse(x, N);

  23.     int k = N, n, m, i, j;
  24.     for (n = 1; n < N; n = n * 2) {
  25.         float u1 = 1.0, u2 = 0.0;
  26.         for (m = n / 2; m > 0; m = m / 2) {
  27.             for (i = 0; i < k; i = i + 2 * n) {
  28.                 for (j = 0; j < n; j++) {
  29.                     float t1 = x[i + j + n], t2 = x[i + j];
  30.                     x[i + j] = t2 + u2 * t1;
  31.                     x[i + j + n] = t2 - u2 * t1 + u1 * t1;
  32.                     u1 = u1 * u1 - u2 * u2;
  33.                     u2 = 2.0 * u1 * u2;
  34.                 }
  35.             }
  36.             u1 = 1.0;
  37.             u2 = 0.0;
  38.         }
  39.         k = k / 2;
  40.     }
  41. }

  42. int main() {
  43.     int N = 8;
  44.     float x[N] = {1, 0, -1, 0, 1, 0, -1, 0};

  45.     fft(x, N);

  46.     for (int i = 0; i < N; i++) {
  47.         printf("%f + %fi\n", creal(x[i]), cimag(x[i]));
  48.     }

  49.     return 0;
  50. }


zhengshuai888 发表于 2024-4-21 19:04 来自手机 | 显示全部楼层
在交流信号测量中会用到FFT
您需要登录后才可以回帖 登录 | 注册

本版积分规则

551

主题

9967

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部