X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=passband.m;h=9e88af601025b5bec52eaa1eb05fad173cc9f7c8;hb=79d2449ec584f264ec917541762b63140693238d;hp=5424ea41ca66670bd445d084756f010452af8146;hpb=a4b0109e3e2d8034cf3ad776ed6c607b668b54ec;p=4yp.git diff --git a/passband.m b/passband.m index 5424ea4..9e88af6 100644 --- a/passband.m +++ b/passband.m @@ -10,25 +10,12 @@ function passband(rolloff, M, numSymbs) rolloff = 0.5; end - %% https://www.mathworks.com/help/comm/examples/passband-modulation-with-adjacent-channel-interference.html - Rsym = 1e6; % symbol rate (sym/sec) + Rsym = 2.5e10; % symbol rate (sym/sec) span = 6; % filter span sps = 4; % samples per symbol - txFilter = comm.RaisedCosineTransmitFilter... - ('Shape', 'Square root', ... - 'RolloffFactor', rolloff, ... - 'FilterSpanInSymbols', span, ... - 'OutputSamplesPerSymbol', sps); - rxFilter = comm.RaisedCosineReceiveFilter... - ('Shape', 'Square root', ... - 'RolloffFactor', rolloff, ... - 'FilterSpanInSymbols', span, ... - 'InputSamplesPerSymbol', sps, ... - 'DecimationFactor', 1); - fs = Rsym * sps; % sampling freq (Hz) t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs)'; @@ -49,80 +36,39 @@ function passband(rolloff, M, numSymbs) ber = zeros(1, plotlen); - - data = randi([0 M - 1], numSymbs, 1); modData = pskmod(data, M, 0, 'gray'); - xBaseband = txFilter([modData; zeros(span, 1)]); - + xBaseband = txFilter(modData, rolloff, span, sps); - %fc = 2.5e6; % Carrier freq (Hz) - %carrier = sqrt(2) * exp(j * 2 * pi * fc * t); - - %xPassbandIdeal = normalizeEnergy... - % (real(xBaseband .* carrier(1:length(xBaseband))), numSymbs, 1); - - %txLOFreq = [2.49e6, 2.5e6, 2.51e6]; - %%txLOEnergy = [0.05, 0.9, 0.05]; - %txLOEnergy = [0 1 0]; - txLOFreq = [1e8]; - txLOEnergy = [1]; - - carrier = zeros(length(t), 1); - for i = 1 : length(txLOFreq) - carrier = carrier + ... - sqrt(2 * txLOEnergy(i)) * exp(j * 2 * pi * txLOFreq(i) * t); - end + fc = 1e12; % Carrier freq (Hz) + carrier = sqrt(2) * exp(j * 2 * pi * fc * t); - xPassband = normalizeEnergy... - (xBaseband .* carrier(1:length(xBaseband)), numSymbs, 1); + xPassband = xBaseband .* carrier(1:length(xBaseband)); for i = 1:plotlen - snr = EbN0_db(i) + 10 * log10(log2(M)) - 10 * log10(sps); % why sps? + snr = EbN0_db(i) + 10 * log10(log2(M)) - 10 * log10(sps); noiseEnergy = 10 ^ (-snr / 10); yPassband = awgn(xPassband, snr, 'measured'); - - rBaseband = rxFilter([yPassband .* conj(carrier(1:length(yPassband))); zeros(span * sps, 1)]); - %% truncate filter transients - rBaseband = rBaseband(span * sps / 2 + 1 : end); - %% normalize energy - rBaseband = normalizeEnergy(rBaseband, numSymbs, 1 + noiseEnergy); + yLO = yPassband .* conj(carrier(1:length(yPassband))); + rBaseband = rxFilter(yLO, rolloff, span, sps); rSampled = rBaseband(sps*span/2+1:sps:(numSymbs + span/2) * sps); demodData = pskdemod(rSampled, M, 0, 'gray'); [bitErrors, ber(i)] = biterr(data, demodData); - end - fig1 = figure(1); + figure(1); clf; %% Plot simulated results semilogy(EbN0_db, ber, 'r', 'LineWidth', 2); hold on; - %% Plot theoretical curve - %% BPSK: bit error when noise Nr > sqrt(Eb) - %% Pr(Nr > sqrt(Eb)) - %% = Pr(Z > sqrt(Eb) / sqrt(N0/2)) - %% - %% QPSK = 2 BPSKs, one real and one imaginary, each with one bit - %% so BER is the same as BPSK (assuming Gray code) - if M == 2 || M == 4 - ber_th = qfunc(sqrt(2 * EbN0)); - semilogy(EbN0_db, ber_th, 'b', 'LineWidth', 1); - legend('Simulated RRC', 'Discrete'); - else - %% Approximation: J.G. Proakis and M. Salehi, 2000, Contemporary - %% Communication Systems using MATLAB (Equations - %% 7.3.18 and 7.3.19), Brooks/Cole. - ber_ap = 2 * qfunc(sqrt(EbN0 * log2(M) * 2) * sin(pi / M)) / log2(M); - semilogy(EbN0_db, ber_ap, 'b', 'LineWidth', 1); - legend('Simulated RRC', 'Discrete'); - end + theoreticalPSK(EbN0_db, M, 'b', 'LineWidth', 1); + legend('Simulated RRC', 'Discrete'); title(strcat(num2str(M), '-PSK RRC with Gray code')); grid on; @@ -130,16 +76,4 @@ function passband(rolloff, M, numSymbs) ylabel('BER'); formatFigure; - %saveas(gcf, strcat('BER_SNR_', num2str(M), 'PSK_', num2str(numSymbs), ... - % '.svg')); - - %scatterplot(rxFilt); - %eyediagram(rxFilt, sps); - -end - - -function y = normalizeEnergy(x, numSymbs, e) - energy = sum(abs(x) .^ 2) / numSymbs; - y = x * sqrt(e / energy); end