Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Chirp z transform (zoom FFT) with numpy
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# -*- coding: utf-8 -*-\n",
"\n",
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def cztw(y,x0,dx,f0,df,M):\n",
" # calculates chirp z-transform == zoom-FFT without sampling restrictions\n",
" # this is translation of matlab cztw to python\n",
" # but only for a vector y, not matrix!\n",
" # wolfgang.loeffler@gmail.com\n",
" # Based on routine from J. Selva\n",
" #(http://www.dsprelated.com/showcode/229.php)\n",
"\n",
"\n",
" # % y: signal at x0,x0+dx,...\n",
" # % for output fourier field:\n",
" # % f0: first frequency where fourier amplitude is computed\n",
" # % df: frequency spacing\n",
" # % M: frequency samples\n",
"\n",
" # % use these sample points: xax=linspace(-1,1-2/NN,NN)*xr; % NN even!\n",
" # % if not: phase errors\n",
"\n",
" # % CT algorithm: ch9.6.2 of Oppenheim/Schafer/Buck, \"Discrete-time signal\n",
" # % processing,\" 2nd ed. 1998\n",
"\n",
" N = len(y)\n",
" cols=1\n",
"\n",
" P = int(2**np.ceil(np.log2(M+N-1)))\n",
" nn=np.arange(1,N+1)\n",
" a = np.exp(-1.0j*2.0*np.pi*(nn*dx*(f0-df) + dx*df*nn**2.0/2.0))\n",
" mm1=np.arange(0,M)\n",
" mm2=np.arange(1,M+1)\n",
" b = np.exp(-1.0j*2.0*np.pi*((x0-dx)*(f0+mm1*df) + dx*df*mm2**2.0/2.0))\n",
" nm=np.arange(1-N,M)\n",
" phi = np.fft.fft(np.exp(1.0j*2.0*np.pi*dx*df*nm**2.0/2.0),P) #%FFT of chirp pulse. \n",
" #%Weigh x using a and perform FFT convolution with phi. \n",
" X = np.fft.ifft( np.fft.fft(y*a,P) * phi )\n",
" #%Truncate the convolution tails and weigh using b. \n",
" \n",
" X = X[N-1:M+N-1] * b\n",
" return X\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x107210d30>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.figure.Figure at 0x107211550>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x107261fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# chirp-z transform test\n",
"NN=512; # choose even NN!!!\n",
"xr=3000;\n",
"xx=np.linspace(-1,1-2/NN,NN)*xr;\n",
"yy=np.exp(-(xx**2)/300**2)\n",
"plt.figure()\n",
"plt.plot(xx,yy,label='yy')\n",
"\n",
"f1=-0.003\n",
"f2=-f1\n",
"m=256\n",
"# tt=czt.ZoomFFT(len(xx), f1, f2, m)\n",
"ff = np.linspace(f1, f2, m)\n",
"# zz = tt(yy)\n",
"dx=xx[1]-xx[0]\n",
"zz = cztw(yy,xx[0],dx,f1,(f2-f1)/m,m)\n",
"\n",
"plt.figure()\n",
"fig,ax1=plt.subplots()\n",
"plt.plot(ff,np.real(zz))\n",
"ax2=ax1.twinx()\n",
"plt.plot(ff,np.imag(zz))\n",
"\n",
"\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.