利用MATLAB语言实现1. 编程产生周期长度为63的m 序列;(本原多项式为(103):) 2.产生随机发送信息,并分别进行 BPSK 调制; 3. 采用m 序列作为护频码,产生扩频信号发送信号; 4.对护频发送信号加入白噪声,得到接收扩频信号; 5. 对接收信号进行解扩; 6.对接收信号进行 BPSK 解调; 7.通过蒙特卡洛方法,仿真系统误码率,画出误码率曲线。
时间: 2024-03-20 10:43:00 浏览: 80
用MATLAB编写的产生M序列的方法,大家可以看看哈~.zip
好的,我会一步一步地回答你的问题。
1. 产生周期长度为63的m序列
以下是MATLAB代码:
```matlab
m = zeros(1, 63);
m(1) = 1;
m(4) = 1;
m(6) = 1;
m(7) = 1;
m = fliplr(m); % 翻转m序列
poly = [1, 0, 1, 0, 0, 0, 0, 0, 1]; % 本原多项式
for i = 8:63
m(i) = mod(sum(poly .* m(i-7:i-1)), 2);
end
```
2. 产生随机发送信息,并分别进行 BPSK 调制
我们可以使用randi函数来产生随机发送信息,BPSK调制是将二进制0、1分别映射为正负相等的实数值。
以下是MATLAB代码:
```matlab
n = 1000; % 数据长度
data = randi([0 1], 1, n); % 随机产生发送信息
bpsk_data = 2 * data - 1; % BPSK调制
```
3. 采用m序列作为护频码,产生扩频信号发送信号
扩频信号是将发送信号和护频码进行点乘得到的,这里使用m序列作为护频码。
以下是MATLAB代码:
```matlab
spread_data = kron(bpsk_data, m); % 将发送信号和m序列进行点乘
```
4. 对护频发送信号加入白噪声,得到接收扩频信号
为了模拟实际情况,我们需要将发送信号加入一定的白噪声。
以下是MATLAB代码:
```matlab
Eb_No_dB = 10; % 信噪比
Eb_No = 10^(Eb_No_dB/10);
Es_No = Eb_No * log2(2); % 符号能量
N0 = 1 / Es_No; % 噪声功率谱密度
noise = sqrt(N0/2) * randn(1, length(spread_data)); % 产生噪声
received_data = spread_data + noise; % 接收到的扩频信号
```
5. 对接收信号进行解扩
解扩就是将接收到的扩频信号和护频码进行点乘得到发送信号。
以下是MATLAB代码:
```matlab
despread_data = kron(received_data, m); % 将接收到的扩频信号和m序列进行点乘
```
6. 对接收信号进行 BPSK 解调
BPSK解调就是将接收到的数据进行符号判决,将正数判定为1,负数判定为0。
以下是MATLAB代码:
```matlab
bpsk_received_data = despread_data > 0; % 将接收到的数据进行符号判决
```
7. 通过蒙特卡洛方法,仿真系统误码率,画出误码率曲线
我们可以通过蒙特卡洛方法来仿真系统误码率,通过不断模拟随机发送信息,计算接收到的信息与原始信息不同的概率来得到误码率。
以下是MATLAB代码:
```matlab
Eb_No_dB = 0:2:10; % 信噪比范围
ber = zeros(1, length(Eb_No_dB)); % 误码率
for i = 1:length(Eb_No_dB)
Eb_No = 10^(Eb_No_dB(i)/10);
Es_No = Eb_No * log2(2); % 符号能量
N0 = 1 / Es_No; % 噪声功率谱密度
noise = sqrt(N0/2) * randn(1, n*63); % 产生噪声
for j = 1:10000
data = randi([0 1], 1, n);
bpsk_data = 2 * data - 1;
spread_data = kron(bpsk_data, m);
received_data = spread_data + noise;
despread_data = kron(received_data, m);
bpsk_received_data = despread_data > 0;
ber(i) = ber(i) + sum(bpsk_received_data ~= data);
end
ber(i) = ber(i) / (n*63*10000);
end
semilogy(Eb_No_dB, ber); % 画出误码率曲线
xlabel('Eb/No (dB)');
ylabel('BER');
```
希望以上回答对你有帮助!
阅读全文