快速傅里叶变换

Python实现快速傅里叶变换(FFT)

匿名 (未验证) 提交于 2019-12-02 22:51:30
#!/usr/bin/env python3 # -*- coding: utf-8 -*- "" " Created on Thu May 24 21:00:47 2018 @author : luogan " "" import numpy as np from scipy.fftpack import fft,ifft import matplotlib.pyplot as plt import seaborn #采样点选择1400个,因为设置的信号频率分量最高为600赫兹,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400赫兹(即一秒内有1400个采样点,一样意思的) x =np.linspace( 0 , 1 , 1400 ) #设置需要采样的信号,频率分量有180,390和600 y = 7 *np . sin ( 2 *np .pi *180 *x ) + 2.8 *np . sin ( 2 *np .pi *390 *x )+ 5.1 *np . sin ( 2 *np .pi *600 *x ) yy=fft( y ) #快速傅里叶变换 yreal = yy.real # 获取实数部分 yimag = yy.imag # 获取虚数部分 yf= abs (fft( y )) # 取绝对值 yf1= abs (fft( y ))/len( x )

快速傅里叶变换模板

瘦欲@ 提交于 2019-12-02 20:28:30
模板题 看了很久, 还是不太懂 $fft$ 的原理orz, 但是也还好, 反正再难也是一个分治而已, 不用怕 存个板子, 以后肯定也还会用的到. 希望下次来的时候我已经懂了233 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <complex> #include <math.h> #define MAXN 3000010 #define cp complex<double> using namespace std; const double PI=acos(-1.0); int n,m,rev[MAXN],lim=1,bit; cp a[MAXN],b[MAXN]; int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} return x*f; } void FFT(cp *a,int inv){ for(int i=0;i<lim;i++) if(i<rev[i]) swap(a[i],a[rev[i]]); for(int

实序列快速傅里叶变换(一)

做~自己de王妃 提交于 2019-12-02 11:06:36
一、功能 计算实序列的快速傅里叶变换。 二、方法简介 实序列 \(x(n)\) 的离散傅立叶变换为 \[ X(k)=\sum_{n=0}^{N-1}x(n)W_{N}^{nk} \ , \ k=0,1,...,N-1 \] 上式可用复序列FFT算法进行计算。但考虑到 \(x(n)\) 是实数,为进一步提高计算效率,需要对按时间抽取的基2复序列FFT算法进行一定的修改。 如果序列 \(x(n)\) 是实数,那么其傅立叶变换 \(X(k)\) 一般是复数,但其实部是偶对称,虚部是奇对称,即 \(X(k)\) 具有如下共辄对称性: \(X(0)\) 和 \(X(N/2)\) 都是实数,且有 \[ X(k)=X^{*}(N-k) \ , \ 1 \leqslant k \leqslant \frac{N}{2} - 1 \] 在计算离散傅立叶变换时,利用这种共辄对称性,我们就可以不必计算与存储 \(X(k)(N/2 + 1 \leqslant k \leqslant N — 1)\) 以及 \(X(0)\) 和 \(X(N/2)\) 的虚部,而仅需计算 \(X(0)\) 到 \(X(N/2)\) 即可。此处我们选择的是计算 \(X(0)\) 到 \(X(N/4)\) 和 \(X(N/2)\) 到 \(X(3N/4)\) , 这样做可以恰好利用复序列FFT 算法的前 \((N/4)+1\)

分裂基快速傅里叶变换

时间秒杀一切 提交于 2019-12-02 06:34:09
一、功能 计算复序列的分裂基快速傅里叶变换。 二、方法简介 序列 \(x(n)(n=0,1,...,N-1)\) 的离散傅里叶变换定义为 \[ X(k)=\sum_{n=0}^{N-1}x(n)W_{N}^{nk}, \qquad k=0,1,...,N-1 \] 其中 \(W_{N}^{nk}=e^{-j\frac{2\pi nk}{N}}\) ,将 \(X(k)\) 按序号 \(k\) 的奇偶分成两组。当 \(k\) 为偶数时,进行基2频率抽取分解, \(X(k)\) 可表示为 \[ X(2k)=\sum_{n=0}^{N/2-1}[x(n)+x(n+\frac{N}{2})]W_{N}^{2nk} \ , \ k=0,1,...,\frac{N}{2}-1 \] 当 \(k\) 为奇数时进行基4 频率抽取分解,$ X(k)$可表示为 \[ \left\{\begin{matrix}X(4k+1)=\sum_{n=0}^{N/4-1}{[x(n)-x(n+\frac{N}{2})]-j[x(n+\frac{N}{4})-x(n+\frac{3N}{4})]}W_{N}^{n}W_{N}^{4nk}\\ X(4k+3)=\sum_{n=0}^{N/4-1}{[x(n)-x(n+\frac{N}{2})]+j[x(n+\frac{N}{4})-x(n+\frac{3N}{4})]

快速傅里叶变换

。_饼干妹妹 提交于 2019-12-02 00:13:24
一、功能 计算复序列的快速傅里叶变换。 二、方法简介 序列 \(x(n)(n=0,1,...,N-1)\) 的离散傅里叶变换定义为 \[ X(k)=\sum_{n=0}^{N-1}x(n)W_{N}^{nk}, \qquad k=0,1,...,N-11 \] 其中 \(W_{N}^{nk}=e^{-j\frac{2\pi nk}{N}}\) ,将序列 \(x(n)\) 按序号 \(n\) 的奇偶分成两组,即 \[ \left.\begin{matrix}\begin{align*}x_{1}(n)=&x(2n)\\ x_{2}(n)=&x(2n+1)\end{align*}\end{matrix}\right\} \qquad n=0,1,...,\frac{N}{2}-1 \] 因此, \(x(n)\) 的傅里叶变换可写成 \[ \begin{align*}X(k) &= \sum_{n=0}^{N/2-1}x(2n)W^{2nk}_{N} + \sum_{n=0}^{N/2-1}x(2n+1)W^{(2n+1)k}_{N}\\&= \sum_{n=0}^{N/2-1}x_{1}(n)W^{nk}_{N/2} + W_{N}^{k}\sum_{n=0}^{N/2-1}x_{2}(n)W^{nk}_{N/2}\end{align*} \] 由此可得 \(X(k)=X_{1}(k)