覺得有關 frame, chirps 的參數,在 realtime.py 和 adc.py 中不一致。
這個也和 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 * samples
realtime.py 的 orgnize:
numChirpsPerFrame(numLoopsPerFrame * numTxAntennas) * numRxAntennas * numADCSamples
這樣看來...numLoopsPerFrame 好像就是 adc.y 的 ADC_PARAMS['chirps']