qpsk matlab仿真,QPSK 调制与解调(Matlab仿真)
從零開始學可見光通信,從開始到絕望…………………………
幾點說明。
1. 一般在仿真的時候,大家都喜歡直接做等效基帶仿真(類似于星座點的仿真)。
但實際要傳,還是要傳頻帶的波形信號。
2. 為了模擬真實的環境,先把基帶信號經過一個自定義的信道,然后再做脈沖成型,上變頻,加一點噪聲AWGN進去。
3. 為了模擬同步,應該用專用的同步算法。但是這里的重點不在同步。所以用了很簡單粗暴的辦法。假裝直接同步上了。
4. 為了造出不同步的結果,可以這樣寫 x_未同步 = [x(300:end); x; x]; 相當于循環發送,循環接收。
這是仿真。
Main
%%
%?單載波QPSK?接收端
%?2017年5月17日18:02:56
clear;
close?all;
clc
rand_seed?=?0;
rand('seed',rand_seed);
randn('seed',rand_seed);
%%
%?Set?up?parameters?and?signals.
M?=?4;?%?Alphabet?size?for?modulation
baud_rate?=?100;?%?Baud?rate
f_carrier1?=?75;?%?Carrier?frequency
Nsym?=?10000;?%?Number?of?symbols
msg?=?randi([0?M-1],Nsym,1);?%?Random?message
hMod?=?comm.RectangularQAMModulator(M);
modmsg?=?step(hMod,msg);?%?Modulate?using?QAM.?%?映射后的基帶信號
trainlen?=?1000;?%?Length?of?training?sequence
rolloff?=?.3;?%?滾降因子
span?=?20?;?%?截斷長度
sps?=?10;??%?Samples?per?symbol
rrcFilter=rcosdesign(rolloff,span,sps,'sqrt');?%根升余弦滾降濾波器,‘sqrt’均方根升余弦;‘normal’升余弦
fs?=?baud_rate*sps;?%?時間采樣率,時間采樣間隔為?1/fs?秒
Tsymbol=1/baud_rate;
%?2.?脈沖成型
%?txSig?=?upfirdn(modmsg,?rrcFilter,?sps);??%?發送端的基帶復波形信號
%?chan?=?[1;?.001];
chan?=?[.986;?.845;?.237;?.123+.31i];?%?Channel?coefficients
%?chan?=?[1?0.45?0.3+0.2i];?%?Channel?coefficients
filtmsg?=?filter(chan,1,modmsg);?%?Introduce?channel?distortion.(已經經過信道的畸變的基帶復信號,星座點)
txSig?=?upfirdn(filtmsg,?rrcFilter,?sps);??%?發送端的基帶復波形信號
txSig?=?awgn(txSig,20,'measured');?%?Add?AWGN
t?=?(0:1/fs:((length(txSig)-1)/fs)).';
T?=?t(end)+1/fs;
df?=?1/T;
freq?=?-fs/2:df:fs/2-df;
cos1?=?cos(2*pi*f_carrier1?*?t);
sin1?=?sin(2*pi*f_carrier1?*?t);
x_upconv?=?real(txSig).*?cos1?+?imag(txSig)?.*?sin1;
%%?===?接收端
x_training_wave?=?x_upconv;
x_training_msg?=?msg;
rxSig?=?[x_upconv(300:end)?;?x_upconv];
%?1.?同步
x_resampled?=?resample(rxSig,1,1);
x_sync?=?sync_two_signals(?x_resampled,x_training_wave,0);
figure(2);
plot(freq,20*log10(abs(fftshift(fft(x_sync))/max(abs(fftshift(fft(x_sync)))))));
ylim([-100,10])
xlim([0,freq(end)])
grid?on;
xlabel('頻率(Hz)');
title('接收信號');
%?2.?下變頻?+?匹配濾波
xi_dnconv?=?x_sync?.*?cos1;
xq_dnconv?=?x_sync?.*?sin1;
x_filtered?=?xi_dnconv?+?1j?*?xq_dnconv;
rxFilt?=?upfirdn(x_filtered,?rrcFilter,?1,?sps);
rxFilt?=?rxFilt(span+1:end-span);?%?這是接收端匹配濾波后的信號
%?3.?均衡
%?eq1?=?lineareq(6,?lms(0.01));?%?LMS
eq1?=?lineareq(30,?rls(0.99,0.01));?%?Create?an?equalizer?object.?%?40?taps,RLS算法,步長0.99,自相關矩陣逆矩陣的初值InvCorrInit對角線上的元素
eq1.SigConst?=?step(hMod,(0:M-1)')';?%?Set?signal?constellation.?%?標準星座圖
[symbolest,~]?=?equalize(eq1,rxFilt,x_training_msg(1:trainlen));?%?Equalize.?%?均衡器obj,需要均衡的信號,訓練序列
symbolest?=?symbolest?./?mean(abs(symbolest))?.*?mean(abs(eq1.SigConst));
%?Plot?signals.
h?=?scatterplot(rxFilt,1,trainlen,'bx');?hold?on;
scatterplot(symbolest,1,trainlen,'r.',h);
scatterplot(eq1.SigConst,1,0,'k*',h);
legend('Filtered?signal','Equalized?signal',...
'Ideal?signal?constellation');
hold?off;
%?Compute?error?rates?with?equalization.
hDemod?=?comm.RectangularQAMDemodulator(M);
demodmsg?=?step(hDemod,symbolest);?%?Demodulate?detected?signal?from?equalizer.
%?Create?ErrorRate?Calculator?System?object
serVec?=?step(comm.ErrorRate,msg(trainlen+1:end),demodmsg(trainlen+1:end));
srate?=?serVec(1)
snum?=?serVec(2)
%?Convert?integers?to?bits
hIntToBit?=?comm.IntegerToBit(log2(M));
Tx_bit?=?step(hIntToBit,?msg(trainlen+1:end));
Rx_bit?=?step(hIntToBit,?demodmsg(trainlen+1:end));
%?Calculate?BER
berVec?=?step(comm.ErrorRate,Rx_bit,Tx_bit);
brate?=?berVec(1)
bnum?=?berVec(2)
%%
% 單載波QPSK 接收端
% 2017年5月17日18:02:56
clear;
close all;
clc
rand_seed = 0;
rand('seed',rand_seed);
randn('seed',rand_seed);
%%
% Set up parameters and signals.
M = 4; % Alphabet size for modulation
baud_rate = 100; % Baud rate
f_carrier1 = 75; % Carrier frequency
Nsym = 10000; % Number of symbols
msg = randi([0 M-1],Nsym,1); % Random message
hMod = comm.RectangularQAMModulator(M);
modmsg = step(hMod,msg); % Modulate using QAM. % 映射后的基帶信號
trainlen = 1000; % Length of training sequence
rolloff = .3; % 滾降因子
span = 20 ; % 截斷長度
sps = 10; % Samples per symbol
rrcFilter=rcosdesign(rolloff,span,sps,'sqrt'); %根升余弦滾降濾波器,‘sqrt’均方根升余弦;‘normal’升余弦
fs = baud_rate*sps; % 時間采樣率,時間采樣間隔為 1/fs 秒
Tsymbol=1/baud_rate;
% 2. 脈沖成型
% txSig = upfirdn(modmsg, rrcFilter, sps); % 發送端的基帶復波形信號
% chan = [1; .001];
chan = [.986; .845; .237; .123+.31i]; % Channel coefficients
% chan = [1 0.45 0.3+0.2i]; % Channel coefficients
filtmsg = filter(chan,1,modmsg); % Introduce channel distortion.(已經經過信道的畸變的基帶復信號,星座點)
txSig = upfirdn(filtmsg, rrcFilter, sps); % 發送端的基帶復波形信號
txSig = awgn(txSig,20,'measured'); % Add AWGN
t = (0:1/fs:((length(txSig)-1)/fs)).';
T = t(end)+1/fs;
df = 1/T;
freq = -fs/2:df:fs/2-df;
cos1 = cos(2*pi*f_carrier1 * t);
sin1 = sin(2*pi*f_carrier1 * t);
x_upconv = real(txSig).* cos1 + imag(txSig) .* sin1;
%% === 接收端
x_training_wave = x_upconv;
x_training_msg = msg;
rxSig = [x_upconv(300:end) ; x_upconv];
% 1. 同步
x_resampled = resample(rxSig,1,1);
x_sync = sync_two_signals( x_resampled,x_training_wave,0);
figure(2);
plot(freq,20*log10(abs(fftshift(fft(x_sync))/max(abs(fftshift(fft(x_sync)))))));
ylim([-100,10])
xlim([0,freq(end)])
grid on;
xlabel('頻率(Hz)');
title('接收信號');
% 2. 下變頻 + 匹配濾波
xi_dnconv = x_sync .* cos1;
xq_dnconv = x_sync .* sin1;
x_filtered = xi_dnconv + 1j * xq_dnconv;
rxFilt = upfirdn(x_filtered, rrcFilter, 1, sps);
rxFilt = rxFilt(span+1:end-span); % 這是接收端匹配濾波后的信號
% 3. 均衡
% eq1 = lineareq(6, lms(0.01)); % LMS
eq1 = lineareq(30, rls(0.99,0.01)); % Create an equalizer object. % 40 taps,RLS算法,步長0.99,自相關矩陣逆矩陣的初值InvCorrInit對角線上的元素
eq1.SigConst = step(hMod,(0:M-1)')'; % Set signal constellation. % 標準星座圖
[symbolest,~] = equalize(eq1,rxFilt,x_training_msg(1:trainlen)); % Equalize. % 均衡器obj,需要均衡的信號,訓練序列
symbolest = symbolest ./ mean(abs(symbolest)) .* mean(abs(eq1.SigConst));
% Plot signals.
h = scatterplot(rxFilt,1,trainlen,'bx'); hold on;
scatterplot(symbolest,1,trainlen,'r.',h);
scatterplot(eq1.SigConst,1,0,'k*',h);
legend('Filtered signal','Equalized signal',...
'Ideal signal constellation');
hold off;
% Compute error rates with equalization.
hDemod = comm.RectangularQAMDemodulator(M);
demodmsg = step(hDemod,symbolest); % Demodulate detected signal from equalizer.
% Create ErrorRate Calculator System object
serVec = step(comm.ErrorRate,msg(trainlen+1:end),demodmsg(trainlen+1:end));
srate = serVec(1)
snum = serVec(2)
% Convert integers to bits
hIntToBit = comm.IntegerToBit(log2(M));
Tx_bit = step(hIntToBit, msg(trainlen+1:end));
Rx_bit = step(hIntToBit, demodmsg(trainlen+1:end));
% Calculate BER
berVec = step(comm.ErrorRate,Rx_bit,Tx_bit);
brate = berVec(1)
bnum = berVec(2)
同步的代碼
function?x_sync?=?sync_two_signals(?x_resampled,x_training_wave,idx?)
%?sync_two_signals(?x_resampled,x_training_wave,idx?)
%?x_resampled:收到的信號
%?x_training_wave:用發送的信號
%?idx:要找同步上的第幾段。idx?=?1,2,3,...
[hicorrI,lagsiI]=xcorr(x_resampled,x_training_wave);
[~,offsetindex]=max((hicorrI));
%?offsetindex
for?n?=?2?:?idx
%?figure;plot(lagsiI,abs(hicorrI));
hicorrI(offsetindex)?=?-inf;
[~,offsetindex]=max(hicorrI);
end
%?offsetindex
h=1;
x_sync=x_resampled(lagsiI(offsetindex)+h:lagsiI(offsetindex)+length(x_training_wave)+h-1);
end
function x_sync = sync_two_signals( x_resampled,x_training_wave,idx )
% sync_two_signals( x_resampled,x_training_wave,idx )
% x_resampled:收到的信號
% x_training_wave:用發送的信號
% idx:要找同步上的第幾段。idx = 1,2,3,...
[hicorrI,lagsiI]=xcorr(x_resampled,x_training_wave);
[~,offsetindex]=max((hicorrI));
% offsetindex
for n = 2 : idx
% figure;plot(lagsiI,abs(hicorrI));
hicorrI(offsetindex) = -inf;
[~,offsetindex]=max(hicorrI);
end
% offsetindex
h=1;
x_sync=x_resampled(lagsiI(offsetindex)+h:lagsiI(offsetindex)+length(x_training_wave)+h-1);
end
誤符號率
srate =? 0.0041
錯誤符號數
snum =? 37
誤比特率
brate =? 0.0021 錯誤比特數 bnum =? 38
總結
以上是生活随笔為你收集整理的qpsk matlab仿真,QPSK 调制与解调(Matlab仿真)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梯度算法的matlab程序,基于MATL
- 下一篇: 实验14:访问CMOS RAM显示当前日