numpy.fft 实现 czt (Chirp Z-transform)
numpy.fft 实现 czt (Chirp Z-transform)
动机
如果对L2(R)L^2(\R)L2(R)上做Fourier变换,直接用离散FFT是不行的。需要用CZT。用于数值计算的numpy没有提供CZT,需要重新实现。本文用FFT实现CZT。
f^(ω)=∫Rf(x)e−2πiωxdx∼∫[a,b]f(x)e−2πiωxdx,−a,b≫1∼b−aN(∑l=0N−1f(lN)e−2πiω(a+(b−a)l/N)+f(b)e−2πiωb−f(a)e−2πiωa2)=b−aNe−2πiωa(∑l=0N−1f(lN)e−2πi(b−a)ωl/N+f(b)e2πiω(a−b)−f(a)2)⟹f^(c+kd−cM)=b−aNe−2πia(c+kd−cM)(∑l=0N−1f(lN)e−2πib−aNcle−2πi(b−a)(d−c)MNkl+...)=b−aNe−2πia(c+kd−cM)(CZT({fl},M,e−2πi(b−a)(d−c)MN,e2πib−aNc)+...)\hat{f}(\omega)=\int_\R f(x)e^{-2\pi i\omega x} \mathrm{d}x\\ \sim \int_{[a, b]} f(x)e^{-2\pi i\omega x} \mathrm{d}x, -a, b\gg 1 \\ \sim \frac{b-a}{N}(\sum_{l=0}^{N-1} f(\frac{l}{N})e^{-2\pi i \omega (a+(b-a)l/N)} + \frac{f(b)e^{-2\pi i\omega b}-f(a)e^{-2\pi i\omega a}}{2})\\ = \frac{b-a}{N}e^{-2\pi i \omega a}(\sum_{l=0}^{N-1} f(\frac{l}{N})e^{-2\pi i (b-a) \omega l/N} + \frac{f(b)e^{2\pi i\omega (a-b)}-f(a)}{2})\\ \Longrightarrow\\ \hat{f}(c+k\frac{d-c}{M})=\frac{b-a}{N}e^{-2\pi i a(c+k\frac{d-c}{M})}(\sum_{l=0}^{N-1} f(\frac{l}{N})e^{-2\pi i \frac{b-a}{N} cl}e^{-2\pi i \frac{(b-a)(d-c)}{MN}k l} + ...)\\ =\frac{b-a}{N}e^{-2\pi i a(c+k\frac{d-c}{M})}(CZT(\{f_l\}, M, e^{-2\pi i \frac{(b-a)(d-c)}{MN}}, e^{2\pi i \frac{b-a}{N} c})+...) f^(ω)=∫Rf(x)e−2πiωxdx∼∫[a,b]f(x)e−2πiωxdx,−a,b≫1∼Nb−a(l=0∑N−1f(Nl)e−2πiω(a+(b−a)l/N)+2f(b)e−2πiωb−f(a)e−2πiωa)=Nb−ae−2πiωa(l=0∑N−1f(Nl)e−2πi(b−a)ωl/N+2f(b)e2πiω(a−b)−f(a))⟹f^(c+kMd−c)=Nb−ae−2πia(c+kMd−c)(l=0∑N−1f(Nl)e−2πiNb−acle−2πiMN(b−a)(d−c)kl+...)=Nb−ae−2πia(c+kMd−c)(CZT({fl},M,e−2πiMN(b−a)(d−c),e2πiNb−ac)+...)
原理
基于Bluestein算法
参考 Chirp Z-transform 及其中引文
源码
def czt(x, m=None, w=None, a=1):"""chirp z transform: (Based on FFT)z = A * W.^(-(0:M-1)), g_i = sum_jz^{-ij}x_jInputs m, w and a must be scalars.Arguments:x {array} -- the original signalKeyword Arguments:m {number} -- (default: {None})w {complex number} -- base of the series (default: {np.exp(-2j * np.pi / m)})a {number} -- (default: {1})Returns:array -- czt of x"""n = x.shape[0]if k is None:m = nif w is None:w = np.exp(-2j * np.pi / m)if not isinstance(x, np.ndarray):x = np.asarray(x, dtype=np.complex)# Length for power-of-two fft.nfft = 2 ** nextpow2(n+k-1)# Premultiply data.k = np.arange(-n+1, max((m, n))) ** 2 / 2ww = w ** k # Chirp filter is 1./ww# nn = n-1 : 2*n-1aa = a ** (-np.arange(0, n)) * ww[n-1:2*n-1]y = x * aa# Fast convolution via FFT.fy = np.fft.fft(y, nfft) * np.fft.fft(1 / ww[:m+n-1], nfft)g = np.fft.ifft(fy)# Finally multiply Chirp filter.return g[n-1:n+m-1] * ww[n-1:n+m-1]
Fourier 变换实现
有了czt就可以实现FT了
def cft(f, trange=(0,1), Nt=None, wrange=(-10,10), Nw=101, padding='c'):"""continuous Fourier transformAssertion: wsize * tsize <= Nt;Reference: https://en.wikipedia.org/wiki/Chirp_Z-transformArguments:f {function|array} -- function or values of functionsKeyword Arguments:trange {tuple} -- the range of time (default: {(0,1)})Nt {[type]} -- number of samples on time-domain (default: {None})wrange {tuple} -- the range of frequency (default: {(-10,10)})Nw {number} -- number of samples on frequency-domain (default: {101})padding {str} -- Used in feature (default: {'c'})Returns:tuple -- function values and frequencies"""a, b = trangec, d = wrangedt = (b-a)/ Nt; dw = (d-c)/ Nwif callable(f):if Nt is None:Nt = 100f = f(np.linspace(a, b, Nt))else:if Nt is None:Nt = f.shape[0]else:f = f[:Nt]F = czt(f, Nw-1, np.exp(-2j*np.pi*dt*dw), np.exp(2j*np.pi*dt*c))ws = np.linspace(c, d, Nw)if padding=='c':p = f[-1]elif padding=='c1':p = 2*f[-1]-f[-2]F = dt * np.exp(-2j*np.pi*a*ws[:-1]) * (F + (p * np.exp(2j*np.pi*(a-b) * ws[:-1]) - f[0])/2)return np.concatenate([F, [F[-1]]]), ws
numpy.fft 实现 czt (Chirp Z-transform)相关推荐
- 数字信号处理——Chirp Z变换
一.前言. Chirp Z变换也叫czt变换或者线性调频变换. 二.CZT原理. 三.CZT的算法步骤: 四.CZT的特点(与FFT比较): 五.CZT的Matlab实现. function [] = ...
- numpy教程:快速傅里叶变换模块numpy.fft
http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...
- python numpy.fft.fft和ifft
python numpy.fft.fft和ifft(离散傅里叶变换和反傅里叶变换) numpy.fft 的fft和ifft是相逆变换操作,这里用ECG信号做演示. 1.傅里叶转换是将时域信号转化为频域 ...
- 信号处理之FFT与CZT变换
FFT与CZT变换 FFT CZT变换 FFT 用FFT算法计算序列x(n)=[2,1,3,2,1,5,1]与h(n)=[1,2,-1,-3]的线性卷积,画出输入.输出序列的波形图. x=[2 1 3 ...
- php 做fft,什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLA...
numpy中的实际FFT使用这样的事实:实值函数的傅立叶变换就是说"偏斜对称",即频率k处的值是频率Nk处k = 1的值的复共轭. N-1(正确的术语是Hermitian).因此, ...
- matlab的czt变换,CZT变换(chirp z-transform)
作者:桂. 时间:2018-05-20 12:04:24 前言 相比DFT,CZT是完成频谱细化的一种思路,本文主要记录CZT的C代码实现. 一.代码实现 原理主要参考MATLAB接口: 对应C代码 ...
- 使用 scipy.fft 进行Fourier Transform:Python 信号处理
摘要:Fourier transform 是一个强大的概念,用于各种领域,从纯数学到音频工程甚至金融. 本文分享自华为云社区<使用 scipy.fft 进行Fourier Transform:P ...
- 线性调频Z变换(CZT)
已知有限长序列x(n)的Z变换为 由上式中可知z=e^(s*Ts)=e^(a+jΩ)Ts=e^(a*Ts)*e^(jΩTs)=Ae^(jΩ*Ts),,s为拉普拉斯变量,A=e^(aTs)为实数,w=Ω ...
- 数字信号处理 实验三 FFT 应用及 CZT (fft在快速卷积,相关,功率谱及CZT应用)
快速傅里叶变化FFT的应用 前言 快速傅里叶变换 快速卷积计算 快速相关计算 功率谱计算 线性调频Z变换(CZT) 全部程序可点此处下载 前言 傅里叶变换在时频域转换和频域分析上有着重要的作用.但是如 ...
最新文章
- Jquery实现的Tabs页签
- 一般实现分布式锁都有哪些方式?
- 49.SCVMM管理下的Hyper-V到Azure的异地(Azure)容灾
- 小程序点击按钮 关闭小程序
- Trie(前缀树/字典树)及其应用
- Monitor Asynchronous Apex
- leetcode C++ 45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后
- Java中hashCode()方法以及HashMap()中hash()方法
- u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...
- python数据库安装_python数据库-MySQL安装问题总结(48)
- 2017沈阳站 Tree
- nginx 负载均衡的五中不同配置方式
- iPhone发展【一】从HelloWorld开始
- html输入表,HTML 表单输入
- java jco sap 重连_Java连接SAP,使用SAPJCO3.jar
- 阴阳师服务器在维护,《阴阳师》12月1日服务器维护公告
- 第六章—身份认证、第七章—控制访问
- 微信小程序中使用Echarts(折线图)
- linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法...
- Nvidia显卡重新安装解决方案