用MATLAB编程实现2DPSK信号的调制解调 实现模块:调制、信道(高斯白噪声)、解调(要求用相干检测+码反变换) 选做:比较码反变换器前后的误码率性能曲线(要求用Ne/N总方式计算,信噪比范围至少-5~20dB)码元速率为18KBaud,载波频率为90KBaud,传输信息的内容:2222037 2000200617 laihengchang
时间: 2023-11-27 13:49:50 浏览: 75
首先,需要生成调制信号,可以采用如下代码实现2DPSK调制:
```matlab
% 设置调制参数
M = 2; % 调制阶数
fc = 90e3; % 载波频率
Rs = 18e3; % 码元速率
fs = 4*fc; % 采样率
t = 0:1/fs:(length(data)/Rs-1/fs); % 时间序列
phi = 0; % 初始相位
% 生成基带信号
data = '2222037 2000200617 laihengchang'; % 待调制的数据
data_bin = dec2bin(data, 8); % 将数据转换为二进制
data_bin = reshape(data_bin', [], 1);
data_bin = data_bin-'0'; % 将二进制数据转换为数字
data_bin = [data_bin; zeros(mod(-length(data_bin), log2(M)), 1)]; % 补齐数据长度
% 将数据映射为符号
symb = bi2de(reshape(data_bin, log2(M), [])', 'left-msb');
% 2DPSK调制
s = sqrt(2*Rsym)*cos(2*pi*fc*t+phi); % I路信号
q = sqrt(2*Rsym)*sin(2*pi*fc*t+phi); % Q路信号
s_mod = s.*cos(2*pi/M*symb) - q.*sin(2*pi/M*symb); % 调制后的I路信号
q_mod = s.*sin(2*pi/M*symb) + q.*cos(2*pi/M*symb); % 调制后的Q路信号
s_mod = s_mod + randn(size(s_mod))*sqrt(N0/2); % 加高斯白噪声
q_mod = q_mod + randn(size(q_mod))*sqrt(N0/2); % 加高斯白噪声
```
接下来,需要实现解调模块。由于我们使用的是相干检测,因此需要提取载波相位,并进行相位恢复。这可以通过如下代码实现:
```matlab
% 提取载波相位
s_rx = s_mod.*cos(2*pi*fc*t) + q_mod.*sin(2*pi*fc*t); % 乘以载波信号
q_rx = -s_mod.*sin(2*pi*fc*t) + q_mod.*cos(2*pi*fc*t); % 乘以90度相位偏移的载波信号
% 相干检测
I_rx = s_rx.*cos(2*pi*fc*t) + q_rx.*sin(2*pi*fc*t); % 相乘
Q_rx = -s_rx.*sin(2*pi*fc*t) + q_rx.*cos(2*pi*fc*t); % 相乘
I_demod = zeros(size(symb)); % 解调后的I路信号
Q_demod = zeros(size(symb)); % 解调后的Q路信号
for i = 1:length(symb)
phi_hat = atan2(Q_rx((i-1)*Ns+1:i*Ns), I_rx((i-1)*Ns+1:i*Ns)); % 提取载波相位
I_demod(i) = cos(phi_hat)*I_rx(i*Ns); % 恢复信号
Q_demod(i) = sin(phi_hat)*Q_rx(i*Ns);
end
% 将解调后的信号映射为数字
symb_demod = de2bi(mod(round((atan2(Q_demod, I_demod)+pi)*M/(2*pi)), M), log2(M), 'left-msb');
data_demod = reshape(symb_demod', [], 1);
data_demod = char(bin2dec(reshape(num2str(data_demod), 8, [])'))';
```
最后,可以使用如下代码计算误码率并绘制性能曲线:
```matlab
Eb = Rsym*log2(M); % 每比特能量
EbN0dB = -5:0.5:20; % 信噪比范围
BER_sim = zeros(size(EbN0dB)); % 模拟误码率
BER_theory = qfunc(sqrt(2*M*10.^(EbN0dB/10))); % 理论误码率
for i = 1:length(EbN0dB)
N0 = Eb/10^(EbN0dB(i)/10); % 噪声功率
symb = randi([0 M-1], size(symb)); % 随机生成符号
symb_mod = exp(1j*2*pi/M*symb); % 调制
symb_rx = symb_mod + randn(size(symb_mod))*sqrt(N0/2); % 加噪声
symb_demod = exp(-1j*angle(symb_rx)); % 解调
BER_sim(i) = sum(abs(symb_demod-symb)>0)/length(symb); % 计算误码率
end
% 绘制性能曲线
figure;
semilogy(EbN0dB, BER_sim, 'o-', 'LineWidth', 2);
hold on;
semilogy(EbN0dB, BER_theory, '-', 'LineWidth', 2);
grid on;
xlabel('Eb/N0 (dB)');
ylabel('BER');
legend('Simulated', 'Theoretical');
```
其中,理论误码率可以使用Q函数计算得到。
阅读全文