Skip to main content

MATLAB Code for Pulse Width Modulation (PWM) and Demodulation


 

MATLAB Code for Analog Pulse Width Modulation (PWM)

clc;
clear all;
close all;
fs=30; %frequency of the sawtooth signal
fm=3; %frequency of the message signal
sampling_frequency = 10e3;
a=0.5; % amplitide

t=0:(1/sampling_frequency):1; %sampling rate of 10kHz


sawtooth=2*a.*sawtooth(2*pi*fs*t); %generating a sawtooth wave


subplot(4,1,1);
plot(t,sawtooth); % plotting the sawtooth wave
title('Comparator Wave');

msg=a.*sin(2*pi*fm*t); %generating message wave

subplot(4,1,2);
plot(t,msg); %plotting the sine message wave
title('Message Signal');


for i=1:length(sawtooth)
if (msg(i)>=sawtooth(i))
pwm(i)=1; %is message signal amplitude at i th sample is greater than
%sawtooth wave amplitude at i th sample
else
pwm(i)=0;
end
end

subplot(4,1,3);
plot(t,pwm,'r');
title('PWM');
axis([0 1 0 1.1]); %to keep the pwm visible during plotting.

%% Demodulation
% Demodulation: Measure the pulse width to reconstruct the signal
demodulated_signal = zeros(size(msg));

for i = 1:length(pwm)-1
if pwm(i) == 1
% Measure the time until the next falling edge
j = i + 1;
while pwm(j) == 1 && j < length(pwm)
j = j + 1;
end
% Reconstruct the analog value based on pulse width
demodulated_signal(i) = mean(msg(i:j-1));
end
end

% Low-Pass Filter Design
Fs = 1 / (t(2) - t(1)); % Sampling frequency
Fc = 5; % Cutoff frequency (adjust based on your signal)
[b, a] = butter(4, Fc / (Fs / 2), 'low'); % 4th-order Butterworth filter

% Apply the Low-Pass Filter
filtered_signal = filtfilt(b, a, demodulated_signal);

% Plot the demodulated and filtered signal for comparison
subplot(4,1,4);
plot(t, filtered_signal, 'r', 'LineWidth', 1.5); % Filtered signal in red
title('Demodulated Signal (Filtered)');
xlabel('Time');
ylabel('Amplitude');
grid on;
 

Output 



 MATLAB Code for Digital Pulse Width Modulation (PWM)


% This code is developed by SalimWireless.Com
clc; clear; close all;
% Digital SPWM Generator using Square Wave Carrier in MATLAB

% === PARAMETERS ===
fs_carrier = 20;       % Carrier frequency in Hz
f_signal = 5;           % Message signal frequency in Hz
sampleRate = 50000;      % Samples per second
duration = 1;            % Duration in seconds

% === TIME VECTOR ===
t = linspace(0, duration, sampleRate * duration);

% === MESSAGE SIGNAL (SINE WAVE) ===
signal = sin(2 * pi * f_signal * t);

% === NORMALIZE SIGNAL TO 0–1 FOR DUTY CYCLE ===
normalizedSignal = (signal + 1) / 2;  % Scale from [-1, 1] to [0, 1]

% === PWM GENERATION BASED ON SQUARE CARRIER PERIODS ===
samplesPerCarrierPeriod = floor(sampleRate / fs_carrier);
pwm = zeros(1, length(t));

% Generate PWM: For each carrier cycle, set ON time based on message amplitude at start
for i = 1:samplesPerCarrierPeriod:length(t)
    startIndex = i;
    if startIndex > length(t)
        break;
    end
    
    % Duty cycle at start of period
    duty = normalizedSignal(startIndex);
    onSamples = floor(samplesPerCarrierPeriod * duty);
    
    % Set PWM high for onSamples
    endIndex = min(startIndex + samplesPerCarrierPeriod - 1, length(t));
    onEndIndex = min(startIndex + onSamples - 1, endIndex);
    
    pwm(startIndex:onEndIndex) = 1;
end

% === GENERATE SQUARE CARRIER FOR REFERENCE PLOTTING ===
carrierSquare = double(mod(t * fs_carrier, 1) < 0.5);

% === TRIM TO FIRST 3 CYCLES OF MESSAGE SIGNAL FOR VISUALIZATION ===
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);

% === PLOTTING ===
figure('Name', 'PWM with Square Wave Carrier', '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);
hold off;

xlabel('Time (s)');
ylabel('Amplitude');
title('PWM Output with Square Wave Carrier');
legend('Message Signal (Sine)', 'Square Carrier', 'PWM Output', 'Location', 'southoutside', 'Orientation', 'horizontal');
grid on;
web('https://www.salimwireless.com/search?q=pwm%20pulse%20modulation', '-browser');

Output

 
Parameter PAM PWM PPM DM PCM
Parameter varied Signal amplitude Pulse duration Pulse timing Sample difference (delta) Digital code
Pulse duration Fixed Adjustable Fixed Fixed Fixed
Resistance to noise Poor Average Good Average Good
Bandwidth requirement Low Moderate High Low High
Implementation complexity Low Medium High Low High
MATLAB implementation PAM Script PWM Script PPM Script DM Script PCM Script
Further reading PAM PWM PPM DM PCM

PWM Signal Generation

 

 
 
 

Further Reading



Contact Us

Name

Email *

Message *

Popular Posts

Design of CMOS Flip-Flops (SR, D, JK)

Design of CMOS Flip-Flops (SR, D, JK) A flip-flop or latch is a circuit with two stable states, used to store state information. It is the basic storage element in sequential logic and a fundamental building block in digital electronics systems, including computers and communication devices. Flip-flops and latches act as data storage elements for states, pulse counting, and synchronization of variably-timed input signals to a reference clock. Flip-flops can be transparent/opaque (latches) or clocked (synchronous, edge-triggered). Latches are level-sensitive, while flip-flops are edge-sensitive. In sequential logic, the output depends on current inputs and previous states. Fig.1 shows a sequential circuit combining a combinational block and a memory element. ...

FFT Butterfly Method Explained (with Simulations)

4-Point FFT Using Butterfly Method Given: x[n] = {0, 1, 2, 3} Step 1: Split into Even & Odd Even indices: x e = {x[0], x[2]} = {0, 2} Odd indices: x o = {x[1], x[3]} = {1, 3} Step 2: 2-point DFT For any {a, b}: DFT = {a + b, a - b} Even Part (E): {0+2, 0-2} = {2, -2} Odd Part (O): {1+3, 1-3} = {4, -2} Step 3: Combine Using Butterfly X[k] = E[k] + W 4 k O[k] X[k + 2] = E[k] - W 4 k O[k] Twiddle Factors (N=4): W 4 0 = 1, W 4 1 = -j Final Calculations: X[0] = E[0] + W 4 0 O[0] = 2 + (1)(4) = 6 X[2] = E[0] - W 4 0 O[0] = 2 - (1)(4) = -2 X[1] = E[1] + W 4 1 O[1] = -2 + (-j)(-2) = -2 + 2j X[3] = E[1] - W 4 1 O[1] = -2 - (-j)(-2) = -2 - 2j Final Answer: X[k] = {6, -2 + 2j, -2, -2 - 2j} 8-Point FFT Using Butterfly Method Given: x[n] = {0,1,2,3,4,5,6,7} Step 1: Split into Bit-Reversed Order To perform DIT-FFT, split the 8 points into pairs of two: Group A: {x[0], x[4]} = {0, 4}...

BER vs SNR for M-ary QAM, M-ary PSK, QPSK, BPSK, ...(MATLAB Code + Simulator)

Bit Error Rate (BER) & SNR Guide Analyze communication system performance with our interactive simulators and MATLAB tools. 📘 Theory 🧮 Simulators 💻 MATLAB Code 📚 Resources BER Definition SNR Formula BER Calculator MATLAB Comparison 📂 Explore M-ary QAM, PSK, and QPSK Topics ▼ 🧮 Constellation Simulator: M-ary QAM 🧮 Constellation Simulator: M-ary PSK 🧮 BER calculation for ASK, FSK, and PSK 🧮 Approaches to BER vs SNR Calculation What is Bit Error Rate (BER)? The BER indicates how many corrupted bits are received compared to the total number of bits sent. It is the primary figur...

Pulse Amplitude Modulation and Demodulation

📘 Overview & Theory of Pulse Amplitude Moduation (PAM) 🧮 Pulse Amplitude Demoduation 🧮 MATLAB Code for PAM 📚 Further Reading 📂 Other Topics on Pulse Amplitude Modulation ... 🧮 Simulation results for comparison of PAM, PWM, PPM, DM, and PCM 🧮 Other Pulse Modulation Techniques (e.g., PWM, PPM, DM, and PCM) 🧮 MATLAB Code for Pulse Amplitude Modulation and Demodulation of an Analog Signal (2) 🧮 MATLAB Code for Pulse Amplitude Modulation and Demodulation of Digital data  Pulse Amplitude Modulation (PAM) Sampling allow us to represent real world continuous signal, such as audio or video, in a format suitable for digital processing and storage. This sampled discrete-time signal is inherently digital. A digital signal is a discrete-time signal that is further quantized in amplitude. Pulse Amplitude modulation (PAM) is the modulation technique in which amplitude of carrier pulses is...

Q-function in BER vs SNR Calculation (with Simulation)

Q-function in BER vs. SNR Calculation In digital communications and signal processing, the Q-function plays a significant role in predicting system reliability. It allows engineers to quantify the probability that Gaussian noise will exceed a specific threshold, causing a bit error. What is the Q-function? The Q-function is a mathematical function representing the tail probability of the standard normal (Gaussian) distribution. It is the complementary cumulative distribution function (CCDF) of a standard Gaussian distribution. Q(x) = (1 / √(2Ï€)) ∫â‚“∞ e^(-t² / 2) dt The Role of the Q-function in BER vs. SNR The Q-function is the standard tool for calculating BER in systems like BPSK or QPSK over AWGN (Additive White Gaussian Noise) channels. For BPSK: In BPSK, we transmit +√E b (bit 1) and -√E b (bit 0). The decision boundary is set at 0 . If -√E b was sent, an error occurs if noise r > √...

Channel Impulse Response (CIR) (with MATLAB + Simulator)

📘 Overview & Theory 📘 How CIR Affects the Signal 🧮 Online Channel Impulse Response Simulator 🧮 MATLAB Codes 📚 Further Reading What is the Channel Impulse Response (CIR)? The Channel Impulse Response (CIR) is a concept primarily used in the field of telecommunications and signal processing. It provides information about how a communication channel responds to an impulse signal. It describes the behavior of a communication channel in response to an impulse signal. In signal processing, an impulse signal has zero amplitude at all other times and amplitude ∞ at time 0 for the signal. Using a Dirac Delta function, we can approximate this. Fig: Dirac Delta Function The result of this calculation is that all frequencies are responded to equally by δ(t) . This is crucial since we never know which frequenci...

MATLAB Code for BER performance of QPSK with BPSK, 4-QAM, 16-QAM, 64-QAM, 256-QAM, etc

📘 Overview 🧮 MATLAB Codes 🧮 Online Simulator for Calculating BER of M-ary PSK and QAM 🧮 QPSK vs BPSK and QAM: A Comparison of Modulation Schemes in Wireless Communication 🧮 Are QPSK and 4-PSK same? 📚 Further Reading   QPSK offers double the data rate of BPSK while maintaining a similar bit error rate at low SNR when Gray coding is used. It shares spectral efficiency with 4-QAM and can outperform 4-QAM or 16-QAM in very noisy channels. QPSK is widely used in practical wireless systems, often alongside QAM in adaptive modulation schemes [Read more...] What is the Gray Code? Gray Code: Gray code is a binary numeral system where two successive values differ in only one bit. This property is called the single-bit difference or unit distance code. It is also known as reflected binary code. Let's convert binary 111 to Gray code: Binary bits: B = 1 1 1 Apply the rule: G[0] = B[0] = 1...

MATLAB Code for QPSK Modulation and Demodulation

📘 Overview 🧮 MATLAB Codes 🧮 Theory 🧮 BER performance of QPSK with BPSK, 4-QAM, 16-QAM, 64-QAM, 256-QAM, etc 📚 Further Reading QPSK Passband Signal Generation Spectral Efficiency in QPSK   Quadrature Phase Shift Keying (QPSK) is a digital modulation scheme that conveys two bits per symbol by changing the phase of the carrier signal. Each pair of bits is mapped to one of four possible phase shifts: 0°, 90°, 180°, or 270° 00  ===> 0 degree phase shift of carrier signal 01  ===> 90 degree 11  ===> 180 degree 10  ===> 270 degree   MATLAB Script clc; clear all; close all; clc; M = 4; data = randi([0 (M-1)], 1000, 1); Phase = 0; modData=pskmod(data,M,Phase); figure(1); scatterplot(modData); channelAWGN = 15; rxData2 = awgn(modData, channelAWGN); figure(2); scatterplot(rxData2); demodData = pskdemod(rxData2,M,Phase);   Result data 1 0 2 2 0 2 1 . . . modData -1.0...