请用matlab给出存在小数频偏时卫星上行链路系统误码率与吞吐率的仿真结果。要求子载波间隔为15kHz,载波频率偏移为150Hz,上行链路信道为卫星三径莱斯信道,上行带宽为5MHz
时间: 2023-06-24 19:05:12 浏览: 141
为了仿真卫星上行链路系统的误码率(BER)和吞吐率(throughput),我们需要考虑以下几个方面:
1. 频率偏移对系统性能的影响;
2. 信道对系统性能的影响;
3. 信号调制方式和编码方式。
在本次仿真中,我们假设使用QPSK调制方式和卷积码编码方式,信道为卫星三径莱斯信道,仿真时间为10秒,仿真步长为1毫秒。
首先,我们可以通过下面的代码计算出载波频率偏移后每个子载波的实际频率:
```
fc = 2e9; % 载波频率
fs = 15e3; % 子载波间隔
f_offset = 150; % 频率偏移
N_subcarriers = 500; % 子载波数
f = fc + ((-N_subcarriers/2:N_subcarriers/2-1) * fs + f_offset);
```
接下来,我们可以生成QPSK调制的随机比特流,并将其编码成卷积码。为了模拟频率偏移,我们需要将每个子载波上的信号相位进行调整。这可以通过下面的代码实现:
```
M = 2; % QPSK调制
k = log2(M);
n = 1000; % 每个子载波上的符号数
bits = randi([0 1], k*n*N_subcarriers, 1); % 生成随机比特流
coded_bits = convenc(bits, poly2trellis(7,[171 133])); % 卷积码编码
modulated_symbols = qammod(coded_bits, M); % QPSK调制
% 将每个子载波上的信号相位进行调整
for i = 1:N_subcarriers
modulated_symbols((i-1)*n+1:i*n) = modulated_symbols((i-1)*n+1:i*n) .* exp(1j*2*pi*f_offset*i/fs*(1:n));
end
```
接下来,我们可以将调制后的信号通过卫星三径莱斯信道进行传输。为了模拟信道,我们可以使用matlab内置的rayleighchan函数:
```
chan = rayleighchan(1/fs, 10, [0.5 0.8], [0 -3]);
chan.ResetBeforeFiltering = 0;
rx_signal = filter(chan, modulated_symbols);
```
最后,我们可以对接收信号进行解调和解码,并计算误码率和吞吐率:
```
% 对接收信号进行解调
demodulated_symbols = rx_signal .* exp(-1j*2*pi*f_offset*(1:length(rx_signal))/fs);
% 对解调后的信号进行解码
demodulated_bits = qamdemod(demodulated_symbols, M);
decoded_bits = vitdec(demodulated_bits, poly2trellis(7,[171 133]), 5*k*N_subcarriers, 'trunc', 'hard');
% 计算误码率和吞吐率
ber = sum(abs(decoded_bits-bits))/length(bits);
throughput = length(decoded_bits)/(10e6);
```
完整的仿真代码如下:
阅读全文