熟悉的標題,熟悉的內容,熟悉的...,What?竟然不是MATLAB,沒錯,這篇文章我們來看看如何通過Python實現FMCW雷達的距離都卜勒估計。
為什麼要用Python呢,作為一個千年MATLAB黨(嘿嘿嘿),用久了就會發現這個東西更像是一個工具軟體,拿去搞搞算法驗證之類的是不可否認的強大。而Python作為一個通用的程式語言,在實際應用中的好處自然是不言而喻。通過利用一些第三方的庫比如numpy,scipy和matplotlab也可以進行同樣的科學計算。
OK,廢話少說,速速回到正題。關於如何利用MATLAB對FMCW雷達的距離和都卜勒估計前不久有寫一篇,
乾貨 | 利用MATLAB實現FMCW雷達的距離都卜勒估計
下面我們就如何利用Python得到FMCW雷達的距離都卜勒估計進行介紹。
首先是關於環境搭建,作為一個不折不扣的懶人(哭),一想到要一個個的添加庫,瞬間哭瞎,於是便奔向了Anaconda。最終的環境是WINDOWS+Pycharm+Anaconda,採用了將Anaconda集合在Pycharm中的方法。
然後回到算法本身,通過對FMCW雷達接收數據分別在快時間維和慢時間維先後進行FFT處理即可得到目標的距離和都卜勒估計。下面的圖給出了具體的算法流程。
最後回到代碼上來,具體還是得看實現。下面貼出了如何利用Python進行FMCW雷達的距離和都卜勒估計的代碼,在實現的過程中,我們主要用到了numpy,scipy 這兩個科學計算的庫以及matplotlib用於數值可視化的繪圖類庫。在這幾個庫的支撐下,利用Python與MATALB的結果幾乎沒有差別。
# coding=utf-8import numpy as npimport matplotlib.pyplot as pltimport scipy as spfrom mpl_toolkits.mplot3d import Axes3D# parameters settingB = 135e6 # Sweep BandwidthT = 36.5e-6 # Sweep TimeN = 512 # Sample LengthL = 128 # Chirp Totalc = 3e8 # Speed of Lightf0 = 76.5e9 # Start FrequencyNumRangeFFT = 512 # Range FFT LengthNumDopplerFFT = 128 # Doppler FFT LengthrangeRes = c/2/B # Range ResolutionvelRes = c/2/f0/T/NumDopplerFFT # Velocity ResolutionmaxRange = rangeRes * NumRangeFFT/2 # Max RangemaxVel = velRes * NumDopplerFFT/2 # Max VelocitytarR = [50, 90] # Target RangetarV = [3, 20] # Target Velocity# generate receive signalS1 = np.zeros((L, N), dtype=complex)for l in range(0, L): for n in range(0, N): S1[l][n] = np.exp(np.complex(0, 1) * 2 * np.pi * (((2 * B * (tarR[0] + tarV[0] * T * l))/(c * T) + (2 * f0 * tarV[0])/c) * (T/N) * n + (2 * f0 * (tarR[0] + tarV[0] * T * l))/c))S2 = np.zeros((L, N), dtype=complex)for l in range(0, L): for n in range(0, N): S2[l][n] = np.exp(np.complex(0, 1) * 2 * np.pi * (((2 * B * (tarR[1] + tarV[1] * T * l))/(c * T) + (2 * f0 * tarV[1])/c) * (T/N) * n + (2 * f0 * (tarR[1] + tarV[1] * T * l))/c))sigReceive = S1 + S2# range win processingsigRangeWin = np.zeros((L, N), dtype=complex)for l in range(0, L): sigRangeWin[l] = sp.multiply(sigReceive[l], sp.hamming(N).T)# range fft processingsigRangeFFT = np.zeros((L, N), dtype=complex)for l in range(0, L): sigRangeFFT[l] = np.fft.fft(sigRangeWin[l], NumRangeFFT)# doppler win processingsigDopplerWin = np.zeros((L, N), dtype=complex)for n in range(0, N): sigDopplerWin[:, n] = sp.multiply(sigRangeFFT[:, n], sp.hamming(L).T)# doppler fft processingsigDopplerFFT = np.zeros((L, N), dtype=complex)for n in range(0, N): sigDopplerFFT[:, n] = np.fft.fft(sigDopplerWin[:, n], NumDopplerFFT)
簡單run一下,可以得到最終的結果為,對比一下左邊MATLAB的結果,Python的科學計算結果並未有明顯差別。
還在猶豫什麼,快來和我一起用Py吧~
題圖:Pexels,From Pixabay.