QPSK通信系统matlab
时间: 2023-12-12 08:34:52 浏览: 23
QPSK通信系统是一种基于相移键控技术的数字通信系统,它可以在有限的频带宽度内传输更多的数据。下面是QPSK通信系统MATLAB的实现方法:
1. 生成随机比特流
```matlab
N = 10000; % 比特流长度
bits = randi([0 1],1,N); % 生成随机比特流
```
2. 将比特流转换为QPSK调制信号
```matlab
M = 4; % QPSK调制方式
k = log2(M); % 每个符号的比特数
symbols = bi2de(reshape(bits,k,length(bits)/k).','left-msb'); % 将比特流分组并转换为十进制符号
qpskMod = comm.QPSKModulator('BitInput',true); % 创建QPSK调制器对象
modSignal = qpskMod(symbols.'); % 调制信号
```
3. 添加高斯白噪声
```matlab
EbNo = 10; % 信噪比
snr = EbNo + 10*log10(k) - 10*log10(qpskMod.BitInput.MessageLength); % 将信噪比转换为信噪比比特
noisySignal = awgn(modSignal,snr,'measured'); % 添加高斯白噪声
```
4. 将QPSK调制信号解调回比特流
```matlab
qpskDemod = comm.QPSKDemodulator('BitOutput',true); % 创建QPSK解调器对象
demodSignal = qpskDemod(noisySignal); % 解调信号
rxBits = de2bi(demodSignal.','left-msb').'; % 将解调后的符号转换为比特流
rxBits = rxBits(:).'; % 将比特流展开为行向量
```
5. 计算误码率
```matlab
numErrs = sum(rxBits ~= bits); % 计算比特流中不一致的比特数
ber = numErrs/N; % 计算误码率
```
6. 画出系统误码率与接收端信噪比SNR的关系
```matlab
EbNoVec = 0:2:16; % 信噪比范围
berVec = zeros(size(EbNoVec)); % 初始化误码率向量
for n = 1:length(EbNoVec)
snr = EbNoVec(n) + 10*log10(k) - 10*log10(qpskMod.BitInput.MessageLength); % 将信噪比转换为信噪比比特
noisySignal = awgn(modSignal,snr,'measured'); % 添加高斯白噪声
demodSignal = qpskDemod(noisySignal); % 解调信号
rxBits = de2bi(demodSignal.','left-msb').'; % 将解调后的符号转换为比特流
rxBits = rxBits(:).'; % 将比特流展开为行向量
numErrs = sum(rxBits ~= bits); % 计算比特流中不一致的比特数
berVec(n) = numErrs/N; % 计算误码率
end
semilogy(EbNoVec,berVec,'*-'); % 画出误码率曲线
xlabel('Eb/No (dB)'); ylabel('BER'); grid on;
```
7. 分析多径延时大小对系统性能的影响
```matlab
delayVector = [0 1 2 3 4 5]; % 多径延时向量
chan = rayleighchan(1/1000,30,delayVector,[0 -3 -5 -7 -9 -11],delayVector*0); % 创建瑞利信道对象
chan.StoreHistory = true; % 保存信道状态信息
txSignal = modSignal; % 发送信号
rxSignal = filter(chan,txSignal); % 接收信号
rxSignal = rxSignal(1:length(txSignal)); % 去除信道延迟
for n = 1:length(delayVector)
demodSignal = qpskDemod(rxSignal(:,n)); % 解调信号
rxBits = de2bi(demodSignal.','left-msb').'; % 将解调后的符号转换为比特流
rxBits = rxBits(:).'; % 将比特流展开为行向量
numErrs(n) = sum(rxBits ~= bits); % 计算比特流中不一致的比特数
end
berVec = numErrs/N; % 计算误码率
plot(delayVector,berVec,'*-'); % 画出误码率曲线
xlabel('Delay (symbols)'); ylabel('BER'); grid on;
```