這個也和 AWR1642 config command 有關。
realtime.py 的參數:
numFrames = 300 numADCSamples = 128 numTxAntennas = 3 numRxAntennas = 4 numLoopsPerFrame = 128 numChirpsPerFrame = numTxAntennas * numLoopsPerFrame numRangeBins = numADCSamples numDopplerBins = numLoopsPerFrame numAngleBins = 64他有 numChirpsPFrame = numTxAntennas * numLoopsPerFrame
跟 stanley 說明的一樣,一個 loop ,就是 一個 profile.
一個 frame 的定義就是 N 個 loop。
這個 numLoopsPerFrame 只有在 這裡有用到,其他 source code 的地方都沒有用。
adc.py 的參數:
ADC_PARAMS = {'chirps': 128, 'rx': 4, 'tx': 3, 'samples': 128, 'IQ': 2, 'bytes': 2} BYTES_IN_FRAME = (ADC_PARAMS['chirps'] * ADC_PARAMS['rx'] * ADC_PARAMS['tx'] * ADC_PARAMS['IQ'] * ADC_PARAMS['samples'] * ADC_PARAMS['bytes'])直接用 chirps.
但是 bytes_in_frame,刪掉 rx, samples. IO. bytes 後...
chirps * tx這樣看起來 chirps 好像是 loops ?
回到 realtime.py,讀完一個 frame 後..
frame = dca.organize(adc_data, num_chirps=numChirpsPerFrame, num_rx=numRxAntennas, num_samples=numADCSamples)其中 organize() :
def organize(raw_frame, num_chirps, num_rx, num_samples): """Reorganizes raw ADC data into a full frame Args: raw_frame (ndarray): Data to format num_chirps : Number of chirps included in the frame num_rx : Number of receivers used in the frame num_samples : Number of ADC samples included in each chirp Returns: ndarray: Reformatted frame of raw data of shape (num_chirps, num_rx, num_samples) """ ret = np.zeros(len(raw_frame) // 2, dtype=complex) # Separate IQ data ret[0::2] = raw_frame[0::4] + 1j * raw_frame[2::4] ret[1::2] = raw_frame[1::4] + 1j * raw_frame[3::4] return ret.reshape((num_chirps, num_rx, num_samples))最後的 reshape(num_chirps, num_rx, num_samples)
說明,安排的方式...
([[S,......samples], <--rx0 第一個 chirp [S,......samples]], <--rx1 [[S,......samples], <--rx0 第二個 chirp [S,......samples]], <--rx1 ... .. [[S,......samples], 第 num_chirps-1 個chirp [S,......samples]])上面就是一個 frame.的所有 chirps.
所以...
framedata = data.organize(...) framedata[0] <-- 這是第一個 chirp 的 rx0,rx1 矩陣 framedata[0][1] <-- 這是第一個 chirp 的 rx1 array (所有 sample point)
回到 adc.py 跟 realtime.py:
參考 DCA1000EVM UDP RAW data format
raw data 是.. 每個chirp(不管是那一個 tx 送的),依照順序送 rx0,rx1,rx1,rx2 的 adc samples
所以 tx0, tx1 如果是依序送出的話, raw data 的資料也會依序是..
TX0 : rx0, rx1, rx2, rx3, TX1 : rx0, rx1, rx2, rx3所以orgnize( ) 是不用管TX0, TX1..他只需要知道一個 frame 到底有多少 chirp (TX0 + TX1)
chirps 應該是 TX 發出的FMCW波。
每個 chirps 會有 N 個 rx 信號。
所以 chirps_number * rx_number = frame rx number
最後... adc.py 跟 realtime.py 要對的起來的地方...
adc.py 的 read( ) 一個 frame,要剛好跟 realtime.py 的 orgnize( ) 的一個 frame 的 size 一樣。
read( ) 一個 frame (扣除 IO 跟 bytes):
chirps * tx * rx * samplesrealtime.py 的 orgnize:
numChirpsPerFrame(numLoopsPerFrame * numTxAntennas) * numRxAntennas * numADCSamples這樣看來...numLoopsPerFrame 好像就是 adc.y 的 ADC_PARAMS['chirps']
沒有留言:
張貼留言