How can I generate power spectral density from waveform?
38 次查看(过去 30 天)
显示 更早的评论
Hello. I would like to generate a waveform in MATLAB according to an equation, and then calculate its power spectral density (PSD). I have some experience with MATLAB, but I admit that my DSP skills need improving, and I think it's the latter which is causing me some troubles...
Waveform generation
The waveform is data that has been modulated by a specific method onto a sinusoidal carrier. The waveform can be represented mathematically by:
where:
- is the RF carrier frequency
- m is the modualtion index, which can be set to 1.2 rad
- is a binary data sequence with symbol rate
depends on the modulation scheme; I give the detail so you can follow the code below:
- For PCM/PM:
- For PCM/PSK/PM with square-wave subcarrier:
- For PCM/PSK/PM with sine-wave subcarrier:
where:
- is the subcarrier frequency
- is the subcarrier phase
I have some code that successfully generates the waveforms:
%% Set up PRBS bit stream, "b". Make function of time after defining samples per bit
clear; close all; clc;
n = 2^6; % # of bits
rng default; % set rng seed to default to create repeatable results
b = randi([0,1],n,1); % set up PRBS between 0 and +1
b(b==0) = -1; % change all 0s to -1 so data is -1 and +1
b = b';
spb = 2^6; % samples per bit
ns = n*spb; % total # of samples
b = repelem(b,spb); % recreate bit stream, but repeating the elements so you have "spb" samples per bit
Rb = 2000; % bit rate = 2kb/s
Tb = 1/Rb; % bit period
Ts = Tb/spb; % sample period
t = 0:Ts:(ns-1)*Ts; % set up time array
plot_lim = spb*6; % used to plot arbitrary portion of bit stream / waveform. i.e. plot 6 bits worth of data
fig = figure;
subplot(1,2,1); plot(t(1:plot_lim),b(1:plot_lim)); title('Bit stream'); xlabel('t [s]');
% Generate waveforms
f_c = 0; % carrier frequency
omega_c = 2*pi*f_c;
m = 1.2; % modultaion index
sc_Rb_ratio = 4; % sub-carrier to symbol rate ratio
f_sc = f_c + sc_Rb_ratio*Rb; % sub-carrier frequency
omega_sc = 2*pi*f_sc;
theta_sc = 0; % sub-carrier phase
Pt = [repelem(1,length(t)); square(omega_sc*t + theta_sc); sin(omega_sc*t + theta_sc)];
s = sqrt(2)*sin(omega_c*t + m*Pt.*b);
subplot(1,2,2);
plot(t(1:plot_lim),s(:,1:plot_lim)); xlabel('t [s]');
title('Waveform');
legArr = {'PCM/PM';'PCM/PSK/PM (square-wave)';'PCM/PSK/PM (sine-wave)'};
legend(legArr);
fig.Position = [200 300 1200 500];
This results in the following bit stream / waveforms:
Power spectral density
How do I work out the PSD (in the frequency domain) from the defined waveforms? I want to be able to select m and , generate the waveform (in the time domain) and see how it changes the PSD (in the frequency domain).
I would appreciate seeing other people's methodologies to get an idea of the best way to do this. FYI I have access to the Commucations Toolbox and Signal Processing Toolbox. Thank you in advance.
3 个评论
采纳的回答
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Digital Filter Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!