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^​(ω)=∫R​f(x)e−2πiωxdx∼∫[a,b]​f(x)e−2πiωxdx,−a,b≫1∼Nb−a​(l=0∑N−1​f(Nl​)e−2πiω(a+(b−a)l/N)+2f(b)e−2πiωb−f(a)e−2πiωa​)=Nb−a​e−2πiωa(l=0∑N−1​f(Nl​)e−2πi(b−a)ωl/N+2f(b)e2πiω(a−b)−f(a)​)⟹f^​(c+kMd−c​)=Nb−a​e−2πia(c+kMd−c​)(l=0∑N−1​f(Nl​)e−2πiNb−a​cle−2πiMN(b−a)(d−c)​kl+...)=Nb−a​e−2πia(c+kMd−c​)(CZT({fl​},M,e−2πiMN(b−a)(d−c)​,e2πiNb−a​c)+...)

原理

基于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)相关推荐

  1. 数字信号处理——Chirp Z变换

    一.前言. Chirp Z变换也叫czt变换或者线性调频变换. 二.CZT原理. 三.CZT的算法步骤: 四.CZT的特点(与FFT比较): 五.CZT的Matlab实现. function [] = ...

  2. numpy教程:快速傅里叶变换模块numpy.fft

    http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...

  3. python numpy.fft.fft和ifft

    python numpy.fft.fft和ifft(离散傅里叶变换和反傅里叶变换) numpy.fft 的fft和ifft是相逆变换操作,这里用ECG信号做演示. 1.傅里叶转换是将时域信号转化为频域 ...

  4. 信号处理之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 ...

  5. php 做fft,什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLA...

    numpy中的实际FFT使用这样的事实:实值函数的傅立叶变换就是说"偏斜对称",即频率k处的值是频率Nk处k = 1的值的复共轭. N-1(正确的术语是Hermitian).因此, ...

  6. matlab的czt变换,CZT变换(chirp z-transform)

    作者:桂. 时间:2018-05-20  12:04:24 前言 相比DFT,CZT是完成频谱细化的一种思路,本文主要记录CZT的C代码实现. 一.代码实现 原理主要参考MATLAB接口: 对应C代码 ...

  7. 使用 scipy.fft 进行Fourier Transform:Python 信号处理

    摘要:Fourier transform 是一个强大的概念,用于各种领域,从纯数学到音频工程甚至金融. 本文分享自华为云社区<使用 scipy.fft 进行Fourier Transform:P ...

  8. 线性调频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=Ω ...

  9. 数字信号处理 实验三 FFT 应用及 CZT (fft在快速卷积,相关,功率谱及CZT应用)

    快速傅里叶变化FFT的应用 前言 快速傅里叶变换 快速卷积计算 快速相关计算 功率谱计算 线性调频Z变换(CZT) 全部程序可点此处下载 前言 傅里叶变换在时频域转换和频域分析上有着重要的作用.但是如 ...

最新文章

  1. Jquery实现的Tabs页签
  2. 一般实现分布式锁都有哪些方式?
  3. 49.SCVMM管理下的Hyper-V到Azure的异地(Azure)容灾
  4. 小程序点击按钮 关闭小程序
  5. Trie(前缀树/字典树)及其应用
  6. Monitor Asynchronous Apex
  7. leetcode C++ 45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后
  8. Java中hashCode()方法以及HashMap()中hash()方法
  9. u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...
  10. python数据库安装_python数据库-MySQL安装问题总结(48)
  11. 2017沈阳站 Tree
  12. nginx 负载均衡的五中不同配置方式
  13. iPhone发展【一】从HelloWorld开始
  14. html输入表,HTML 表单输入
  15. java jco sap 重连_Java连接SAP,使用SAPJCO3.jar
  16. 阴阳师服务器在维护,《阴阳师》12月1日服务器维护公告
  17. 第六章—身份认证、第七章—控制访问
  18. 微信小程序中使用Echarts(折线图)
  19. linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法...
  20. Nvidia显卡重新安装解决方案

热门文章

  1. Cadence封装库操作学习(一)
  2. 【论文写作】如何表示比较关系, compare to OR compare with?
  3. TRIZ系列-创新原理-4-增加不对称性原理
  4. 【Math】最大公约数(gcd)
  5. C++中的断言机制与gtest单元测试
  6. 【http】跨域解决方案
  7. POJ 2020 MisLED 笔记
  8. 罩形件冲压模具设计及制造(论文+CAD图纸)
  9. Capsule Networks 解读资源
  10. Grayscale获得FINRA许可,在OTC市场进行受监管的以太坊信托交易