快速傅里叶变换(FFT)c语言实现
生活随笔
收集整理的這篇文章主要介紹了
快速傅里叶变换(FFT)c语言实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??快速傅里葉變換(FFT)c語言實現:(參考:FFT多種編程語言實現)。注意:輸入數據個數必須為2的n次方,數據不夠可以用0補齊。
#include <stdio.h> #include <math.h> #include <stdlib.h> #define PI 3.14159265358979typedef struct Complex {double real;double image; } CPLX;void _fft(CPLX buf[], CPLX out[], int n, int step) {int i;CPLX t;double a, b, c, d, theta;if (step < n) {_fft(out, buf, n, step * 2);_fft(out + step, buf + step, n, step * 2);for (i = 0; i < n; i += 2 * step) {theta = -PI * i / n;a = cos(theta);b = sin(theta);c = out[i + step].real;d = out[i + step].image;t.real = a * c - b * d;t.image = b * c + a * d;buf[i / 2].real = out[i].real + t.real;buf[i / 2].image = out[i].image + t.image;buf[(i + n) / 2].real = out[i].real - t.real;buf[(i + n) / 2].image = out[i].image - t.image;}} }int fft(CPLX buf[], int n) {int i;CPLX *out = (CPLX *)malloc(n * sizeof(CPLX));if (out == NULL){return 0;}for (i = 0; i < n; i++){out[i].real = buf[i].real;out[i].image = buf[i].image;}_fft(buf, out, n, 1);free(out);out = NULL;return 1; }int main() {#define COUNT 8CPLX buf[COUNT] = { {1.0, 0.0}, {1.0, 0.0}, {1.0, 0.0}, {1.0, 0.0},{0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0} ,{0.0, 0.0} }; //實向量[1, 1, 1, 1, 0, 0, 0, 0]fft(buf, COUNT);for (int i = 0; i < COUNT; i++){if (buf[i].image >= 0.0){printf("%.4f + %.4fi\n", buf[i].real, buf[i].image);}else{printf("%.4f - %.4fi\n", buf[i].real, fabs(buf[i].image));}}return 0; }??計算結果與matlab的完全一致。
總結
以上是生活随笔為你收集整理的快速傅里叶变换(FFT)c语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能 2. 图像识别
- 下一篇: MATLAB中clc命令详解