BPSK相干解調和DBPSK非相干解調誤碼率仿真
本腳本完成了BPSK和DBPSK兩種不一樣調製方式下的誤碼率(DBPSK差分相干)仿真, 並和理論曲線進行了對比。函數
撰寫人:*** 最後修改日期:2015-03-18 軟件版本:MATLAB(R) 2014a
程序添加和修改包括編碼
- BPSK未做修改
- DPSK添加了成型部分,同時從《高等數字通訊》中看到了DPSK最佳接收機的結構
待改進spa
- 怎樣選擇仿真點數才能保證結果可信,可信程度是多少?如何衡量?
Contents
初始設置
清空工做區,數據,關閉全部窗口3d
clc;clear all;close all;
仿真參數設置code
EbN0_dB = 1:8; % EbN0_dB 誤碼率範圍,向量; FRAMES_NUM = 100; % FRAMES_NUM 最大仿真幀數目; FRAMES_LENGTH = 1000; % FRAMES_LENGTH 每幀長度; UPSAMPLE_RATE = 8; % UPSAMPLE_RATE 過採樣率; berBpsk = zeros(1,length(EbN0_dB)); % berBpsk BPSK誤碼率統計,向量; berDbpsk = zeros(1,length(EbN0_dB)); % berDbpsk DBPSK誤碼率統計,向量; sqrtRaisedfilter = rcosfir(0.3,[-3,3],UPSAMPLE_RATE,1,'sqrt');
誤碼率仿真
針對不一樣EbN0先仿真BPSK和DBPSK誤碼率曲線blog
在不一樣EbN0下,對誤碼率進行仿真get
for nEbN0 = 1:length(EbN0_dB);
多幀取統計平均input
bpskErrorNum = 0;
dbpskErrorNum = 0;
for nFrame = 1:FRAMES_NUM
數據生成和基帶映射string
data = randi([0 1],1,FRAMES_LENGTH); bpskBaseband = 1 - 2*data; % 映射 0—+1;1—-1,已歸一化 data_extend = [1 data]; % 差分編碼,假設第一個數據爲1 for num = 2:FRAMES_LENGTH+1 data_extend(num) = xor(data_extend(num),data_extend(num-1)); end % 注意此時DBPSK多傳了一個1 dbpskBaseband = 1 - 2*data_extend; % 映射 0—+1;1—-1,已歸一化 % 方波成型 %dbpskBaseband = reshape(repmat(dbpskBaseband,UPSAMPLE_RATE,1),1,[]); % 匹配濾波 dbpskBaseband = upsample(dbpskBaseband,UPSAMPLE_RATE); dbpskBaseband = conv(dbpskBaseband,sqrtRaisedfilter,'same'); bpskTransmitSignal = bpskBaseband; % 不加載波 dbpskTransmitSignal = dbpskBaseband/sqrt(var(dbpskBaseband));
AWGN 信道,SNR和EbN0換算關係it
SNR_dB = EbN0_dB(nEbN0) + 10*log10(2) - 10*log10(1); SNR = 10^(SNR_dB/10);
接收信號的矢量等效
bpsknoise = 1/sqrt(SNR)*randn(1,length(bpskTransmitSignal));
bpskReceiveSignal = bpskTransmitSignal + bpsknoise;
SNR_dB = EbN0_dB(nEbN0) + 10*log10(2) - 10*log10(UPSAMPLE_RATE);
SNR = 10^(SNR_dB/10);
dbpsknoise = 1/sqrt(SNR)*randn(1,length(dbpskTransmitSignal)) + ...
1i*1/sqrt(SNR)*randn(1,length(dbpskTransmitSignal));
dbpskReceiveSignal = dbpskTransmitSignal + dbpsknoise;
BPSK誤比特數統計
bpskErrorNum = bpskErrorNum + sum(bpskBaseband.*bpskReceiveSignal<0);
DBPSK解調(通訊原理P209) 誤比特數統計,不是最佳接收 方波成型解調若是UPSAMPLE_RATE爲1,此時能使用sum函數
%dbpskReceiveSignal = sum(reshape(dbpskReceiveSignal,UPSAMPLE_RATE,[])); % 匹配濾波解調 dbpskReceiveSignal = conv(dbpskReceiveSignal,sqrtRaisedfilter,'same'); dbpskReceiveSignal = downsample(dbpskReceiveSignal,UPSAMPLE_RATE); dbpskDelay = dbpskReceiveSignal(2:end); dbpskJudgment = dbpskReceiveSignal(1:end-1).*dbpskDelay; dbpskDecodeData = zeros(1,length(data)); dbpskDecodeData(dbpskJudgment<0) = 1; %gt compares only the real part dbpskErrorNum = dbpskErrorNum + sum(abs(dbpskDecodeData-data));
end
誤碼率統計
berBpsk(nEbN0) = bpskErrorNum/FRAMES_NUM/FRAMES_LENGTH; berDbpsk(nEbN0) = dbpskErrorNum/FRAMES_NUM/FRAMES_LENGTH;
end
繪圖和數據輸出
繪製BPSK和DBPSK的仿真和理論誤碼率曲線
berBpskTheory = berawgn(EbN0_dB,'psk',2,'nondiff'); berDbpskTheory = berawgn(EbN0_dB,'dpsk',2,'nondiff'); fprintf('總幀數 = %d,幀長 = %d\n',FRAMES_NUM,FRAMES_LENGTH); table(EbN0_dB',berBpskTheory',berBpsk',berDbpskTheory',berDbpsk',... 'VariableNames', {'EbN0_dB','BpskTheory','BpskSim','DbpskTheory','DbpskSim'}) figure; semilogy(EbN0_dB,berDbpsk,'bd');hold on; semilogy(EbN0_dB,berDbpskTheory,'b-'); semilogy(EbN0_dB,berBpsk,'rs'); semilogy(EbN0_dB,berBpskTheory,'r-');hold off; legend('差分DPSK仿真','DPSK理論','相干BPSK仿真','相干BPSK理論'); xlabel('EbN0'); ylabel('BER'); grid on;
總幀數 = 100,幀長 = 1000 ans = EbN0_dB BpskTheory BpskSim DbpskTheory DbpskSim _______ __________ _______ ___________ ________ 1 0.056282 0.05494 0.14198 0.14132 2 0.037506 0.03737 0.10248 0.10291 3 0.022878 0.02259 0.067989 0.06888 4 0.012501 0.01247 0.040558 0.03912 5 0.0059539 0.0061 0.021165 0.02151 6 0.0023883 0.0024 0.0093328 0.00937 7 0.00077267 0.00079 0.0033292 0.00334 8 0.00019091 0.00022 0.0009094 0.00076
