用MATLAB编程2ASK信号的调制解调滤波以及误码率随信噪比变化
时间: 2023-12-11 20:04:18 浏览: 87
下面是一个使用MATLAB编写的2ASK信号的调制、解调、滤波以及误码率随信噪比变化的完整示例(注释在代码中):
```matlab
%% 生成二进制数字信号
bits = randi([0 1], 1, 1000); % 生成1000个随机二进制数
%% 将二进制信号转换成2ASK调制信号
A = 1; % 振幅设置为1
t = 0:0.01:length(bits)/100-0.01; % 时间轴
carrier = A*sin(2*pi*10*t); % 10Hz的载波信号
signal = carrier; % 初始化调制信号
for i = 1:length(bits)
if bits(i) == 1
signal((i-1)*100+1:i*100) = A*sin(2*pi*10*t((i-1)*100+1:i*100));
else
signal((i-1)*100+1:i*100) = -A*sin(2*pi*10*t((i-1)*100+1:i*100));
end
end
%% 显示2ASK调制信号
subplot(3, 1, 1);
plot(t, signal);
axis([0 length(bits)/100 -1.5 1.5]);
xlabel('时间(s)');
ylabel('幅度(V)');
title('2ASK调制信号');
%% 添加高斯白噪声
SNR = 0:2:20; % 信噪比从0到20dB
for k = 1:length(SNR)
noise = sqrt(A^2/(2*10^(SNR(k)/10)))*randn(1, length(signal)); % 高斯白噪声
noisy_signal = signal + noise; % 添加噪声
%% 显示含噪声的2ASK调制信号
subplot(3, 5, k+5);
plot(t, noisy_signal);
axis([0 length(bits)/100 -1.5 1.5]);
xlabel('时间(s)');
ylabel('幅度(V)');
title(sprintf('2ASK调制信号(SNR=%d)', SNR(k)));
%% 解调2ASK信号
demod_signal = zeros(1, length(bits)); % 初始化解调信号
for i = 1:length(bits)
if sum(noisy_signal((i-1)*100+1:i*100).*carrier((i-1)*100+1:i*100)) > 0
demod_signal(i) = 1;
else
demod_signal(i) = 0;
end
end
%% 显示解调信号
subplot(3, 5, k+10);
plot(t, demod_signal);
axis([0 length(bits)/100 -0.5 1.5]);
xlabel('时间(s)');
ylabel('幅度(V)');
title(sprintf('解调信号(SNR=%d)', SNR(k)));
%% 低通滤波
b = fir1(20, 0.2); % 20阶低通FIR滤波器,cutoff频率为0.2
filtered_signal = filter(b, 1, demod_signal); % 滤波后的信号
%% 显示滤波后的信号
subplot(3, 5, k+15);
plot(t, filtered_signal);
axis([0 length(bits)/100 -0.5 1.5]);
xlabel('时间(s)');
ylabel('幅度(V)');
title(sprintf('滤波后的信号(SNR=%d)', SNR(k)));
%% 计算误码率
error_bits = sum(xor(bits, filtered_signal)); % 计算错误比特数
error_rate(k) = error_bits/length(bits); % 计算误码率
end
%% 显示误码率随信噪比变化的图像
figure;
semilogy(SNR, error_rate, 'o-');
xlabel('信噪比(dB)');
ylabel('误码率');
title('误码率随信噪比变化');
```
这个示例中,我们通过添加高斯白噪声来模拟信道中的噪声。然后解调2ASK信号,并使用20阶低通FIR滤波器将其滤波。最后,我们计算误码率,并绘制误码率随信噪比变化的图像。
阅读全文