精华内容
下载资源
问答
  • DFT的matlab源代码fft-ifft 将numpy导入为np 导入cv2 从matplotlib导入pyplot作为plt img = cv2.imread('pic.jpg',0) dft = cv2.dft(np.float32(img),标志= cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft....
  • 带有内置函数的 FFT/IFFT 运算的 MATLAB 代码。 复合信号被视为输入信号。
  • fft_ifft_test.zip

    2019-05-24 16:55:25
    vivado 2018.3 环境下写的FFT/IFFT实现,主要是通过调用DDS IP核和FFT IP核实现信号的FFT/IFFT变换。这应该是最简单的实现方法了。
  • FPGA FFTIFFT)算法

    2021-01-29 16:28:00
    基于FPGA(ZYNQ)的FFTIFFT)算法,带实验报告,可用Modelsim仿真验证
  • C# fft_ifft

    2018-03-21 12:47:17
    根据网上资源实现的一维二维快速傅里叶变换fft ifft,,
  • fft & ifft

    2007-12-26 21:30:39
    fft and ifft matlab code
  • FFTIFFT算法的C程序实现
  • fft-ifft算法

    2012-12-24 10:10:03
    程序代码中主要是实现fftifft的算法。这是基于2的N次方的DIT的fft算法。
  • FFTIFFT频域信号处理研究
  • 定点化FFTIFFT

    热门讨论 2013-03-18 14:06:25
    代码是C语言编写的基2时间抽取的fftifft定点化函数,方便用于定点DSP处理。
  • C#实现FFTIFFT

    热门讨论 2015-01-04 10:29:00
    用C#实现的FFTIFFT类,方便初学者进行学习,也可直接在代码里使用
  • 一维的FFTIFFT代码

    2017-01-13 22:40:58
    一维的FFTIFFT计算代码。需要配合有蝶形算法的书看懂代码。C++/C
  • vivado fft/ifft 核的使用

    千次阅读 2019-05-28 17:00:43
    *在同时做fftifft的时候,尽量选择同一个ip核进行多次例化使用,通过assign s_axis_config_tdata=1/0设置fftifft模式 首先为FFT/IFFT核的设置,第一个页面Number of Channels表示输入通道个数,Transform ...

    *在同时做fft核ifft的时候,尽量选择同一个ip核进行多次例化使用,通过assign s_axis_config_tdata=1/0设置fft或ifft模式

    首先为FFT/IFFT核的设置,第一个页面Number of Channels表示输入通道个数,Transform Length位做FFT/IFFT的点数,Target clock为时钟,architecture choice为fft的模式,采用那种可自由选择,radix-4,2皆可。

     

    data format选择fixed point,scaling options如果不做截位的话使用unscaled即可,但是会导致输出的位数越来越大,如果选择block floating point的话输入多少位输出就是多少位,选择scale也可达到同样的目的,但是需要自己设置scale衰减多少,如果选择2048点的fft的话,scale因子为【101010101010】便不会溢出,勾选aresetn作为信号使能,XK_INDEX为输出fft的点数,一般来说XK_INDEX*fsample/FFTpoint便是当前点所代表的频率值。output ordering选择natural order。

    第三页的数值可自由选择,不会影响最终输出值。设置完毕后,在implement details界面观察输出端口对应位数

    s_axis_config_tdata:控制输入模式,进行fft/ifft以及衰减因子的设置,第0位为1fft,为0做ifft,高位用于scale因子的设置。

    s_axis_config_tvalid:拉高若干个时钟周期后归零,之后将s_axis_data_tvalid拉高

    s_axis_config_tready:s_axis_config_tvalid拉高两个时钟周期后,该口给1输出;

    s_axis_data_tready:s_axis_config_tvalid拉高两个时钟周期后,该口给1输出,ip核初始化完成,可进行数据输入必须进行赋值;

    s_axis_data_tvalid:拉高2048个周期,输入2048个数据进行fft;

    s_axis_data_tdata:输入32位数据,取低12位数据进行运算;

    s_axis_data_tlast:输入2048个数据后拉高,停止数据输入;

    做fft需要耗费的时钟周期计算如下s_axis_data_tlast- s_axis_data_tvalid

    ,在ip核中可看到:

    m_axis_data_tdata:高位为实部,低位为虚部,由于本程序在always内将值给fft_real端口,所以会延迟一个时钟周期,实际为41,fft_real为42;

    m_axis_data_tvalid:当fft结果输出时拉高,输出2048个点的数据后拉低;

    m_axis_data_tuser:输出fft的地址值,输出值*fs/N为对应频点;

    m_axis_data_tready:完成2048个点的fft后拉高一个时钟周期表示完成fft;

    event_frame_started:输入信号数据时拉高一个时钟周期;

    下面采用两中方式对ip核使用进行说明,

    第一种采用scale因子的设置方式

    尽量不采用文件读入数据进行fft和ifft的方式进行操作,因为fft核只能进行补码的运算,并且会扩大位数,matlab中fft/ifft算法与FPGA中不同,无法一一对应,会出错,所以采用fpga内部生成dds信号的方式进行程序的运行。

    本部分采用一个dds生成正余弦信号。cos(2*pi*f*t)-i*sin(2*pi*f*t)

    fft输出结果

    图1位fft后图像,可以看到在相应的频点有尖峰,图2位截位后的ifft波形,可以看到位5MHz,能够比较好的完成正逆fft运算。

    方法2:使用block floating point

    该种方法精度不如上述的高,相同精度需要更多的位数输入。可以看到ip核设置完成后直接输出与输入位数相同,本初采用16位的dds输出。

    https://download.csdn.net/download/daidai711/11200741

    使用该设置的输入位数要尽可能取高一些,否则ifft后图像畸变会很严重。

     

    展开全文
  • 使用FFT的时候先初始化kiss_fft_cfg,其中第二个参数0/1表示是做fft还是ifft kiss_fft_state = kiss_fft_alloc(nfft, 0, 0, 0); 构建输入参数 kiss_fft输入参数是复数,但是我们时域的数据为实数,所以需要构建等长...

    长时间没有使用kissfft有点忘记API的使用了,这里记录一下最最基本的使用。 FFT与iFFt

    FFT

    使用FFT的时候先初始化kiss_fft_cfg,其中第二个参数0/1表示是做fft还是ifft

    kiss_fft_state = kiss_fft_alloc(nfft, 0, 0, 0);
    

    构建输入参数

    kiss_fft输入参数是复数,但是我们时域的数据为实数,所以需要构建等长的复数参数,然后把时域信号赋值到real部分,image部分置0.

    iFFT

    kiss_fft_state = kiss_fft_alloc(nfft, 1, 0, 0);
    

    iFFT的时候,可能kissfft没有做scaling,所以结果需要除以N。

    最后的结果是输出复数的real部分。

    实例代码

    
    static kiss_fft_scalar rand_scalar(void) {
        kiss_fft_scalar s = (kiss_fft_scalar) ((rand() + 10) % 256);
        return s / 256.;
    }
    
    static void print_fft_result(kiss_fft_cpx *x, int n) {
        int l = 0;
        for (int i = 0; i < n; i++) {
            printf("(%4.4f+%4.4fi), ", x[i].r, x[i].i);
            if (l++ == 7) {
                l = 0;
                printf("\n");
            }
        }
        printf("\n");
    }
    
    void test_fft() {
        int i = 0;
        int nfft = 20;
        kiss_fft_cpx cin[nfft];
        kiss_fft_cpx cout[nfft];
        kiss_fft_cpx sout[nfft];
        kiss_fft_cfg kiss_fft_state;
    
        kiss_fft_scalar zero;
        memset(&zero, 0, sizeof(zero));
    
        for (i = 0; i < nfft; ++i) {
            cin[i].r = rand_scalar();
            cin[i].i = zero;
        }
        printf("\n");
    
        printf(" init data for kiss_fft (cin): \n");
        print_fft_result(cin, nfft);
    
        memset(cout, 0, sizeof(short) * nfft);
        memset(sout, 0, sizeof(short) * nfft);
    
        kiss_fft_state = kiss_fft_alloc(nfft, 0, 0, 0);
    
        kiss_fft(kiss_fft_state, cin, cout);
        kiss_fft_free(kiss_fft_state);
    
        printf(" results from kiss_fft (cout): \n");
        print_fft_result(cout, nfft);
    
        kiss_fft_state = kiss_fft_alloc(nfft, 1, 0, 0);
    
        for (i = 0; i < nfft; i++) {
            cout[i].r /= nfft;
            cout[i].i /= nfft;
        }
        // case A.
        kiss_fft(kiss_fft_state, cout, sout);
    
        // end case
        kiss_fft_free(kiss_fft_state);
    
        printf(" results from kiss_ifft (sout): \n");
        print_fft_result(sout, nfft);
        printf("\n");
    }
    
    int main(int argc, char *const argv[]) {
    
        test_fft();
    
        return 0;
    }
    

    结果如下:
    在这里插入图片描述

    展开全文
  • itk下FFTW的FFTIFFT.pdf

    2021-09-14 11:45:22
    itk下FFTW的FFTIFFT.pdf
  • C++实现任意点数的FFTIFFT(数字信号处理 FFT)。 包含复数类和FFT实现类,mainfft.cpp为实例程序。 数字信号处理 FFT
  • FFTIFFT公式记录

    2021-09-17 08:50:47
    FFTIFFT公式记录 在写论文的时候想使用IFFTFFT,然而找不到一个确定的公式,因此在此记录一下。公式如下: 特别值得注意的是,这里不论是k还是n,都是从0开始的。 在用matlab进行验证的时候要考虑到matlab是从1...

    FFT与IFFT公式记录


    在写论文的时候想使用IFFT和FFT,然而找不到一个确定的公式,因此在此记录一下。公式如下:
    在这里插入图片描述

    特别值得注意的是,这里不论是k还是n,都是从0开始的。
    在用matlab进行验证的时候要考虑到matlab是从1开始的,而公式是从0开始的。

    展开全文
  • 利用C语言实现FFTIFFT运算

    千次阅读 2019-10-31 22:46:34
    一、FFTIFFT算法实现 上述分别为FFTIFFT公式。下面首先讨论FFT的算法实现。本文采用输入逆序、输出顺序的FFT计算方法。**实质上就是在时域对x(n)进行“奇偶分类”、在频域上对X(k)进行“前后分类”。**值得...

    一、FFT算法理论

    FFT、IFFT
    上述分别为FFT、IFFT公式。下面首先讨论FFT的算法实现。
    本文采用输入逆序、输出顺序的FFT计算方法。实质上就是在时域对x(n)进行“奇偶分类”、在频域上对X(k)进行“前后分类”。 值得说明的是,这里的“奇”和“偶”是相对的概念,并不完全是通常我们所理解的“奇”和“偶”。下面将给出一个例子进行说明:
    FFT运算示例
    ·图中,总共可以分为 “三级” ,每一级包含若干 “蝶形计算单元”。每一个蝶形单元的结构如下:蝶形运算单元
    因此,进行FFT运算只需考虑三件事情。一、将输入序列倒序排列,也就是进行奇偶分类。二、实现最基本的蝶形计算单元。三、根据规律,划分出FFT运算的级数,并且确定出每一级中参与蝶形运算的数据分组。

    二、FFT运算的代码实现

    1. 输入倒序排列(奇偶分类)。事实上,将输入倒序排列就是进行了奇偶分类。如果FFT的点数为8,那么这8个数的二进制表示分别为000,001,010,011,100,101,110,111。进行二进制层面倒序排列就变为000,100,010,110,001,101,011,111;重新转变为十进制就是0,4,2,6,1,5,3,7。 上面的计算方式对人类来说是很方便的,但是对于电脑来说,效果并不是太好,因此需要另外发现一种规律。
    2. 输入奇偶分类(倒序排列)。上面已经提到,倒序排列实际上就是在进行奇偶分类,而进行奇偶分类对电脑来说会简单很多。总结1中提到的规律,三位二进制数可以理解为FFT运算的级数。我们可以发现,在倒序排列完成后,“偶数”总是排在“奇数”前面。 这里需要提出“偶中的偶”,“奇中的奇”的概念。即每次进行“余2”运算,结果是0的都排在前面。现在看来,电脑实现算法的方式就是每次进行“余2”运算,进行奇偶分类;然后进行“除2”运算,再进行“余2”运算,进行奇偶分类……直到最后排序完成。 实现代码如下:
    void reverse()		//输入倒序
    { 
    	complex temp;
    	char* flag = (char*)malloc(N * sizeof(char));	//用于标记是否被换过,若为1,则已经换过
    	int i, j, current_n, target_n;
    	for (i = 0;i < N;i++) {
    		flag[i] = 0;
    	}
    	for (i = 0;i < N;i++) {
    		current_n = i;
    		target_n = 0;
    		//获取两个互为倒序的标号,换种思路
    		for (j = 0;j < bits;j++) {
    			target_n = target_n + (int)((current_n % 2) * pow(2, bits - j - 1));
    			current_n /= 2;
    		}
    		current_n = i;
    		//对应标号值互换
    		if (current_n != target_n && flag[current_n] != 1) {
    			temp = x[current_n];
    			x[current_n] = x[target_n];
    			x[target_n] = temp;
    			flag[target_n] = 1;
    		}
    	}
    	free(flag);
    }
    

    说明:complex为自己定义的复数数据结构。再次强调,奇偶分类就是倒序排序。二者是一样的。

    1. 蝶形运算单元的实现。分析蝶形运算单元,两输入、两输出,因此蝶形运算单元需要注意的就是输入、输出采用同一片内存存储即可,也就是让输出数据覆盖输入数据,这样可以有效节约存储资源。
    void butterfly(int x1_point, int x2_point, complex wn)	//蝶形计算单元
    {
    	complex result1, result2, T;
    	T = multiplication(x[x2_point], wn);
    	result1 = add(x[x1_point], T);
    	result2 = sub(x[x1_point], T);
    
    	x[x1_point] = result1;
    	x[x2_point] = result2;
    }
    
    

    说明:上面multiplication、add、sub方法均为自己定义,wn为旋转因子。

    1. 进行单级FFT运算。需要注意的就是总结规律。总结出两对偶结点的“结点跨距”、“分组间隔”、“分组数”……有了这些才能够编写将参与蝶形运算的数据分类配对。
    void single_fft(int m)			//进行单级的fft运算
    {
    	//首先进行分组
    	int point_distance = (int)pow(2, m - 1);	//结点跨距
    	int group_distance = 2 * point_distance;	//分组间隔
    	int group_count = N / group_distance;		//分组数
    
    	int group_header = 0;
    
    	int x1, x2;								//参与计算两结点的标号
    	complex w;
    
    	int i, j;								//循环控制符
    	//分组
    	for (i = 0;i < group_count;i++) {
    		//获取一组的标号范围
    		group_header = i * group_distance;
    		//将每组分成两半,前一半均为x1,后一半均为x2
    		for (j = 0;j < group_distance / 2;j++) {
    			w = w_builder(m, j);
    			x1 = j + group_header;
    			x2 = x1 + point_distance;
    			butterfly(x1, x2, w);
    		}
    	}
    }
    
    1. 有了单级FFT运算以后,将每一级组合就可以实现FFT运算了。
    complex* fft(int fft_point, int xn_length, complex* xn)		//fft最终封装
    {
    	int i;
    	//初始化
    	fft_init(fft_point, xn_length, xn);
    	//输入倒序
    	reverse();
    	//fft运算
    	for (i = 1;i <= bits;i++) {
    		single_fft(i);
    	}
    	return x;
    }
    

    三、IFFT算法理论

    IFFT算法理论
    从上面的等式可以看出,括号里面的内容实际上就是FFT运算。也就是说只需要对输入、输出序列进行一定的处理,就可以利用刚刚已经做好的FFT算法实现IFFT的运算!

    四、IFFT运算的代码实现

    complex* ifft(int xk_length, complex* xk)		//ifft最终封装
    {
    	int i;
    	//对输入序列进行处理
    	ifft_init(xk_length, xk);
    	//套用fft算法
    	reverse();
    	for (i = 1;i <= bits;i++) {
    		single_fft(i);
    	}
    	//对输出序列进行处理
    	for (i = 0;i < N;i++) {
    		x[i] = conjugate(x[i]);		//求共轭
    		x[i].real /= N;
    		x[i].imaginary /= N;
    	}
    	return x;
    }
    

    五、总结

    本文也程序也考虑到了FFT自动补零问题的处理,大家可以参考完整代码(FFT、IFFT均验证正确)。FFT.zip

    展开全文
  • win 64下使用 fftw实现fftifft(demosource),demosource中fftw_plan_dft_r2c_1d为fft使用函数,fftw_plan_dft_c2r_1d为ifft使用函数。
  • MIMO-OFDM的FFT_IFFT处理器.pdf
  • c++ 实现FFTIFFT

    2015-03-28 14:34:07
    用c++ 实现傅里叶变换FFT和傅里叶逆变换IFFT
  • C语言实现FFT or IFFT

    2021-03-04 18:58:40
    C语言实现FFT or IFFTmatlab实现仿真结果C语言实现仿真结果 matlab实现 close all; clear all; clc; count=2; y=[1+2i,2+3i]; y_FFT=fft(y,count); % 傅里叶变换 P=abs(y_FFT)/count; % 幅度谱 u=max(P); % 得到...
  • FFTIFFT的C语言实现

    2015-01-29 17:50:00
    对照西电版本的《数字信号处理》,实现了FFTIFFT的运算,懂一点原理的都能看懂该函数,经过测试是可以用的。
  • 二维FFTIFFT,c语言实现

    千次阅读 2014-11-25 19:38:02
    学习DIP第6天    完整内容迁移至 http://www.face2ai.com/DIP-2-4-二维FFT-IFFT-c语言实现/ http://www.tony4ai.com/DIP-2-4-二维FFT-IFFT-c语言实现/
  • FFT/IFFT 变换 C++源代码

    热门讨论 2011-11-29 15:15:46
    FFTIFFT变换 多文件调用 采用了C++特有的类,编写了复数类:complex
  • FFT/IFFT的完整VC实现

    热门讨论 2010-10-30 17:22:28
    用VC编写了FFTIFFT函数,并用了不同的数据输入格式,还可以加窗、模与FFTSHIFT功能
  • FFT/IFFT 数字变换 C语言开发 VC环境下运行
  • FFTIFFT

    千次阅读 2020-09-20 22:57:55
    FFT FFT是DFT的快速算法,可以将一个信号从时域变换到频域。 有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。 另外,FFT可以将一个...
  • 为了缩短捕获时间,提高对微弱信号的检测能力,利用FFT/IFFT方法代替传统时域串行相干累积,相干累积之后的处理,提出采用各个相干累积值相乘取模的方法提升检测量,最后进行门限比较。该方法在提高信噪比的同时且...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,360
精华内容 2,944
关键字:

fft求ifft