数字信号的传输方式分为基带传输和带通传输。
用数字基带信号控制载波,把数字基带信号变换为数字带通信号的过程称为数字调制。
数字信息有二进制和多进制之分,数字调制可分为二进制调制和多进制调制。二进制数字调制分为二进制振幅键控、二进制频移键控和二进制相移键控。
二进制振幅键控
2ASK称为通--断键控OOK,载波在二进制基带信号s(t)控制下通--断变化,这种键控又称为通--断键控。2ASK/OOK信号的产生方式通常有:模拟调制法和键控法,一般的模拟幅度调制法,用乘法器实现;数字键控法开关电路受载波控制。
2ASK/OOK信号也有两种基本的解调方法:非相干解调和相干解调。非相干解调使用的是包络检波法,相干解调是同步检测法
input_data = [0,1,0,1,1,1,0,0,0,1];
n = length(input_data);
bit_rate = 1; % 设置比特率
T = 1/bit_rate; % 每个符号的时间长度
t = 0:T/99:T; % 时间向量
% 对输入信号进行2ASK调制
i = 1;
for j = 1:length(input_data)
ask_signal(i:i+99)=input_data(j)*sin(2*pi*t);
i = i + 100;
end
[b,a] = butter(10,1/4);
fdata = filter(b,a,ask_signal);
fdata = abs(fdata); %通过全波整流器
fdata = filter(b,a,fdata);
i = 50;
k = 1;
while i<=length(fdata)
if fdata(i)>=0.5
decode(k) = 1;
else
decode(k)=0;
end
k=k+1;
i=i+100;
end
disp('解调之后的结果为');
decode
上面这种非相干解调方式是先通过带通滤波器,再通过全波整流器,之后是低通滤波器,最后是抽样判决器。
设置判决大于0.5可以非常好的解调出信号,但是0的话就不行,有点疑惑
相移键控
相移键控是组里使用的调制方式,2PSK信号一般可以表示为双极性全占空矩形脉冲序列与一个正弦载波的相乘。发送二进制符号“0”时,e2psk(t)取0相位,发送二进制符号“1”时,e2psk(t)取pi相位。双极性信号是一种数字信号,其特点是一个正的振幅表示一种状态,而一个负的振幅表示另一种状态。具体来说,双极性信号使用正电压表示一个逻辑状态(如“1”),同时使用负电压表示另一个逻辑状态(如“0”),并且通常以接地(零电平)作为判决电平。这种信号的特点是在“1”和“0”等概率出现的情况下,没有直流分量,有利于在信道中传输。接收端恢复信号时,判决电平为零值,因此不受信道特性变化的影响,具有较强的抗干扰能力。
PSK
与2ASK信号的产生方法相比较,只是对s(t)的要求不同,在2ASK中s(t)是单极性的,2PSK中s(t)是双极性的基带信号。
% 定义参数
bit_stream = [1 0 1 1 0 0 1]; % 示例二进制数据序列
fc = 1000; % 载波频率 1 kHz
fs = 8192; % 采样频率 8 kHz
T = 1/fc; % 每个比特的时间长度
samples_per_bit = T*fs; % 每个比特的采样点数
t = 0:1/fs:T-1/fs; % 单个比特的时间向量
bpsk_signal = []; % 初始化BPSK信号向量
% 生成BPSK信号
for i = 1:length(bit_stream)
if bit_stream(i) == 1
bpsk_signal = [bpsk_signal cos(2*pi*fc*t)]; % 位1相位0
else
bpsk_signal = [bpsk_signal cos(2*pi*fc*t+pi)]; % 位0相位π
end
end
% 重新计算总时间向量t2以确保长度与bpsk_signal相同
t2 = 0:1/fs:(length(bpsk_signal)-1)/fs;
% 现在,您可以安全地绘制整个BPSK信号
figure;
plot(t2, bpsk_signal);
title('Binary Phase Shift Keying (BPSK) Signal');
xlabel('Time (s)');
ylabel('Amplitude');
2PSK解调,一般采用的都是相干解调,coswct一般是未调载波信号。2PSK容易出现180°的相位模糊
% 清空环境变量
clear; close all; clc;
% 生成BPSK信号的参数
bit_stream = [1 0 1 1 0 1 0];
sample_rate = 10; % 每个比特的采样数
fc = 1; % 载波频率
fs = fc * sample_rate; % 采样频率
Tb = 1; % 比特时间
t = 0:1/fs:Tb-1/fs; % 时间采样点
carrier = cos(2*pi*fc*t); % 载波
% 生成BPSK信号
bpsk_signal = [];
for bit = bit_stream
if bit == 0
bpsk_signal = [bpsk_signal -carrier];
else
bpsk_signal = [bpsk_signal carrier];
end
end
% 信号通过一个带通滤波器(这里简单模拟,用一个通过所有频率的滤波器代替)
[b, a] = butter(5, 0.2, 'low');
bpsk_filtered = filter(b, a, bpsk_signal);
% BPSK信号通过相乘器(与相同的载波相乘)
t_full = (0:length(bpsk_filtered)-1) / fs;
multiplier_output = bpsk_filtered .* cos(2*pi*fc*t_full);
% 相乘器输出信号通过低通滤波器
lpf_output = filter(b, a, multiplier_output);
% 低通滤波器输出信号通过抽样判决器
sampling_points = sample_rate/2:sample_rate:length(lpf_output);
decision = lpf_output(sampling_points) >= 0;
% 解调结果
disp('解调后的信号:')
disp(decision)
% 绘图
subplot(3,1,1)
plot(bpsk_signal)
title('原始BPSK信号')
xlabel('时间')
ylabel('幅度')
subplot(3,1,2)
plot(multiplier_output)
title('经过带通滤波器和相乘器的信号')
xlabel('时间')
ylabel('幅度')
subplot(3,1,3)
plot(t_full, lpf_output)
hold on
stem(t_full(sampling_points), lpf_output(sampling_points))
title('经过低通滤波器和抽样判决器后的信号')
xlabel('时间')
ylabel('幅度')
hold off
2DPSK
输入的序列是绝对码序列,差分编码规则,相对码是绝对码和相对码前一位的异或,得到相对码之后再按照绝对相位调制进行调制。
生成2DPSK代码,并且解调
% 定义参数
bitStream = [0 1 0 0 1 1 1 0]; % 输入比特流
Ns = 100; % 每个符号的采样数
fc = 2; % 载波频率
fs = Ns*fc; % 采样频率
t = (0:1/fs:1/fc-(1/fs))'; % 时间
% 初始化参数
prevPhase = 0; % 初始相位
dpskSignal = zeros(length(bitStream)*length(t), 1);
index = 1;
% 2DPSK调制
for i = 1:length(bitStream)
if bitStream(i) == 0
phase = prevPhase;
else
phase = prevPhase + pi;
end
dpskSignal(index:(index+length(t)-1)) = cos(2*pi*fc*t + phase);
prevPhase = phase; % 更新相位
index = index + length(t);
end
% 解调
prevPhase = 0;
demodBitStream = zeros(1, length(bitStream));
index = 1;
for i = 1:length(bitStream)
currentPhase = angle(sum(exp(j*2*pi*fc*t).*dpskSignal(index:(index+length(t)-1))));
phaseDiff = currentPhase - prevPhase;
if cos(phaseDiff) > 0
demodBitStream(i) = 0;
else
demodBitStream(i) = 1;
end
prevPhase = currentPhase; % 更新相位
index = index + length(t);
end
% 绘制信号图
figure;
subplot(2,1,1);
plot(dpskSignal);
title('2DPSK调制信号');
xlabel('采样');
ylabel('幅度');
subplot(2,1,2);
stairs([bitStream demodBitStream(1:end)]);
axis([0 length(bitStream)+1 -0.5 1.5]);
title('原始比特流和解调后比特流');
xlabel('比特');
ylabel('值');
legend('原始比特流', '解调后比特流');
% 输出解调的比特流
disp('解调出的比特流:');
disp(demodBitStream);