MATLAB Code for PPM (Simple)
clc; clear; close all;
% Parameters for the sine wave and PPM
A = 5; % Amplitude of the sine wave
f = 1; % Frequency of the sine wave in Hz
sampleRate = 0.1; % Sampling interval (ฮt)
numSamples = 50; % Number of samples
t = (0:numSamples) * sampleRate; % Time vector (from 0 to numSamples * ฮt)
% Generate the sinusoidal signal x(t) = A * sin(2 * pi * f * t)
x_t = A * sin(2 * pi * f * t);
% Calculate the Pulse Position Modulation (PPM) positions
ppm_positions = zeros(1, numSamples+1); % Initialize an array for PPM pulse positions
ppm_pulses = zeros(1, numSamples+1); % Initialize an array to store pulse heights (constant amplitude)
pulse_height = 1; % Constant pulse height (amplitude)
% Loop through each time sample and compute the pulse positions
for i = 1:numSamples+1
% Calculate the pulse shift based on the amplitude of the sine wave at this time
pulseShift = max(0, x_t(i)); % Only shift for positive amplitude
ppm_positions(i) = t(i) + sampleRate * pulseShift; % Pulse position calculation
ppm_pulses(i) = pulse_height; % Set the pulse height to constant value
end
% Plotting the sine wave and PPM
figure;
% Plot the sine wave
subplot(2,1,1);
plot(t, x_t, 'b', 'LineWidth', 2);
title('Sinusoidal Signal x(t) = 5 sin(2\pi \cdot 1 \cdot t)');
xlabel('Time (s)');
ylabel('Amplitude');
grid on;
% Plot the PPM pulses with constant height
subplot(2,1,2);
hold on;
for i = 1:numSamples+1
if ppm_pulses(i) > 0 % Only plot pulses if there is a shift (i.e., positive amplitude)
plot([ppm_positions(i) ppm_positions(i)], [0 ppm_pulses(i)], 'r', 'LineWidth', 2); % Vertical line for pulse
end
end
title('Pulse Position Modulation (PPM)');
xlabel('Time (s)');
ylabel('Pulse Amplitude');
grid on;
web('https://www.salimwireless.com/search?q=ppm%20pulse%20modulation', '-browser');
Output
MATLAB Code for PPM (at Falling Edges of PWM)
%The code is developed by SalimWireless.com
clc; clear; close all;
% === Existing PWM generation code === (unchanged)
fs_carrier = 10; % Carrier frequency in Hz
f_signal = 3; % Message signal frequency in Hz
sampleRate = 50000; % Samples per second
duration = 1; % Duration in seconds
t = linspace(0, duration, sampleRate * duration);
signal = sin(2 * pi * f_signal * t);
normalizedSignal = (signal + 1) / 2;
samplesPerCarrierPeriod = floor(sampleRate / fs_carrier);
pwm = zeros(1, length(t));
for i = 1:samplesPerCarrierPeriod:length(t)
startIndex = i;
if startIndex > length(t)
break;
end
duty = normalizedSignal(startIndex);
onSamples = floor(samplesPerCarrierPeriod * duty);
endIndex = min(startIndex + samplesPerCarrierPeriod - 1, length(t));
onEndIndex = min(startIndex + onSamples - 1, endIndex);
pwm(startIndex:onEndIndex) = 1;
end
carrierSquare = double(mod(t * fs_carrier, 1) < 0.5);
samplesToPlot = floor(3 * (sampleRate / f_signal));
t_plot = t(1:samplesToPlot);
signal_plot = signal(1:samplesToPlot);
carrier_plot = carrierSquare(1:samplesToPlot);
pwm_plot = pwm(1:samplesToPlot);
% === Identify falling edges of PWM ===
fallingEdges = find(diff(pwm_plot) == -1) + 1; % indices where pwm goes 1->0
% === Generate PPM pulses at falling edges ===
% Define PPM pulse width in samples (very narrow pulse)
ppmPulseWidth = round(sampleRate * 0.0001); % 0.1 ms pulse width for example
ppmSignal = zeros(size(pwm_plot));
for idx = fallingEdges
pulseEnd = min(idx + ppmPulseWidth - 1, length(ppmSignal));
ppmSignal(idx:pulseEnd) = 1;
end
% === Plot all signals ===
figure('Name', 'PWM and PPM Pulses', 'Color', 'w');
hold on;
plot(t_plot, signal_plot, 'b', 'LineWidth', 1.2);
plot(t_plot, carrier_plot, 'g--', 'LineWidth', 1);
stairs(t_plot, pwm_plot, 'r', 'LineWidth', 1.2);
stairs(t_plot, ppmSignal * 1.2, 'k', 'LineWidth', 1.5); % multiplied by 1.2 for vertical offset
hold off;
xlabel('Time (s)');
ylabel('Amplitude');
title('PWM Output with PPM Pulses at Falling Edges');
legend('Message Signal (Sine)', 'Square Carrier', 'PWM Output', 'PPM Pulses (at falling edges)', 'Location', 'southoutside', 'Orientation', 'horizontal');
grid on;
ylim([-0.2 1.5]); % Adjust y-axis for visibility
web('https://www.salimwireless.com/search?q=pwm%20pulse%20modulation', '-browser');
Output
Further Reading