I am trying to simulate some digital TV signals and their reflections for a simple passive radar proof of concept program. Since ATSC signals in the US are approximately noise-like, I am attempting to simulate a low power Gaussian signal incident on a two element array, with a lower power reflection incident some time later (by padding a scaled down copy of the original Gaussian signal with the appropriate number of samples corresponding to the time of flight). I am then calculating the cross ambiguity of these two functions with some filtering applied to cancel out the direct path interference.
My simulation is working perfectly, except I can't seem to figure out how to simulate a Doppler shift on my signal.
c = physconst('lightspeed');
fs = 10e6;
fc = 641e6;
fmax = 800e6;
t_sample = 1/fs;
lambda = c/fc;
distTowerToTgt = 18920;
distTgtToRec = 30000;
dist = distTowerToTgt + distTgtToRec;
ToF = dist/c;
t = 0:t_sample:0.5;
ref_signal = wgn(1,size(t,2),-68,'complex');
refPower = var(ref_signal);
survPower = 10^(-129.3357/10);
ref_scale = survPower/refPower;
ref_scaleDpi = ref_scale;
total_surv_signal = ref_scale*ref_signal;
numDelays = round(ToF/t_sample);
total_surv_signal = padarray(total_surv_signal',numDelays,0,'pre')';
total_surv_signal = total_surv_signal(1,1:size(ref_signal,2));
This code generates the two signals well and the range comes out correct in my ambiguity function. An attempt I've made to simulate the Doppler effect used interpolation:
len = size(total_surv_signal, 2);
vE = 222;
vR = 0;
doppShift = fc*(1+(vE/c));
total_surv_signal = interp1(1:len, total_surv_signal, linspace(1, len, len * (c - vR) / (c + vE)));
total_surv_signal = padarray(total_surv_signal', len-numel(total_surv_signal), 0, 'post')';
However, this did not manifest in a Doppler shift in my ambiguity function, merely a peak at the same point and broadening in the Doppler bins. I also tried to multiply the entire total_surv_signal by a complex exponential of value , which I believe should work since my simulated signal is just baseband IQ data (conceptually). However, this gave a truly confusing output and seems a pretty hopeless approach.
Is there something I'm missing here? This seems it should be relatively straightforward, but I've been struggling with this for a few days.
Any help would be appreciated!