Correct representation of FFT from complex signal acquired through spectrum analyzer
52 views (last 30 days)
Show older comments
Hi,
I have the following problem that is bugging me.
I have been given some EM measurements acquired through Keysight's UXR0204A spectrum analyzer.
The measurements are saved in a .mat form and are broken into different batches that vary in frequency from 50 MHz to 640MHz.
For example, the acquired measurements include the following signal frequencies:
M1 [50Mhz - 110MHz]
M2 [155MHz - 215MHz]
...
M10 [580MHz - 640MHz]
The measurements have the time domain signal represented in its complex form:
Y = x + j*z
The .mat file includes also other information like the distance XDelta between the samples, the maximum and minimum frequencies represented inside the signal, etc.
To process the measurements, I want to correctly calculate the sampling frequency of the signal. To do that, I use the equation
Fs = 1/XDelta;
where XDelta is the delta between two consequtive samples of time domain signal. This XDelta is constant through out all of the measurements and results to an Fs = 76.8 MHz.
To the best of my knowledge this happens due to the spectrum analyzer acquiring the measurements through mixing.
This of course creates problems when I am trying to calculate the FFT of the signals, as Nyquist's theorem is violated and I cannot get an accurate representation of the frequency spectrum.
To plot the FFT I am using the following script:
fname = fullfile(path,file);
load(fname);
Fs = (1/XDelta); % sampling frequency
L = size(Y,1); % length of signal / # of buckets to break the frequency domain and number of samples in FFT.
dt = 1/Fs; % time increment (sampling period)
df = Fs/L; % frequency increment
t = (0:L-1)*dt; % time vector (duration of signal in time domain)
% Performing FFT on a trace
Yreal = real(Y);
Yfft = fft(Yreal);
P2 = abs(Yfft)/L; % Normalize the FFT by the length of the time domain signal
P1 = P2(1:L/2+1); % We keep only half of the frequencies up to the Nyquist one (middle)
P1(2:end-1) = 2*P1(2:end-1); % This is a one-sided Fourier transform. To correct for this, I am multiplying the FFT output by 2 to reproduce the amplitude of the original signals.
f = df*(0:(L/2)); % create the frequency vector (frequency X-axis)
figure;
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
Can somebody provide any insight (or sources) on how to correctly process this form of measurements?
I am using Matlab R2022a.
Thank you in advance for your help and time!
Kind regards,
Nassos
0 Comments
Answers (2)
Sai Kiran
on 9 Mar 2023
Hi,
As per my understanding you are unable to view the exact signal due to the low sampling frequency.
Can you try to change the sampling frequency in the Spectrum Analyzer(MATLAB) to the appropriate nyquist sampling frequency?
I hope it helps!
Thanks.
0 Comments
nassos
on 11 Mar 2023
Edited: nassos
on 11 Mar 2023
3 Comments
Sai Kiran
on 16 Mar 2023
Hi,
Multiplying the time domain signal by a sinusoid of e^(j*w) results in shifting of the signal to desired frequency.
This can be achieved by increasing the sampling frequency(using interpolators) of the input signal and then use mixers(NCO from DSP ToolBox) to shift the input signal to the desired frequency.
Thanks!
See Also
Categories
Find more on Filter Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!