EXP NUMBER 3 ISI WITH PAM clear all; clc; N = 10^5; %Number of symbols to transmit MOD_TYPE = 'PAM'; %modulation type M = 4; %modulation level for the chosen modulation MOD_TYPE d = ceil(M.*rand(1,N)); %random numbers from 1 to M for input to PAM u = modulate(MOD_TYPE,M,d);%MPAM modulation figure; stem(real(u)); %plot modulated symbols title('PAM modulated symbols u(k)'); xlim([0 20]) ylim([-5 5]) L=4; %Oversampling factor (L samples per symbol period) v=[u;zeros(L-1,length(u))];%insert L-1 zero between each symbols %Convert to a single stream v=v(:).';%now the output is at sampling rate figure;stem(real(v)); title('Oversampled symbols v(n)'); xlim([0 150]) ylim([-5 5]) %----Pulse shaping----- beta = 0.3;% roll-off factor for Tx SRRC filter Nsym=8;%SRRC filter span in symbol durations L=4; %Oversampling factor (L samples per symbol period) [p,t,filtDelay] = srrcFunction(beta,L,Nsym);%design filter s=conv(v,p,'full');%Convolve modulated syms with p[n] filter figure; plot(real(s),'r'); title('Pulse shaped symbols s(n)'); xlim([0 150]) ylim([-5 5]) EbN0dB = 1000; %EbN0 in dB for AWGN channel snr = 10*log10(log2(M))+EbN0dB; %Converting given Eb/N0 dB to SNR %log2(M) gives the number of bits in each modulated symbol r = add_awgn_noise(s,snr,L); %AWGN , add noise for given SNR, r=s+w %L is the oversampling factor used in simulation figure; plot(real(r),'r');title('Received signal r(n)'); xlim([0 150]) ylim([-5 5]) vCap=conv(r,p,'full');%convolve received signal with Rx SRRC filter figure; plot(real(vCap),'r'); title('After matched filtering $\hat{v}$(n)','Interpreter','Latex'); xlim([0 150]) ylim([-20 20]) %------Symbol rate Sampler----- uCap = vCap(2*filtDelay+1:L:end-(2*filtDelay))/L; %downsample by L from 2*filtdelay+1 position result by normalized L, %as the matched filter result is scaled by L figure; stem(real(uCap)); hold on; title('After symbol rate sampler $\hat{u}$(n)',... 'Interpreter','Latex'); dCap = demodulate(MOD_TYPE,M,uCap); %demodulation xlim([0 20]) ylim([-5 5]) %plot eye at the receiver after matched filtering figure; plotEyeDiagram(vCap,L,3*L,2*filtDelay,100); xlim([0 3]) ylim([-15 15]) EXP NUMBER 5A.DSSS clear all; %% parameters Fs = 1000; fc = 100; fp = 4; bit_t = 0.1; %% message generation with BPSK m = [0 0 1 1 1 1 0 0]; for bit = 1:length(m) if(m(bit)==0) m(bit) = -1; end end message = repmat(m,fp,1); message = reshape(message,1,[]); %% PN generation and multiply with message pn_code = randi([0,1],1,length(m)*fp); for bit = 1:length(pn_code) if(pn_code(bit)==0) pn_code(bit) = -1; end end DSSS = message.*pn_code; %% create carrier and multipy with encoded sequence t = 0:1/Fs:(bit_t-1/Fs); s0 = -1*cos(2*pi*fc*t); s1 = cos(2*pi*fc*t); carrier = []; BPSK = []; for i = 1:length(DSSS) if (DSSS(i) == 1) BPSK = [BPSK s1]; elseif (DSSS(i) == -1) BPSK = [BPSK s0]; end carrier = [carrier s1]; end %% demodulation rx =[]; for i = 1:length(pn_code) if(pn_code(i)==1) rx = [rx BPSK((((i-1)*length(t))+1):i*length(t))]; else rx = [rx (-1)*BPSK((((i-1)*length(t))+1):i*length(t))]; end end demod = rx.*carrier; result = []; for i = 1:length(m) x = length(t)*fp; cx = sum(carrier(((i-1)*x)+1:i*x).*demod(((i-1)*x)+1:i*x)); if(cx>0) result = [result 1]; else result = [result -1]; end end pn_codeWrong = randi([0,1],1,length(m)*fp); resultWrong = []; rx2 =[]; for i = 1:length(pn_code) if(pn_codeWrong(i)==1) rx2 = [rx2 BPSK((((i-1)*length(t))+1):i*length(t))]; else rx2 = [rx2 (-1)*BPSK((((i-1)*length(t))+1):i*length(t))]; end end demod2 = rx2.*carrier; for i = 1:length(m) x = length(t)*fp; cx = sum(carrier(((i-1)*x)+1:i*x).*demod2(((i-1)*x)+1:i*x)); if(cx>0) resultWrong = [resultWrong 1]; else resultWrong = [resultWrong -1]; end end message1 = repmat(result,fp,1); message1 = reshape(message1,1,[]); message2 = repmat(resultWrong,fp,1); message2 = reshape(message2,1,[]); %% Draw original message, PN code , encoded sequence on time domain pn_size = length(pn_code); tpn = linspace(0,length(m)*bit_t-bit_t/fp,pn_size); tm = 0:bit_t/fp:length(m)*bit_t-bit_t/fp; figure subplot(311) stairs(tm,message,'linewidth',2) title('Message bit sequence') axis([0 length(m)*bit_t -1 1]); subplot(312) stairs(tpn,pn_code,'linewidth',2) title('Pseudo-random code'); axis([0 length(m)*bit_t -1 1]); subplot(313) stairs(tpn,DSSS,'linewidth',2) title('Modulated signal'); axis([0 length(m)*bit_t -1 1]); figure subplot(311) stairs(tm,message,'linewidth',2) title('Message bit sequence') axis([0 length(m)*bit_t -1 1]); subplot(312) stairs(tm,message1,'linewidth',2) title('Received message using true pseudo-random code') axis([0 length(m)*bit_t -1 1]); subplot(313) stairs(tm,message2,'linewidth',2) title('Received message using wrong pseudo-random code') axis([0 length(m)*bit_t -1 1]); %% Draw original message, PN code , encoded sequence on frequency domain f = linspace(-Fs/2,Fs/2,1024); figure subplot(311) plot(f,abs(fftshift(fft(message,1024))),'linewidth',2); title('Message spectrum') subplot(312) plot(f,abs(fftshift(fft(pn_code,1024))),'linewidth',2); title('Pseudo-random code spectrum'); subplot(313) plot(f,abs(fftshift(fft(DSSS,1024))),'linewidth',2); title('Modulated signal spectrum'); figure; subplot(311) plot(f,abs(fftshift(fft(BPSK,1024))),'linewidth',2); title('Transmitted signal spectrum'); subplot(312) plot(f,abs(fftshift(fft(rx,1024))),'linewidth',2); title('Received signal multiplied by pseudo code'); subplot(313) plot(f,abs(fftshift(fft(demod,1024))),'linewidth',2); title('Demodulated signal spectrum before decision device '); EXP NUMBER 5B FHSS FHSS clc; clear all;% Parameters num_bits = 20; % Number of bits samples_per_bit = 120; % Samples per bit num_carriers = 6; % Number of carrier frequencies samples = [10, 20, 30, 40, 60, 120]; % Samples for each carrier frequency % Manual Entry of Bit Sequence disp('Enter your bit sequence as a series of 1s and 0s separated by spaces (e.g., "1 0 1 1 0"):'); manual_input = input('', 's'); % Take input as a string bit_sequence = str2num(manual_input); % Convert to numeric array if length(bit_sequence) ~= num_bits error('The number of bits entered must match the defined number of bits (%d).', num_bits); end % Convert 0 -> -1, 1 -> +1 for BPSK sequence = 2 * bit_sequence - 1; % Repeat bits for the bit duration input_signal = repelem(sequence, samples_per_bit); % Repeat for bit duration % Generate Carrier Signal with Exact Length t_carrier = linspace(0, 2*pi*num_bits, samples_per_bit*num_bits); % Time vector carrier_signal = cos(t_carrier); % Continuous cosine carrier wave % Plot Original Bit Sequence figure(1); subplot(4,1,1); plot(input_signal); axis([-100 2400 -1.5 1.5]); title('\bf\it Original Bit Sequence'); % BPSK Modulation bpsk_mod_signal = input_signal .* carrier_signal; subplot(4,1,2); plot(bpsk_mod_signal); axis([-100 2400 -1.5 1.5]); title('\bf\it BPSK Modulated Signal'); % Generate 6 Carrier Frequencies carriers = cell(1, num_carriers); for i = 1:num_carriers t = linspace(0, 2*pi, samples(i) + 1); t(end) = []; % Time for each carrier carriers{i} = repmat(cos(t), 1, ceil(samples_per_bit / length(t))); carriers{i} = carriers{i}(1:samples_per_bit); % Trim to exact length end % Spread Signal with Random Carrier Frequencies spread_signal = []; for i = 1:num_bits carrier_idx = randi([1, num_carriers]); % Randomly select a carrier spread_signal = [spread_signal carriers{carrier_idx}]; end subplot(4,1,3); plot(spread_signal); axis([-100 2400 -1.5 1.5]); title('\bf\it Spread Signal with 6 frequencies'); % Spreading BPSK Signal freq_hopped_sig = bpsk_mod_signal .* spread_signal; subplot(4,1,4); plot(freq_hopped_sig); axis([-100 2400 -1.5 1.5]); title('\bf\it Frequency Hopped Spread Spectrum Signal'); % Demodulation bpsk_demodulated = freq_hopped_sig ./ spread_signal; figure(2); subplot(2,1,1); plot(bpsk_demodulated); axis([-100 2400 -1.5 1.5]); title('\bf Demodulated BPSK Signal from Wide Spread'); % Recover Original Bit Sequence original_BPSK_signal = bpsk_demodulated ./ carrier_signal; subplot(2,1,2); plot(original_BPSK_signal); axis([-100 2400 -1.5 1.5]); title('\bf Transmitted Original Bit Sequence'); E6L = 4; % Oversampling factor rollOff = 0.5; % Pulse shaping roll-off factor rcDelay = 10; % Filter: htx = rcosdesign(rollOff, 6, 4); % Note half of the target delay is used, because when combined % to the matched filter, the total delay will be achieved. hrx = conj(fliplr(htx)); p = conv(htx,hrx); M = 2; % PAM Order % Arbitrary binary sequence alternating between 0 and 1 data = zeros(1, 2*rcDelay); data(1:2:end) = 1; % PAM-modulated symbols: txSym = real(pammod(data, M)); % Upsampling txUpSequence = upsample(txSym, L); % Pulse Shaping txSequence = filter(htx, 1, txUpSequence); %Delay in channel random channel propagation delay in units of sampling intervals (not symbol intervals) timeOffset = 1; % Delay (in samples) added % Delayed sequence rxDelayed = [zeros(1, timeOffset), txSequence(1:end-timeOffset)]; % Received sequence with Delayed mfOutput = filter(hrx, 1, rxDelayed); % Matched filter output rxSym = downsample(mfOutput, L); % Generate a vector that shows the selected samples selectedSamples = upsample(rxSym, L); selectedSamples(selectedSamples == 0) = NaN; % scatter plot figure plot(complex(rxSym(rcDelay+1:end)), 'o') grid on xlim([-1.5 1.5]) title('Rx Scatterplot') xlabel('In-phase (I)') ylabel('Quadrature (Q)') figure stem(rxSym) title('Symbol Sequence with delay') xlabel('Symbol Index') ylabel('Amplitude') %Symbol timing recovery rxSym = downsample(mfOutput, L, timeOffset); selectedSamples = upsample(rxSym, L); selectedSamples(selectedSamples == 0) = NaN; figure plot(complex(rxSym(rcDelay+1:end)), 'o') grid on xlim([-1.5 1.5]) title('Rx Scatterplot') xlabel('In-phase (I)') ylabel('Quadrature (Q)') figure stem(rxSym) title('Symbol Sequence without delay') xlabel('Symbol Index') ylabel('Amplitude') Exp 6 E6L = 4; % Oversampling factor rollOff = 0.5; % Pulse shaping roll-off factor rcDelay = 10; % Filter: htx = rcosdesign(rollOff, 6, 4); % Note half of the target delay is used, because when combined % to the matched filter, the total delay will be achieved. hrx = conj(fliplr(htx)); p = conv(htx,hrx); M = 2; % PAM Order % Arbitrary binary sequence alternating between 0 and 1 data = zeros(1, 2*rcDelay); data(1:2:end) = 1; % PAM-modulated symbols: txSym = real(pammod(data, M)); % Upsampling txUpSequence = upsample(txSym, L); % Pulse Shaping txSequence = filter(htx, 1, txUpSequence); %Delay in channel random channel propagation delay in units of sampling intervals (not symbol intervals) timeOffset = 1; % Delay (in samples) added % Delayed sequence rxDelayed = [zeros(1, timeOffset), txSequence(1:end-timeOffset)]; % Received sequence with Delayed mfOutput = filter(hrx, 1, rxDelayed); % Matched filter output rxSym = downsample(mfOutput, L); % Generate a vector that shows the selected samples selectedSamples = upsample(rxSym, L); selectedSamples(selectedSamples == 0) = NaN; % scatter plot figure plot(complex(rxSym(rcDelay+1:end)), 'o') grid on xlim([-1.5 1.5]) title('Rx Scatterplot') xlabel('In-phase (I)') ylabel('Quadrature (Q)') figure stem(rxSym) title('Symbol Sequence with delay') xlabel('Symbol Index') ylabel('Amplitude') %Symbol timing recovery rxSym = downsample(mfOutput, L, timeOffset); selectedSamples = upsample(rxSym, L); selectedSamples(selectedSamples == 0) = NaN; figure plot(complex(rxSym(rcDelay+1:end)), 'o') grid on xlim([-1.5 1.5]) title('Rx Scatterplot') xlabel('In-phase (I)') ylabel('Quadrature (Q)') figure stem(rxSym) title('Symbol Sequence without delay') xlabel('Symbol Index') ylabel('Amplitude') EXP NUMBER 7A FSEL clc;clear all;close all; fs = 1e6; % Sample rate (1 MHz) numSamples = 10000; % Number of samples numPaths = 5; % Number of multipath components maxDelay = 3e-6; % Maximum delay spread (3 microseconds) dopplerShift = 100; % Maximum Doppler shift (100 Hz) % Generate an impulse signal (delta function) impulseSignal = [1; zeros(numSamples-1, 1)]; % An impulse signal % Create a frequency-selective Rayleigh fading channel rayleighChan = comm.RayleighChannel( ... 'SampleRate', fs, ... 'PathDelays', linspace(0, maxDelay, numPaths), ... % Multipath delays 'AveragePathGains', [-2 -3 -6 -8 -10], ... % Path gains (dB) 'MaximumDopplerShift', dopplerShift, ... % Doppler shift 'NormalizePathGains', true); % Pass the impulse signal through the frequency-selective fading channel rxImpulseSignal = rayleighChan(impulseSignal); % Plot the impulse response timeAxis = (0:numSamples-1)/fs; % Time axis for plotting figure; stem(timeAxis(1:100), 20*log10(abs(rxImpulseSignal(1:100)))); % Plot first 100 samples in dB title('Impulse Response of Frequency-Selective Rayleigh Fading Channel'); xlabel('Time (s)');ylabel('Gain (dB)');grid on; % Frequency Response NFFT = 1024; % FFT size for frequency response freqResponse = fft(rxImpulseSignal, NFFT); % FFT of the received impulse signal freqAxis = linspace(-fs/2, fs/2, NFFT); % Frequency axis % Plot the frequency response figure; plot(freqAxis/1e6, 20*log10(abs(fftshift(freqResponse)))); % Shift zero frequency to center title('Frequency Response of Frequency-Selective Rayleigh Fading Channel'); xlabel('Frequency (MHz)');ylabel('Magnitude (dB)');grid on; EXP NUMBER 7B FNSEL clc;clear all;close all fs = 1e6; % Sample rate (1 MHz) numSamples = 10000; % Number of samples maxDopplerShift = 100; % Maximum Doppler shift (100 Hz) % Generate random data signal (complex baseband) txSignal = (randn(numSamples, 1) + 1j*randn(numSamples, 1)); % Complex Gaussian signal % Create flat Rayleigh fading channel rayleighChan = comm.RayleighChannel( ... 'SampleRate', fs, ... 'MaximumDopplerShift', maxDopplerShift, ... % Doppler shift 'NormalizePathGains', true); % Normalize path gains % Pass the signal through the flat Rayleigh fading channel rxSignal = rayleighChan(txSignal); % Plot the transmitted and received signals (first 100 samples) figure;subplot(2, 1, 1); plot(real(txSignal(1:100)), 'b-o');hold on; plot(imag(txSignal(1:100)), 'r-x'); title('Transmitted Signal (First 100 Samples)'); xlabel('Sample Index');ylabel('Amplitude'); legend('Real Part', 'Imaginary Part');grid on; subplot(2, 1, 2); plot(real(rxSignal(1:100)), 'b-o');hold on; plot(imag(rxSignal(1:100)), 'r-x'); title('Received Signal through Flat Rayleigh Fading Channel (First 100 Samples)'); xlabel('Sample Index');ylabel('Amplitude'); legend('Real Part', 'Imaginary Part');grid on; % Compute and plot the power spectral density (PSD) of the transmitted and received signals figure; pwelch(txSignal, [], [], [], fs, 'centered');hold on; pwelch(rxSignal, [], [], [], fs, 'centered'); title('Power Spectral Density (PSD) of Transmitted and Received Signals'); xlabel('Frequency (Hz)');ylabel('Power/Frequency (dB/Hz)'); legend('Transmitted Signal', 'Received Signal');grid on; EXP NUMBER 6 SYMBOL TIMING ESTIMATION L = 4; % Oversampling factor rollOff = 0.5; % Pulse shaping roll-off factor rcDelay = 10; % Filter: htx = rcosdesign(rollOff, 6, 4); % Note half of the target delay is used, because when combined % to the matched filter, the total delay will be achieved. hrx = conj(fliplr(htx)); p = conv(htx,hrx); M = 2; % PAM Order % Arbitrary binary sequence alternating between 0 and 1 data = zeros(1, 2*rcDelay); data(1:2:end) = 1; % PAM-modulated symbols: txSym = real(pammod(data, M)); % Upsampling txUpSequence = upsample(txSym, L); % Pulse Shaping txSequence = filter(htx, 1, txUpSequence); %Delay in channel random channel propagation delay in units of sampling intervals (not symbol intervals) timeOffset = 1; % Delay (in samples) added % Delayed sequence rxDelayed = [zeros(1, timeOffset), txSequence(1:end-timeOffset)]; % Received sequence with Delayed mfOutput = filter(hrx, 1, rxDelayed); % Matched filter output rxSym = downsample(mfOutput, L); % Generate a vector that shows the selected samples selectedSamples = upsample(rxSym, L); selectedSamples(selectedSamples == 0) = NaN; % scatter plot figure plot(complex(rxSym(rcDelay+1:end)), 'o') grid on xlim([-1.5 1.5]) title('Rx Scatterplot') xlabel('In-phase (I)') ylabel('Quadrature (Q)') figure stem(rxSym) title('Symbol Sequence with delay') xlabel('Symbol Index') ylabel('Amplitude') %Symbol timing recovery rxSym = downsample(mfOutput, L, timeOffset); selectedSamples = upsample(rxSym, L); selectedSamples(selectedSamples == 0) = NaN; figure plot(complex(rxSym(rcDelay+1:end)), 'o') grid on xlim([-1.5 1.5]) title('Rx Scatterplot') xlabel('In-phase (I)') ylabel('Quadrature (Q)') figure stem(rxSym) title('Symbol Sequence without delay') xlabel('Symbol Index') ylabel('Amplitude') EXP NUMBER 8 CARRIER PAHSE NDDL DDL % MATLAB Code for Carrier Phase Estimation % Parameters clear all; clc; N = 1000; % Number of symbols SNR_dB = 10; % Signal-to-Noise Ratio in dB M = 4; % QPSK modulation order loop_bandwidth = 0.01; % PLL loop bandwidth true_phase = pi / 3; % True phase of the carrier % Generate QPSK symbols tx_symbols = exp(1j * (2 * pi * (0:M-1) / M)); % QPSK constellation points tx_data = randi([0 M-1], N, 1); % Random data tx_signal = tx_symbols(tx_data + 1); % Modulated signal % Add noise to the transmitted signal noise = (1/sqrt(2*10^(SNR_dB/10))) * (randn(N, 1) + 1j * randn(N, 1)); rx_signal = tx_signal .* exp(1j * true_phase) + noise; % Received signal % 1. Maximum Likelihood Carrier Phase Estimation estimated_phase_ml = angle(sum(conj(tx_signal) .* rx_signal)); % ML estimation %fprintf('True Phase: %.2f rad, Estimated Phase (ML): %.2f rad\n', true_phase, estimated_phase_ml); % 2. Phase-Locked Loop (PLL) Implementation phase_error_pll = zeros(N, 1); % Phase error for PLL estimated_phase_pll = zeros(N, 1); % Estimated phase for PLL current_phase_estimate_pll = 0; % Initial phase estimate for PLL for n = 1:N % Phase detection phase_error_pll(n) = angle(rx_signal(n) * exp(-1j * current_phase_estimate_pll)); current_phase_estimate_pll = current_phase_estimate_pll + loop_bandwidth * phase_error_pll(n); estimated_phase_pll(n) = current_phase_estimate_pll; end % 3. Apply Phase Correction to Received Signal corrected_rx_signal = rx_signal .* exp(-1j * estimated_phase_pll); % Corrected received signal % Plot Original and Corrected Constellation Diagrams figure; subplot(2, 1, 1); scatter(real(rx_signal), imag(rx_signal), 'filled'); title('Received Signal Constellation Diagram'); xlabel('In-Phase'); ylabel('Quadrature'); axis equal; grid on; subplot(2, 1, 2); scatter(real(corrected_rx_signal), imag(corrected_rx_signal), 'filled'); title('Corrected Signal Constellation Diagram'); xlabel('In-Phase'); ylabel('Quadrature'); axis equal; grid on; % 4. Effect of Additive Noise on Phase Estimate SNR_dB_range = 0:2:20; % SNR range for variance calculation phase_error_variance = zeros(length(SNR_dB_range), 1); for idx = 1:length(SNR_dB_range) SNR_dB = SNR_dB_range(idx); noise_variance = 1/(2*10^(SNR_dB/10)); noise = sqrt(noise_variance) * (randn(N, 1) + 1j * randn(N, 1)); % Received signal with noise rx_signal = exp(1j * true_phase) + noise; % Use a single reference for variance calculation % ML phase estimation estimated_phase = angle(sum(rx_signal)); % Phase error variance phase_error_variance(idx) = var(angle(rx_signal) - true_phase); end % Plot the phase error variance as a function of SNR figure; plot(SNR_dB_range, phase_error_variance); xlabel('SNR (dB)'); ylabel('Phase Error Variance'); title('Effect of Noise on Phase Estimation'); % 5. Decision-Directed and Non-Decision-Directed Loops phase_error_dd = zeros(N, 1); % Decision-directed phase error phase_error_ndd = zeros(N, 1); % Non-decision-directed phase error estimated_phase_dd = zeros(N, 1); estimated_phase_ndd = zeros(N, 1); % Initialization current_phase_estimate_dd = 0; current_phase_estimate_ndd = 0; for n = 1:N % Simulate received signal with phase offset and noise noise = (1/sqrt(2*10^(SNR_dB))) * (randn + 1j * randn); rx_signal = tx_signal(n) * exp(1j * true_phase) + noise; % Decision-Directed (DD) Loop detected_symbol = exp(1j * round(angle(rx_signal) * M / (2 * pi)) * 2 * pi / M); % Symbol detection phase_error_dd(n) = angle(detected_symbol * exp(-1j * current_phase_estimate_dd)); current_phase_estimate_dd = current_phase_estimate_dd + loop_bandwidth * phase_error_dd(n); estimated_phase_dd(n) = current_phase_estimate_dd; % Non-Decision-Directed (NDD) Loop phase_error_ndd(n) = angle(rx_signal * exp(-1j * current_phase_estimate_ndd)); current_phase_estimate_ndd = current_phase_estimate_ndd + loop_bandwidth * phase_error_ndd(n); estimated_phase_ndd(n) = current_phase_estimate_ndd; end % Plot the results for DD and NDD loops figure; subplot(2, 1, 1); plot(1:N, estimated_phase_dd); title('Decision-Directed Phase Estimate'); xlabel('Samples'); ylabel('Estimated Phase (radians)'); subplot(2, 1, 2); plot(1:N, estimated_phase_ndd); title('Non-Decision-Directed Phase Estimate'); xlabel('Samples'); ylabel('Estimated Phase (radians)');