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

6 Ansichten (letzte 30 Tage)
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 Kommentar
Jared
Jared am 16 Jun. 2025
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.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

David Goodmanson
David Goodmanson am 17 Jun. 2025
Bearbeitet: David Goodmanson am 20 Jun. 2025
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!

Translated by