2020/6/10

openradar , frame reshape and chirps. frame parameters

覺得有關 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']

沒有留言:

張貼留言