Why am I only getting the upper sideband when multiplying complex signals?

46 views (last 30 days)
I'm creating two complex signals in the time domain using the chirp function, one is an actual chirp, the other happens to be a CW because the start/stop frequencies are the same.
I then multiply them element-wise, and view the frequency content. I am only seeing the upper sideband, what is happening to the lower sideband?
pulseWidth = 10e-6; %10us
fc = 9.6e9; %9.6GHz carrier freq
fLO = 2.8e9; %2.8GHz LO Freq
bw = 200e6; %200MGz bandwidth
f0 = fc - 0.5*bw;
f1 = fc + 0.5*bw;
fs = 16*max([f0,f1]); %16 times the highest frequency
t = 0:1/fs:pulseWidth; %define times of the pulse
thisChirp = chirp(t,f0,t(end),f1,'complex');
LO = chirp(t,fLO,t(end),fLO,'complex');
result = thisChirp.*LO;
figure(1)
clf
tiledlayout('flow');
nexttile;
periodogram(thisChirp,[],[],fs);
title('thisChirp');
xlim([0,1.5*f1*1e-9]);
nexttile;
periodogram(LO,[],[],fs);
title('LO');
xlim([0,1.5*f1*1e-9]);
nexttile;
periodogram(result,[],[],fs);
title('result');
xlim([0,1.5*f1*1e-9]);
When I remove 'complex' from the chirp function, it DOES work as expected. How do I accomplish the same thing with complex signals?
'complex' removed:
  1 Comment
Jared
Jared on 16 Jun 2025 at 16:58
I'm sure I'm seeing SSB phase method as described here Single Sideband Modulation via the Hilbert Transform - MATLAB & Simulink Example
I attempted to eliminate this by applying a random phase offest to the LO signal using
LO = chirp(t,fLO,t(end),fLO,'linear',rand*360,'complex');
but it appears to still be behaving the same.

Sign in to comment.

Answers (1)

David Goodmanson
David Goodmanson on 17 Jun 2025 at 2:09
Edited: David Goodmanson on 20 Jun 2025 at 21:55
Hi Jared,
You probably can't reproduce the result with a single operation. When you use the 'complex' option, the resulting waveforms have positive frequencies only. The multiplication
result = thisChirp.*LO
has even higher frequencies, resulting in the upper sideband at 12.3 to 12.5 GHz. If you conjugate LO you can bring in negative frequencies, and
LO = conj(chirp(t,fLO,t(end),fLO,'complex'));
produces the lower sideband, 6.7 to 6.9 GHz.
It probably makes more sense to conjugate the chirp signal than LO, but since the chirp frequencies are larger than the LO frequency, this produces 'result' frequencies of -6.9 to -6.7 Ghz. The maximum frequency that perioidogram produces is fs = 155.2 GHz, so due to aliasing you will see the peak in the periodogram plot at [-6.9 to -6.7] + 155.2 = 148.3 to148.5 GHz (if you drop the xlim command).
All of this since real functions contain both positive and negative frequencies, e.g.
cos(2pi ft) = (exp(2pi ift)+(exp(-2pi ift)) /2
pulseWidth = 10e-6; %10us
fc = 9.6e9; %9.6GHz carrier freq
fLO = 2.8e9; %2.8GHz LO Freq
bw = 200e6; %200MGz bandwidth
f0 = fc - 0.5*bw;
f1 = fc + 0.5*bw;
fs = 16*max([f0,f1]); %16 times the highest frequency
t = 0:1/fs:pulseWidth; %define times of the pulse
thisChirp = chirp(t,f0,t(end),f1,'complex');
LO = chirp(t,fLO,t(end),fLO,'complex');
result1 = thisChirp.*LO;
result2 = thisChirp.*conj(LO);
figure(1)
subplot(2,1,1)
periodogram(result1,[],[],fs);
title('LO')
xlim([0,1.5*f1*1e-9])
subplot(2,1,2)
periodogram(result2,[],[],fs);
xlim([0,1.5*f1*1e-9])
title('conj LO')

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!