%%% Script for reordering DCA1000 LVDS stream with 2 lanes %%% capture format can be found in mmWave Studio User's Guide 22.8./9. function [retVal] = readDCA(fileName, numFrames) %% global variables % change based on sensor config %---------------------------------------------------------------------- numADCBits = 16; % number of ADC bits per sample numADCSamples = 256; % number of ADC samples per chirp numRx = 4; % number of receivers chirpSize = numADCSamples*numRx; %numFrames = 1; % is function input loops = 32; % # of loops over chirp indices numLanes = 2; % do not change. number of lanes is always 2 isReal = 0; % set to 1 if real only data, 0 if complex data0 isDemo = 1; % filter frame leading info %----------------------------------------------------------------------- %% read file % read .bin file fid = fopen(fileName,'r'); adcData = fread(fid, 'int16'); fclose(fid); fileSize = size(adcData, 1); % one chirp only %adcData = adcData(1:chirpSize,1); %% organize data by LVDS lane % for real data, each Rx in column if isReal LVDS = zeros(1, length(adcData(:,1))); LVDS = reshape(adcData(:,1), [], numRx); else % for complex data % LVDS row /w half length % cmplx matrix /w real and imaginary row LVDS = zeros(1, length(adcData(:,1))/2); cmplx= zeros(2, length(adcData(:,1))/2); % combine real and imaginary parts counter = 1; for i=1:4:fileSize-1 LVDS(1,counter) = adcData(i) + sqrt(-1)*adcData(i+2); LVDS(1,counter+1) = adcData(i+1)+sqrt(-1)*adcData(i+3); cmplx(1,counter) = adcData(i); cmplx(2,counter) = adcData(i+2); cmplx(1,counter+1) = adcData(i+1); cmplx(2,counter+1) = adcData(i+3); counter = counter + 2; end % create column for each Rx channel % LVDS has numRx complex columns % cmplx has numRx real and numRx imaginary columns % for example numRx=4: 1-4 real, 5-8 imaginary if numRx > 2 LVDS = reshape(LVDS(1,:), length(LVDS(1,:))/numRx, numRx); cmplx = cmplx.'; cmplx = reshape([cmplx(:,1);cmplx(:,2)], length(cmplx(:,1))/numRx, 2*numRx); end end %% filter leading 0 frame from Demo Visualizer Capture % Chirp profile information at beginning (of each frame) if isDemo cmplx(1:loops/2,:)=[]; for i=1:1:numFrames-1 row = i*numADCSamples*loops; cmplx(row+1:row+loops/2,:)=[]; end end %% organize data by chirps % %% return receiver data if isReal retVal = LVDS; else retVal = cmplx; end