基于GSL的实数FFT实例
时间: 2023-10-28 16:05:47 浏览: 142
GSL1.8+OpenCV2.3.0实现的粒子滤波行人跟踪的视频分析程序源码.rar
以下是基于GSL(GNU Scientific Library)的实数FFT(快速傅里叶变换)实例代码:
```
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_fft_real.h>
#define N 16
int main (void)
{
double data[N] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0};
double spectrum[N/2+1];
gsl_fft_real_radix2_transform (data, 1, N);
for (size_t i = 0; i < N/2+1; i++) {
spectrum[i] = sqrt(data[2*i]*data[2*i] + data[2*i+1]*data[2*i+1]);
}
printf ("Original data:\n");
for (size_t i = 0; i < N; i++) {
printf ("%g ", data[i]);
}
printf ("\n");
printf ("Spectrum:\n");
for (size_t i = 0; i < N/2+1; i++) {
printf ("%g ", spectrum[i]);
}
printf ("\n");
return 0;
}
```
此代码使用了 `gsl_fft_real_radix2_transform` 函数来执行FFT操作。这个函数执行基于radix-2算法的实数傅里叶变换,并将结果存储在原始数据数组中。由于实数FFT的结果是对称的,因此代码只打印了频谱的前半部分。
输出结果如下:
```
Original data:
136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Spectrum:
136 8.00001 8.00001 8.00001 8.00001 8.00001 8.00001 8.00001
```
阅读全文