c代码实现 ifft运算_X^n+1=0上的FFT和IFFT(基2)——C语言实现
我们一般意义上学习的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语言实现相关推荐
- c语言ifft,用于ARM上的FFT与IFFT源代码-C语言
/******************************************************************************* ** 程序名称:快速傅里叶变换(FFT ...
- 在ADSP21489上使用FFT和IFFT库完整源码--分析窗为矩形窗
时隔8年再次重新在21489上重新整理此功能,这次是完整的源码,重新把工程书写了搭建了一遍 再次编辑又有新的心得,学到了当初不曾了解全面的知识点 1.ifft后对信号的重建问题 2.调试出错问题 /* ...
- C语言实现的FFT与IFFT源代码,不依赖特定平台
目录 源码 FFT.c FFT.h 使用方法 初始化 输入数据 FFT 快速傅里叶变换 解算FFT结果 使用python绘制FFT波形 IFFT 快速傅里叶逆变换 解算IFFT结果 Windows 1 ...
- c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言
FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...
- c代码实现 ifft运算_2D-FFT及IFFT(C语言实现(转载)
前面编过2D-FFT的程序,现在把2D-IFFT的程序整合到一起,便于后面做图像变换反变换使用. FFT与IFFT有如下关系: 相应的2D-FFT与2D-IFFT的关系如下: 所以可以利用一个FFT核 ...
- c代码实现 ifft运算_月光软件站 - 编程文档 - 其他语言 - 时间抽选基2FFT及IFFT算法C语言实现...
正在学数字信号处理,感觉上学期信号与系统学得不扎实,因为当时只是死记公式,这学期数信老师提倡动手实践,觉得自己在编程中对公式理解得更加深刻了. 以下是我写的FFT,欢迎指教. /*时间抽选基2FFT及 ...
- C语言实现 IFFT 运算
参考 <C>C语言实现FFT算法_杨贵安的博客-CSDN博客_c语言 fft 实现了 fft 运算: 如果要实现 ifft 运算,只需要在输入和输出时取共轭就好了,故 ifft 的 C 语 ...
- C语言实现FFT和IFFT,并与MATLAB编写显示的结果相对比,进行验证(蝶形运算)
本次实验中在Microsoft Visual Studio 2010环境下编写,实现FFT和IFFT,并用MATLAB编写显示的结果,两者相对比,进行验证. #include "stdafx ...
- vivado实现FFT和IFFT信号处理
一,FFT的物理意义 FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原 ...
最新文章
- Asp.Net基础 - 4.ASP.Net揭秘之Input版自增 + 5.ViewState初探
- Linux 在一个命令行上执行多个命令
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- python 遍历对象_python js对象的遍历
- 后台json返回给ajax,Ajax 如何 得到后台返回 的json数据,正确的格式应该如何去写?...
- pg加密扩展的安装_PHP7安装已废弃的对称加密扩展mcrypt记录
- 人力资源管理系统erp
- 2022 star*CTF-Writeup
- 2022华为春招面试经历
- 【计算机基础】HTTP 超文本传输协议
- SEO采集系统-SEO采集工具自动采集伪原创发布
- c软件查表获得电量代码_energy.c 源代码在线查看 - 基于单片机的多费率电能表源程序 资源下载 虫虫电子下载站...
- C语言公交车线路信息查询系统
- C51实现时钟12MHz,使用定时器T1的方式1定时20mS ,做一个时分秒的电子钟。
- 电容笔和触控笔哪个好?非常值得入手的平价电容笔推荐
- 简易社团管理系统(jsp+servlet+三件套+未完成)
- gtx1050ti和gtx1050的区别
- 地震偏移成像matlab,地震偏移成像基本原理概述.ppt
- java计算机毕业设计基于ssm的汽车租赁出租系统(源代码+数据库+Lw文档)
- 挂牌、摘牌、停牌与复牌
热门文章
- 解决mysql 服务无法启动问题:Can't find messagefile 'D:\	ools\mysql-5.6.25-winx64\share\errmsg.sys'...
- python应用程序无法正常启动0xc000007b_应用程序无法正常启动0xc000007b解决方法
- SAP S4HANA1610/Fiori安装过程全记录
- 500. Keyboard Row
- 局域网内VSS无法连接的一个“恶心他妈给恶心开门”的问题
- ROCKET PROPULSION ELEMENTS——DEFINITIONS AND FUNDAMENTALS笔记
- Matlab柱状图 不同颜色
- 基于Java+Swing+Mysql员工信息管理系统
- Android USB串口打印结账单小票
- 名帖358 文天祥 草书《谢昌元座右自警辞》