我们一般意义上学习的FFT都是基于

的,即FFT中的单位根我们取的是

,但是在某些情况下我们需要

上的FFT和IFFT变换。

1、直接想到的思路是把

的根替换成

的根。

解法:

的根可以使用

的2n个根中的奇数次根得到,即

,但是这种做法在FFT运算中可行,在IFFT逆运算下则不可行,我们一般的IFFT运算时把

替换成

,并且最后除以一个n得到IFFT运算的结果。如下

但是我们需要在

上做IFFT变换的时候不能简单的把根替换成

,因为根据FFT的点值多项式的形式,只有根是

的形式的时候,才可以使用

因为根是

 的形式的时候,

上IFFT求逆的时候,

不成立,直接替换根的做法是不可行的。

2、新的做法,扩展到2n次

,

,

,f(x)是n次多项式。

令:

则有:

FFT计算步骤:

(1)计算

(2)此时F(x)是m次方的,计算F(x)在

上的FFT(就是以前一般形式的FFT)

(3)输出F(x) 的FFT变换之后的奇数项,即为f(x)在

上的FFT结果

IFFT计算步骤:

是f(x)在

上的FFT结果

(1)将

扩展,使其奇数项为

,偶数项为0,扩展到2n次

(2)使用2n阶IFFT求出扩展后多项式的逆变换的值

(3)设(2)中逆变换对应的扩展多项式逆变换为

,令

还原出来的n次

大致整体思路就是扩展到2n次,然后使用

上的FFT和IFFT求出

上的FFT和IFFT变换

下面贴C语言代码:

#include "pch.h"

#define _CRT_SECURE_NO_WARNINGS

#include "stdlib.h"

#include "math.h"

#include "stdio.h"

#define N 8

#define MAXN 100

#define Pi 3.1415927 //定义圆周率Pi

#define LEN sizeof(struct Compx) //定义复数结构体大小

//-----定义复数结构体-----------------------

typedef struct Compx

{

double real;

double imag;

}Compx;

//-----复数乘法运算函数---------------------

struct Compx mult(struct Compx b1, struct Compx b2)

{

struct Compx b3;

b3.real = b1.real*b2.real - b1.imag*b2.imag;

b3.imag = b1.real*b2.imag + b1.imag*b2.real;

return(b3);

}

//-----复数减法运算函数---------------------

struct Compx sub(struct Compx a, struct Compx b)

{

struct Compx c;

c.real = a.real - b.real;

c.imag = a.imag - b.imag;

return(c);

}

//-----复数加法运算函数---------------------

struct Compx add(struct Compx a, struct Compx b)

{

struct Compx c;

c.real = a.real + b.real;

c.imag = a.imag + b.imag;

return(c);

}

void fft(Compx *a, int n, int inv);

void fft_1(Compx *a, int n, int inv);

int main()

{

int i;

int x[N] = { 0 }, y[N] = { 0 };

printf("\nN=%d\n", N);

printf("\n输入两个多项式的系数,输入系数为N多项式长度的一半\n");

printf("\n输入第一个多项式的系数\n");

for (i = 0; i < N / 2; i++)

{

scanf("%d", &x[i]);

}

struct Compx * a = (struct Compx *)malloc(N*LEN);//为结构体分配存储空间

struct Compx * b = (struct Compx *)malloc(N*LEN);

struct Compx * c = (struct Compx *)malloc(N*LEN);

struct Compx * F = (struct Compx *)malloc(2*N*LEN);

//初始化=======================================

printf("\na多项式初始化:\n");

for (i = 0; i < N; i++)

{

a[i].real = x[i];

a[i].imag = 0;

printf("%.4f ", a[i].real);

printf("+%.4fj ", a[i].imag);

printf("\n");

}

/*--------------x^2n-1=0的解法----start----------*/

printf("\n--------------------------FFT---------------------------------\n");

int m = 2 * N;

int n = N;

double f[2 * N] = { 0 };

for (i = 0; i < N; i++) {

f[i] = 0.5 * x[i];

}

for (i = N; i < 2*N; i++) {

f[i] = -0.5 * x[i-N];

}

printf("\nf多项式初始化:\n");

for (i = 0; i < 2*N; i++)

{

F[i].real = f[i];

F[i].imag = 0;

printf("%.4f ", F[i].real);

printf("+%.4fj ", F[i].imag);

printf("\n");

}

fft(F, m, 1);

printf("\nF多项式FFT计算结果:\n");

for (i = 0; i < 2*N; i++)

{

printf("%.4f ", F[i].real);

printf("+%.4fj ", F[i].imag);

printf("\n");

}

for (i = 0; i < N; i++ ) {

a[i] = F[2 * i + 1];

}

printf("\n--------------------------IFFT---------------------------------\n");

fft(F, m, -1);

for (i = 0; i < m; i++) {

F[i].real = F[i].real / m;

F[i].imag = F[i].imag / m;

}

printf("\nF多项式IFFT计算结果:\n");

for (i = 0; i < 2 * N; i++)

{

printf("%.4f ", F[i].real);

printf("+%.4fj ", F[i].imag);

printf("\n");

}

//F(x)的低次

double temp_low[N] = { 0 };

double temp_high[N] = { 0 };

for (i = 0; i < N; i++)

{

temp_low[i] = F[i].real;

}

for (i = N; i < 2*N; i++)

{

temp_high[i-N] = F[i].real;

}

double res[N] = { 0 };

for (i = 0; i < N; i++)

{

res[i] = temp_low[i] - temp_high[i];

}

printf("\nIFFT计算结果:\n");

for (i = 0; i < N; i++)

{

printf("%.4f", res[i]);

printf("\n");

}

/*--------------x^2n+1=0的解法----end----------*/

//fft_1(a, N, 1);

printf("\n第一个多项式FFT计算结果:\n");

for (i = 0; i < N; i++)

{

printf("%.4f ", a[i].real);

printf("+%.4fj ", a[i].imag);

printf("\n");

}

return 0;

}

//x^n+1=0的FFT形式

void fft_1(Compx *a, int n, int inv) {

if (n == 1)return;

int mid = n / 2;

static Compx b[MAXN];

int i;

for (i = 0; i < mid; i++) {

b[i] = a[i * 2];

b[i + mid] = a[i * 2 + 1];

}

for (i = 0; i < n; i++)

a[i] = b[i];

fft(a, mid, inv);

fft(a + mid, mid, inv);//分治

for (i = 0; i < mid; i++)

{

Compx x;

x.real = cos(2 * Pi*(2*i+1) / (2*n));

x.imag = inv * sin(2 * Pi*(2 * i + 1) / (2*n));

b[i] = add(a[i], mult(x, a[i + mid]));

b[i + mid] = sub(a[i], mult(x, a[i + mid]));

}

for (i = 0; i < n; i++)

a[i] = b[i];

}

//x^n-1=0的FFT形式

void fft(Compx *a, int n, int inv) {

if (n == 1)return;

int mid = n / 2;

static Compx b[MAXN];

int i;

for (i = 0; i < mid; i++) {

b[i] = a[i * 2];

b[i + mid] = a[i * 2 + 1];

}

for (i = 0; i < n; i++)

a[i] = b[i];

fft(a, mid, inv);

fft(a + mid, mid, inv);//分治

for (i = 0; i < mid; i++)

{

Compx x;

x.real = cos(2 * Pi*i / n);

x.imag = inv * sin(2 * Pi*i / n);

b[i] = add(a[i], mult(x, a[i + mid]));

b[i + mid] = sub(a[i], mult(x, a[i + mid]));

}

for (i = 0; i < n; i++)

a[i] = b[i];

}

c代码实现 ifft运算_X^n+1=0上的FFT和IFFT(基2)——C语言实现相关推荐

  1. c语言ifft,用于ARM上的FFT与IFFT源代码-C语言

    /******************************************************************************* ** 程序名称:快速傅里叶变换(FFT ...

  2. 在ADSP21489上使用FFT和IFFT库完整源码--分析窗为矩形窗

    时隔8年再次重新在21489上重新整理此功能,这次是完整的源码,重新把工程书写了搭建了一遍 再次编辑又有新的心得,学到了当初不曾了解全面的知识点 1.ifft后对信号的重建问题 2.调试出错问题 /* ...

  3. C语言实现的FFT与IFFT源代码,不依赖特定平台

    目录 源码 FFT.c FFT.h 使用方法 初始化 输入数据 FFT 快速傅里叶变换 解算FFT结果 使用python绘制FFT波形 IFFT 快速傅里叶逆变换 解算IFFT结果 Windows 1 ...

  4. c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言

    FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...

  5. c代码实现 ifft运算_2D-FFT及IFFT(C语言实现(转载)

    前面编过2D-FFT的程序,现在把2D-IFFT的程序整合到一起,便于后面做图像变换反变换使用. FFT与IFFT有如下关系: 相应的2D-FFT与2D-IFFT的关系如下: 所以可以利用一个FFT核 ...

  6. c代码实现 ifft运算_月光软件站 - 编程文档 - 其他语言 - 时间抽选基2FFT及IFFT算法C语言实现...

    正在学数字信号处理,感觉上学期信号与系统学得不扎实,因为当时只是死记公式,这学期数信老师提倡动手实践,觉得自己在编程中对公式理解得更加深刻了. 以下是我写的FFT,欢迎指教. /*时间抽选基2FFT及 ...

  7. C语言实现 IFFT 运算

    参考 <C>C语言实现FFT算法_杨贵安的博客-CSDN博客_c语言 fft 实现了 fft 运算: 如果要实现 ifft 运算,只需要在输入和输出时取共轭就好了,故 ifft 的 C 语 ...

  8. C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)

    本次实验中在Microsoft Visual Studio 2010环境下编写,实现FFT和IFFT,并用MATLAB编写显示的结果,两者相对比,进行验证. #include "stdafx ...

  9. vivado实现FFT和IFFT信号处理

    一,FFT的物理意义 FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原 ...

最新文章

  1. Asp.Net基础 - 4.ASP.Net揭秘之Input版自增 + 5.ViewState初探
  2. Linux 在一个命令行上执行多个命令
  3. IOS atomic与nonatomic,assign,copy与retain的定义和区别
  4. python 遍历对象_python js对象的遍历
  5. 后台json返回给ajax,Ajax 如何 得到后台返回 的json数据,正确的格式应该如何去写?...
  6. pg加密扩展的安装_PHP7安装已废弃的对称加密扩展mcrypt记录
  7. 人力资源管理系统erp
  8. 2022 star*CTF-Writeup
  9. 2022华为春招面试经历
  10. 【计算机基础】HTTP 超文本传输协议
  11. SEO采集系统-SEO采集工具自动采集伪原创发布
  12. c软件查表获得电量代码_energy.c 源代码在线查看 - 基于单片机的多费率电能表源程序 资源下载 虫虫电子下载站...
  13. C语言公交车线路信息查询系统
  14. C51实现时钟12MHz,使用定时器T1的方式1定时20mS ,做一个时分秒的电子钟。
  15. 电容笔和触控笔哪个好?非常值得入手的平价电容笔推荐
  16. 简易社团管理系统(jsp+servlet+三件套+未完成)
  17. gtx1050ti和gtx1050的区别
  18. 地震偏移成像matlab,地震偏移成像基本原理概述.ppt
  19. java计算机毕业设计基于ssm的汽车租赁出租系统(源代码+数据库+Lw文档)
  20. 挂牌、摘牌、停牌与复牌

热门文章

  1. 解决mysql 服务无法启动问题:Can't find messagefile 'D:\ ools\mysql-5.6.25-winx64\share\errmsg.sys'...
  2. python应用程序无法正常启动0xc000007b_应用程序无法正常启动0xc000007b解决方法
  3. SAP S4HANA1610/Fiori安装过程全记录
  4. 500. Keyboard Row
  5. 局域网内VSS无法连接的一个“恶心他妈给恶心开门”的问题
  6. ROCKET PROPULSION ELEMENTS——DEFINITIONS AND FUNDAMENTALS笔记
  7. Matlab柱状图 不同颜色
  8. 基于Java+Swing+Mysql员工信息管理系统
  9. Android USB串口打印结账单小票
  10. 名帖358 文天祥 草书《谢昌元座右自警辞》